Próbuję napisać fragment kodu, który zajmie parser ANTLR4 i użyje go do wygenerowania AST dla wejść podobnych do tych podanych w opcji -tree na grun (misc.TestRig
). Jednak chciałbym dodatkowo, aby dane wyjściowe zawierały wszystkie informacje o liczbie linii/przesunięciu.Jak ładować wydruki i numery linii za pomocą ANTLR4?
Na przykład, zamiast drukować
(add (int 5) '+' (int 6))
Chciałbym dostać
(add (int 5 [line 3, offset 6:7]) '+' (int 6 [line 3, offset 8:9]) [line 3, offset 5:10])
lub coś podobnego.
Jeszcze nie ma ogromnej liczby przykładów odwiedzin dla ANTLR4, ale jestem prawie pewien, że mogę zrobić większość tego poprzez skopiowanie domyślnej implementacji dla toStringTree
(używanej przez grun). Jednak nie widzę żadnych informacji na temat numerów linii lub przesunięć.
Spodziewałem się, aby móc napisać bardzo prosty kod tak:
String visit(ParseTree t) {
return "(" + t.productionName + t.visitChildren() + t.lineNumber + ")";
}
ale nie wydaje się to proste. Zgaduję, że powinienem być w stanie uzyskać informacje o numerze linii z analizatora składni, ale nie mam pojęcia, jak to zrobić. W jaki sposób mogę pobrać informacje o numerze linii/przesunięciu w trakcie mojej traversal?
wypełnienie kilku wykrojów w poniższej rozwiązania użyłem:
List<String> ruleNames = Arrays.asList(parser.getRuleNames());
parser.setBuildParseTree(true);
ParserRuleContext prc = parser.program();
ParseTree tree = prc;
uzyskać tree
i ruleNames
. program
to nazwa najwyższej produkcji w mojej gramatyce.
Istnieją 2 ' metody toStringTree'. Jeden pobiera instancję typu "Parser", ale drugi po prostu bierze "Listę" nazw reguł. –
@ 280Z28: Podajesz prawdziwy fakt. Wywołanie 'toStringTree' za pomocą argumentu parser powoduje, że implementacja pobiera listę reguł (' recog.getRuleNames() ') i przekazuje ją do' toStringTree', który pobiera 'List'. W każdym razie to nadal nie wyjaśnia, jak uzyskać informacje o numerze linii/przesunięciu podczas pisania odwiedzającego. –