为什么antlr 4没有像预期的那样打破我的代币?

时间:2016-03-31 19:02:48

标签: intellij-idea antlr antlr4

所以我对ANTLR 4很新。我尽可能地删除了语法以显示问题:

grammar DumbGrammar;

equation
   : expression (AND expression)*
   ;

expression
   : ID
   ;


ID : LETTER(LETTER|DIGIT)* ;

AND: 'and';

LETTER: [a-zA-Z_];
DIGIT    : [0-9];
WS : [ \r\n\t] + -> channel (HIDDEN);

如果使用这个语法,并使用示例文本:abc and d我得到一个奇怪的树,结构如意图所示(使用IntelliJ和ANTLR4插件):

enter image description here

如果我只是将终结规则AND: 'and';更改为AND: '&&';,然后提交abc && d作为输入,我会按预期获得以下树:

enter image description here

我无法弄清楚为什么它没有正确解析"and",而是正确解析'&&'

1 个答案:

答案 0 :(得分:3)

输入"and"被标记为ID令牌。由于IDAND都匹配输入"and",因此ANTLR需要决定选择哪个令牌。它需要ID,因为它是在AND之前定义的。

解决方案:在AND之前定义ID

AND: 'and';

ID : LETTER(LETTER|DIGIT)* ;