ANTLR - 具有空格的标识符

时间:2011-07-27 16:33:03

标签: antlr whitespace 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();}
;

当我用“IF语句分析”测试时,我得到一个MissingTokenException和输出“IF语句已分析”。
我想,通过使用greedy = false,我可以告诉ANTLR退出'IF'并将其作为令牌。但相反,IF是ID的一部分。 有没有办法实现我的目标?我已经尝试过greed = false-option的一些变体,但没有成功。

1 个答案:

答案 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解析为以下树:

enter image description here