我一直在攻击我的ANTLR4语法,试图消除它的所有含糊之处,一次是lexer规则错误。我似乎没有做任何事情来解决问题。特别是这些lexer规则给出了同样的错误如下:
Identifier: Letter (Letter | Digit | Und)+;
Keyword : Letter+;
Param: Number | Identifier;
Statement: Keyword Lpr Param+ Rpr;
Block: Lbc Statement+ Rbc;
您可能已经注意到,他们都有一个共同点是 Letter 。此标记和其他标记定义为:
fragment Digit: '0'..'9';
fragment Letter: ('A'..'Z');
Und: '_';
Lpr: '(';
Rpr: ')';
除非ANTLR不允许多重定义并且可能产生相同的结果,否则我无法找到这可能导致歧义的原因。
答案 0 :(得分:0)
ANTLR(真的)只与明确的语法一起使用。允许某些左递归,谓词和词法模式可用于处理/避免歧义。
然而,ANTLR allow for multiple definition with potentially identical outcomes
。
通过始终选择第一个这样的冲突规则来实现这一点。其余的冲突规则被遮蔽,这意味着出于所有实际目的,它们不存在。几乎可以肯定,这是一个非常不理想的结果。