antlr4 不匹配的输入 'a' 期待 NAME

antlr4 mismatched input 'a' expecting NAME

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

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>

我已经尝试了很多方法,但是 none 其中 work.Can 有人可以帮助我吗?

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

所以您可以通过将 LETTER 规则移到规则一词之后来解决您的问题,但是由于您实际上不想在任何情况下生成 LETTER 标记,因此更好的解决方案是通过将规则标记为 fragment.

来告诉 ANTLR