我想要可以包含空格的标识符。
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();}
;
当我用“IF语句分析”测试时,我得到一个MissingTokenException和输出“IF语句已分析”。
我想,通过使用greedy = false,我可以告诉ANTLR退出'IF'并将其作为令牌。但相反,IF是ID的一部分。
有没有办法实现我的目标?我已经尝试过greed = false-option的一些变体,但没有成功。
答案 0 :(得分:5)
我想,通过使用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();}
;
会将输入IF statement analyzed THEN
解析为以下树: