ANTLR4缺少规则定义

问题描述:

我一直在剽窃我的ANTLR4语法,试图消除所有歧义,一次解决词法分析规则错误。我似乎没有做任何事情来解决问题。特别为这些词法规则,给我同样的错误如下:ANTLR4缺少规则定义

Identifier: Letter (Letter | Digit | Und)+; 
Keyword : Letter+; 
Param: Number | Identifier; 
Statement: Keyword Lpr Param+ Rpr; 
Block: Lbc Statement+ Rbc; 

正如你可能已经注意到,一个令牌他们的共同点是都信。这和其他标记被定义为:

fragment Digit: '0'..'9'; 
fragment Letter: ('A'..'Z'); 
Und: '_'; 
Lpr: '('; 
Rpr: ')'; 

我怎么也找不到这可能引起歧义,除非ANTLR不允许有可能的结果相同多个定义。

ANTLR只有(真的)与明确的语法一起工作。某些左递归是允许的,并且谓词和词法分析器模式可用于处理/避免歧义。

ANTLR将会,但是,allow for multiple definition with potentially identical outcomes

它通过选择第一个这样的冲突规则来做到这一点。其余的冲突规则是阴影的,这意味着对于所有实际目的而言,它们都不存在。几乎可以肯定的是,一个非常不理想的结果。

+0

谢谢你为我清理。不幸的是,这意味着我最初的问题仍然存在什么可能导致所有这些规则抛出同样的错误? –

+0

最终依赖于'Keyword'的所有规则都会被完全隐藏,并且会失败并显示相同的错误('Number'似乎没有被定义)。只是切换“标识符”和“关键字”的顺序将不起作用(所有只包含字母的标识符将作为关键字使用)。通常情况下,关键字将被显式指定,然后是catchall规则,例如“标识符”规则;这意味着任何没有明确指定为关键字的“Letter +”都是标识符。 – GRosenberg

+0

我现在明白了。问题是我试图定义一个允许定义其他关键字的语法(关键字基本上就是函数名),所以我试图只在词法分析器中定义语法并在解析器中定义语义。 –