所以我对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插件):
如果我只是将终结规则AND: 'and';
更改为AND: '&&';
,然后提交abc && d
作为输入,我会按预期获得以下树:
我无法弄清楚为什么它没有正确解析"and"
,而是正确解析'&&'
。
答案 0 :(得分:3)
输入"and"
被标记为ID
令牌。由于ID
和AND
都匹配输入"and"
,因此ANTLR需要决定选择哪个令牌。它需要ID
,因为它是在AND
之前定义的。
解决方案:在AND
之前定义ID
:
AND: 'and';
ID : LETTER(LETTER|DIGIT)* ;