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

时间:2015-04-03 23:56:08

标签: java parsing antlr4

简短版本:

我正在使用

parser.addErrorListener(new DiagnosticErrorListener());
parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION);

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

长版:

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

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

1 个答案:

答案 0 :(得分:1)

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

for (ANTLRErrorListener listener : parser.getErrorListeners()) {
        System.out.println(listener);
}