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

Java 如何诊断ANTLR4语法中的歧义?,java,parsing,antlr4,Java,Parsing,Antlr4,简短版本: 我正在使用 parser.addErrorListener(new DiagnosticErrorListener()); parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION); 但是,当我运行解析器时,我没有看到任何像ANTLR4书所示的“ReportDumbility…”影响的输出。我怎样才能看到语法中的歧义 长版本: 在8核2.67ghz Xeon E5640机器上

简短版本:

我正在使用

parser.addErrorListener(new DiagnosticErrorListener());
parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION);
但是,当我运行解析器时,我没有看到任何像ANTLR4书所示的“ReportDumbility…”影响的输出。我怎样才能看到语法中的歧义

长版本:

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


问题是我希望所有(或大部分)的SLL都能成功。我想我需要消除语法中的歧义才能做到这一点。我想让ANTLR4告诉我任何歧义,以便我可以解决它们。

当我用
parser.removeErrorListener()删除
ConsoleErrorListener
时,我也面临同样的问题。您可以使用下面的代码检查您的侦听器

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

删除我的评论。我觉得这个问题很难解决,如果没有具体的语法,你有吗?