antlr4输入的“ a”与期望名称不匹配

时间:2019-03-19 10:33:10

标签: java antlr4

我简化了发生错误的代码:

grammar simperr;
var
  : VAR_IDS NAME EQU NAME SPLIT
  ;
VAR_IDS : ('var'|'let')+;
LETTER : [a-zA-Z$_];
NUM : [0-9];
NAME : LETTER (LETTER|NUM)*;
EQU : '=';
SPLIT : ';';
WS : [ \t\n\r]+ -> skip;

我明白了:

var a=ijf;
enter   var, LT(1)=var
consume [@0,0:2='var',<1>,1:0] rule var
line 1:4 mismatched input 'a' expecting NAME
exit    var, LT(1)=<EOF>

我已经尝试了很多方法,但是没有一种可以用。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果您为输入打印令牌流(通过将-tokens作为grun的参数添加),则会看到a被识别为{{1} },而不是LETTER。发生这种情况是因为WORDLETTER都产生了相同长度的匹配项(即都匹配WORD),并且a在语法中排在首位(这称为最大值)规则)。

因此,您可以通过将LETTER规则移到“规则”一词之后来解决问题,但是由于您实际上从来不想在任何情况下都产生LETTER令牌,因此更好的解决方案是告诉ANTLR通过将规则标记为LETTER