我正在使用antlr4 python,并使用这个简单的gammar遇到一些奇怪的东西
emptytest : (COMMA | empty empty nonempty) EOF ;
empty : SEMICOLON* ;
nonempty : DOT+ ;
DOT : '.' ;
SEMICOLON : ';' ;
COMMA : ',' ;
输入' ...',我收到了错误消息 第1:0行不匹配的输入'。'期待{&#39 ;;',','}
但是,如果我放弃一个“空”,或者“放弃”COMMA |'从规则来看,没有错误。
我想知道为什么输入' ...'不能被解释为空(='')为空(='')非空(=' ...')?
感谢任何线索。
答案 0 :(得分:0)
您的语法含糊不清 - 对于输入;.
,分号可以匹配为第一个empty
或第二个empty
。
在这种情况下,ANTLR试图通过忽略一些替代方案来解决歧义。在这种情况下,它似乎通过忽略empty
不包含SEMICOLON
(即实际为空)的可能性来解决模糊性。这适用于empty
规则的所有使用,因此.
不被视为有效输入。
需要注意的是,如果你的语法含糊不清,你就不能指望解析器表现得很好。如果遇到问题,ANTLR会警告你有歧义(在版本3中它会在解析器生成过程中警告你,不确定v4)。