Wie drucke ich Produktionen und Zeilennummern mit ANTLR4?

8

Ich versuche, einen Code zu schreiben, der einen ANTLR4-Parser verwendet und damit ASTs für Eingaben erzeugt, die denen der Option -tree in grun ( misc.TestRig ) ähneln. Ich möchte aber zusätzlich, dass die Ausgabe alle Zeilennummern / Offset-Informationen enthält.

Zum Beispiel, anstatt

zu drucken %Vor%

Ich würde gerne

bekommen %Vor%

Oder etwas ähnliches.

Es gibt noch keine große Anzahl an Besucher-Beispielen für ANTLR4, aber ich bin ziemlich sicher, dass ich das meiste machen kann, indem ich die Standard-Implementierung für toStringTree (von grun verwendet) kopiere. Ich sehe jedoch keine Informationen über die Zeilennummern oder Offsets.

Ich habe erwartet, dass ich in der Lage bin, super einfachen Code wie folgt zu schreiben:

%Vor%

Aber es scheint nicht so einfach zu sein. Ich schätze, ich sollte Zeilennummerninformationen vom Parser bekommen können, aber ich habe nicht herausgefunden, wie das geht. Wie kann ich diese Zeilennummer / Offset-Informationen in meine Traversal greifen?

Um die wenigen Lücken in der folgenden Lösung auszufüllen, habe ich verwendet:

%Vor%

, um tree und ruleNames zu erhalten. program ist der Name für die Top-Produktion in meiner Grammatik.

    
Chucky Ellison 13.10.2013, 21:52
quelle

1 Antwort

12

Die Methode Trees.toStringTree kann mit ParseTreeListener implementiert werden. Der folgende Listener erzeugt genau die gleiche Ausgabe wie Trees.toStringTree .

%Vor%

Die Klasse kann wie folgt verwendet werden:

%Vor%

Die Klasse kann geändert werden, um die Informationen in Ihrer Ausgabe zu erzeugen, indem Sie die Methode exitEveryRule aktualisieren:

%Vor%     
Sam Harwell 14.10.2013, 03:36
quelle