短版本:
我正在使用
parser.addErrorListener(new DiagnosticErrorListener());
parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION);
但当我运行解析器时,我看不到任何受"reportAmbiguity…"影响的输出正如ANTLR4的书所示。我怎样才能看出我语法中的歧义?
长版本:
我目前在8核2.67ghz Xeon E5640机器上使用ANTLR4获得的解析速度约为90kb/s。弯曲速度大约是5mb/s,所以这很好。在尝试优化我的解析器时,我发现了两个阶段的解析,第一阶段使用PredictionMode.SLL进行解析,如果失败,则第二阶段使用PrejectionMode.LL。使用这两种模式是有效的,我发现SLL的一些输入比LL的输入成功的时间更短。
问题是,我希望所有人(或大多数人)都能在SLL方面取得成功。我想我需要消除语法中的歧义才能做到这一点。我希望ANTLR4能告诉我任何模棱两可的地方,这样我就可以解决它们。
当我用parser.removeErrorListener();
删除ConsoleErrorListener
时,我也遇到了同样的问题。你可以用下面的代码来检查你的听众
for (ANTLRErrorListener listener : parser.getErrorListeners()) {
System.out.println(listener);
}