Sto provando a scrivere un codice che utilizzi un parser ANTLR4 e lo utilizzi per generare AST per input simili a quelli forniti dall'opzione -tree su grun (misc.TestRig
). Tuttavia, mi piacerebbe anche che l'output includesse tutte le informazioni sul numero di riga/offset.In che modo posso stampare prodotti e numeri di riga, usando ANTLR4?
Per esempio, invece di stampare
(add (int 5) '+' (int 6))
Mi piacerebbe ottenere
(add (int 5 [line 3, offset 6:7]) '+' (int 6 [line 3, offset 8:9]) [line 3, offset 5:10])
o qualcosa di simile.
Non c'è ancora un numero enorme di esempi di visitatori per ANTLR4, ma sono abbastanza sicuro di poter fare la maggior parte di ciò copiando l'implementazione predefinita per toStringTree
(usata da grun). Tuttavia, non vedo alcuna informazione sui numeri di linea o sugli offset.
mi aspettavo di essere in grado di scrivere il codice super semplice come questo:
String visit(ParseTree t) {
return "(" + t.productionName + t.visitChildren() + t.lineNumber + ")";
}
ma non sembra essere questo semplice. Immagino che dovrei essere in grado di ottenere informazioni sul numero di riga dal parser, ma non ho capito come farlo. Come posso afferrare questo numero di linea/le informazioni di offset nella mia traversa?
per riempire gli spazi vuoti pochi nella soluzione qui di seguito, ho usato:
List<String> ruleNames = Arrays.asList(parser.getRuleNames());
parser.setBuildParseTree(true);
ParserRuleContext prc = parser.program();
ParseTree tree = prc;
per ottenere il tree
e ruleNames
. program
è il nome per la migliore produzione nella mia grammatica.
Ci sono 2 ' metodi toStringTree'. Si prende un'istanza di 'Parser', ma l'altra prende semplicemente un' Elenco 'di nomi di regole. –
@ 280Z28: dichiari un fatto reale. Chiamando 'toStringTree' con un argomento parser, l'implementazione prende l'elenco delle regole (' recog.getRuleNames() ') e lo passa al' toStringTree' che accetta un 'List'. In ogni caso, questo non spiega ancora come ottenere il numero di linea/le informazioni di offset durante la scrittura di un visitatore. –