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.
Die Methode Trees.toStringTree
kann mit ParseTreeListener
implementiert werden. Der folgende Listener erzeugt genau die gleiche Ausgabe wie Trees.toStringTree
.
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:
Tags und Links pretty-print abstract-syntax-tree antlr4