具有空可能非终结符的Antlr错误在替代方案中出现两次

时间:2017-10-09 19:12:04

标签: python antlr grammar

我正在使用antlr4 python,并使用这个简单的gammar遇到一些奇怪的东西

emptytest   : (COMMA | empty empty nonempty) EOF ;
empty       : SEMICOLON* ;
nonempty    : DOT+ ;
DOT         : '.' ;
SEMICOLON   : ';' ;
COMMA       : ',' ;

输入' ...',我收到了错误消息     第1:0行不匹配的输入'。'期待{&#39 ;;',','}

但是,如果我放弃一个“空”,或者“放弃”COMMA |'从规则来看,没有错误。

我想知道为什么输入' ...'不能被解释为空(='')为空(='')非空(=' ...')?

感谢任何线索。

1 个答案:

答案 0 :(得分:0)

您的语法含糊不清 - 对于输入;.,分号可以匹配为第一个empty或第二个empty

在这种情况下,ANTLR试图通过忽略一些替代方案来解决歧义。在这种情况下,它似乎通过忽略empty不包含SEMICOLON(即实际为空)的可能性来解决模糊性。这适用于empty规则的所有使用,因此.不被视为有效输入。

需要注意的是,如果你的语法含糊不清,你就不能指望解析器表现得很好。如果遇到问题,ANTLR会警告你有歧义(在版本3中它会在解析器生成过程中警告你,不确定v4)。