ANTLR - 具有空格的标识符

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的一些变体,但没有成功.

Bar*_*ers 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();}
  ;
Run Code Online (Sandbox Code Playgroud)

将输入解析IF statement analyzed THEN为以下树:

在此输入图像描述