2015-04-03 33 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); 
}