2015-04-03 4 views
5

Kurzversion:Wie erkenne ich Mehrdeutigkeiten in meiner ANTLR4-Grammatik?

Ich bin mit

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

Aber wenn ich meine Parser betreibe ich sehe keinen Ausgang auf die Auswirkungen von ‚reportAmbiguity ...‘, wie die ANTLR4 Buch zeigt. Wie kann ich Unklarheiten in meiner Grammatik erkennen?

Lange Version:

Die Parsen Geschwindigkeit I mit ANTLR4 erhalten derzeit rund 90kb/s auf einer 8-Core 2.67GHz Xeon E5640 Maschine. Die lexing Geschwindigkeit ist ungefähr 5mb/s, also ist das in Ordnung. Während ich versuchte, meinen Parser zu optimieren, entdeckte ich zweistufiges Parsing, wobei die erste Stufe mit PredictionMode.SLL analysiert und falls dies fehlschlägt, dann verwendet die zweite Stufe PredictionMode.LL. Die Verwendung dieser beiden Modi funktioniert, und ich sehe, dass einige Eingaben mit SLL in kürzerer Zeit gelingen als mit LL.

Das Problem ist, ich möchte alle (oder die meisten) mit SLL gelingen. Ich nehme an, dass ich Mehrdeutigkeiten aus meiner Grammatik entfernen muss, um dies zu erreichen. Ich möchte, dass ANTLR4 mir von irgendwelchen Unklarheiten erzählt, damit ich sie lösen kann.

+0

Entfernen Sie meinen Kommentar. Es scheint, dass es nicht sorgfältig genug gemacht wurde. –

+0

Ich denke, diese Frage ist schwer zu lösen, ohne eine Grammatik zu haben, hast du eine? – CoronA

Antwort

1

Ich hatte dasselbe Problem, als ich ConsoleErrorListener mit parser.removeErrorListener(); entfernte. Sie können Ihre Zuhörer mit folgendem Code überprüfen:

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