Luk*_*nia 2 whitespace antlr identifier
我想要可以包含空格的标识符.
grammar WhitespaceInSymbols;
premise : ( options {greedy=false;} : 'IF' ) id=ID{
System.out.println($id.text);
};
ID : ('a'..'z'|'A'..'Z')+ (' '('a'..'z'|'A'..'Z')+)*
;
WS : ' '+ {skip();}
;
Run Code Online (Sandbox Code Playgroud)
当我用"IF语句分析"测试时,我得到一个MissingTokenException和输出"IF语句分析".
我想,通过使用greedy = false,我可以告诉ANTLR退出'IF'并将其作为令牌.但相反,IF是ID的一部分.有没有办法实现我的目标?我已经尝试过greed = false-option的一些变体,但没有成功.
我想,通过使用greedy = false,我可以告诉ANTLR退出'IF'并将其作为令牌.
不,解析器对令牌的创建没有任何意义:输入首先被标记化,然后解析器规则应用于这些令牌.因此设置greedy=false无效.
你可以这样做(ID用白色空格创建令牌),但是这将是一个带有许多谓词的可怕解决方案,并且词法分析器中的一些自定义方法在进行手动预测:你真的,真的不想要这个!更清晰的解决方案是id在解析器中引入规则,并使其与一个或多个ID令牌匹配.
grammar WhitespaceInSymbols;
premise
: IF id THEN EOF
;
id
: ID+
;
IF
: 'IF'
;
THEN
: 'THEN'
;
ID
: ('a'..'z' | 'A'..'Z')+
;
WS
: ' '+ {skip();}
;
Run Code Online (Sandbox Code Playgroud)
将输入解析IF statement analyzed THEN为以下树:
