ANTLR4不报告歧义

ANTLR4不报告歧义,antlr4,Antlr4,鉴于以下语法: grammar ReportAmbiguity; unit : statements+; statements : callStatement+ // '.' // <- uncomment this line ; callStatement : 'CALL' ID (argsByRef | argsByVal)*; argsByRef : ('BY' 'REF')? ID+; argsByVal : 'B

鉴于以下语法:

grammar ReportAmbiguity;

unit : statements+;

statements : 
        callStatement+
        // '.'         // <- uncomment this line
    ;

callStatement : 'CALL' ID (argsByRef | argsByVal)*;

argsByRef : ('BY' 'REF')? ID+;

argsByVal : 'BY' 'VAL' ID+;

ID : ('A'..'Z')+;

WS : (' '|'\n')+ -> channel(HIDDEN);
解析器正确地输出树:
(callStatement调用函数(argsByVal BY VAL A B))

现在考虑不注释上面所示的行(第七)。再次测试一切

解析器仍然输出相同的树,但是歧义报告消失了为什么不再报告这种输入模棱两可的明显模棱两可的语法?

(这是一个更大问题的一部分。我正在努力理解这一点,以便我能确定我的语法中可能存在的另一个问题。)

编辑1

使用antlr4版本4.6

我已经在github中准备了一个pet项目:(在模块
g
中,键入
mvn clean test-Dtest=br.eti.rslemos.petgrammars.ReportDumbuityUnitTest
以测试注释版本;取消注释第7行并再次运行以查看失败)

编辑2

更改<代码>单位:语句*至<代码>单位:语句+。这个改变本身并没有改变原来的问题。它只允许其他体验(后续版本待定)

编辑3

触发此错误的另一种方法是更改
unit:statements+至<代码>单位:报表+单位

与在
语句中添加
时一样,此更改也会使antlr4放弃歧义检测

我认为这可能与
argsByVal
之后可能出现的
EOF
有关

第一个备选方案(将
'。
附加到
语句
)阻止
EOF
出现在
argsByVal
之后

第二个(将
unit
附加到自身)使其成为一个非根规则(似乎antlr将
EOF
隐式附加到每个根规则)

我一直认为antlr4规则应该以我们喜欢的方式被调用,没有任何规则被特殊处理,根规则之所以被称为根规则,是因为我们(语法作者)知道哪个规则是根

编辑4

可能与……有关

line 1:24 reportAttemptingFullContext d=6 (argsByVal), input='B'
line 1:24 reportAmbiguity d=6 (argsByVal): ambigAlts={1, 2}, input='B'