Ich versuche, ein Stück Code zu schreiben, der einen ANTLR4-Parser verwendet und ihn verwendet, um ASTs für Eingaben zu erzeugen, die denen der Option -tree auf grun (misc.TestRig
) ähneln. Ich möchte aber zusätzlich, dass die Ausgabe alle Zeilennummern/Offset-Informationen enthält.Wie drucke ich Produktionen und Zeilennummern mit ANTLR4?
Zum Beispiel, anstatt zu drucken
(add (int 5) '+' (int 6))
Ich möchte
(add (int 5 [line 3, offset 6:7]) '+' (int 6 [line 3, offset 8:9]) [line 3, offset 5:10])
Oder etwas Ähnliches bekommen.
Es gibt noch keine große Anzahl von Besucher-Beispielen für ANTLR4, aber ich bin ziemlich sicher, dass ich das meiste durch Kopieren der Standardimplementierung für toStringTree
(von grun verwendet) machen kann. Ich sehe jedoch keine Informationen über die Zeilennummern oder Offsets.
ich voraussichtlich in der Lage sein super einfach Code wie folgt zu schreiben:
String visit(ParseTree t) {
return "(" + t.productionName + t.visitChildren() + t.lineNumber + ")";
}
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-Information in meinem Traversal erfassen?
in den wenigen Rohlinge in der Lösung unter zu füllen, habe ich:
List<String> ruleNames = Arrays.asList(parser.getRuleNames());
parser.setBuildParseTree(true);
ParserRuleContext prc = parser.program();
ParseTree tree = prc;
die tree
und die ruleNames
zu bekommen. program
ist der Name für die Top-Produktion in meiner Grammatik.
Es gibt 2 ' toStringTree' Methoden. Man nimmt eine "Parser" -Instanz, aber die andere nimmt nur eine "Liste" von Regelnamen. –
@ 280Z28: Sie geben eine wahre Tatsache an. Der Aufruf von 'toStringTree' mit einem Parser-Argument bewirkt, dass die Implementierung die Liste der Regeln (' recog.getRuleNames() ') ergreift und an den' toStringTree' übergibt, der eine 'List' übernimmt. Auf jeden Fall erklärt dies noch nicht, wie man beim Schreiben eines Besuchers auf die Zeilennummer/Offset-Information kommt. –