2015-04-03 80 views
5

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

我使用

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

但是当我跑我的解析器我没有看到任何输出的影响“reportAmbiguity ......”作为ANTLR4书所示。我怎么能看到我的语法中的歧义?

龙版本:

的解析速度我目前正与ANTLR4获得约90KB/s的8核心至强2.67ghz机E5640上。 Lexin速度约为5mb/s,所以很好。在尝试优化解析器时,我发现了两个阶段解析,第一阶段使用PredictionMode.SLL解析,如果失败,则第二阶段使用PredictionMode.LL。使用这两种模式很有效,而且我看到一些输入在SLL中获得的成功时间比在LL所用的时间要少。

问题是我希望所有(或大多数)SLL成功。我想我需要从我的语法中删除含糊不清的词来实现这一点。我想ANTLR4告诉我任何含糊之处,以便我可以解决它们。

+0

删除我的评论。它似乎没有足够小心。 – 2015-04-04 16:23:16

+0

我想这个问题很难解决,没有一个混凝土语法,你有吗? – CoronA 2015-04-11 11:13:10

回答

1

当我用parser.removeErrorListener();删除ConsoleErrorListener时,我面临同样的问题。你可以检查你的听众与代码波纹管

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