如何诊断ANTLR4语法中的歧义?

jon*_*onr 5 java parsing antlr4

精简版:

我在用

parser.addErrorListener(new DiagnosticErrorListener());
parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION);
Run Code Online (Sandbox Code Playgroud)

但是当我运行我的解析器时,我没有看到任何输出到'reportAmbiguity ...'的影响,正如ANTLR4书中所示.我怎么能在语法中看到歧义?

长版:

在8核2.67ghz Xeon E5640机器上,我目前使用ANTLR4获得的解析速度约为90kb/s.lexing速度约为5mb/s,所以很好.在尝试优化我的解析器时,我发现了两个阶段解析,其中第一个阶段使用PredictionMode.SLL进行解析,如果失败,则第二个阶段使用PredictionMode.LL.使用这两种模式是有效的,我看到一些输入使用SLL成功的时间比LL使用的时间短.

问题是我希望所有(或大多数)成功使用SLL.我假设我需要从语法中消除歧义来实现这一目标.我想ANTLR4告诉我任何含糊之处,以便我可以解决它们.

小智 1

ConsoleErrorListener当我删除时,我遇到了同样的问题parser.removeErrorListener();。您可以使用下面的代码检查您的听众

for (ANTLRErrorListener listener : parser.getErrorListeners()) {
        System.out.println(listener);
}
Run Code Online (Sandbox Code Playgroud)