如何诊断ANTLR4语法中的歧义



短版本:

我正在使用

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);
}

相关内容

  • 没有找到相关文章

最新更新