Wenn die Parser-Regel a
enthält einen echten Token als seine Wurzel, dann funktioniert dies:
parse
: ^(PLUS a b) {System.out.println("line=" + $a.start.getLine());}
;
Wenn jedoch a
eine imaginäre Token als seine Wurzel hat:
grammar T;
tokens {
IMAG;
}
a : SomeToken -> ^(IMAG SomeToken)
;
dann Das Token IMAG
hat (offensichtlich) keine Zeilennummer (es ist nicht wirklich in der Eingabe!). In solchen Fällen müssen Sie manuell ein Token erstellen, eine Zeilennummer für dieses Token festlegen und es in das Stammverzeichnis Ihres AST einfügen. Das würde wie folgt aussehen:
grammar T;
tokens {
IMAG;
}
@parser::members {
private CommonToken token(String text, int type, int line) {
CommonToken t = new CommonToken(type, text);
t.setLine(line);
return t;
}
}
a : SomeToken -> ^({token("imag", IMAG, $SomeToken.getLine())} SomeToken)
;
diese Weise die Wurzel IMAG
die gleiche Zeilennummer wie SomeToken
bekommen.
vielen Dank. Keines der Tutorien, die ich fand, erwähnt das und das Lesen der Klassenreferenz ist eine schwierige Aufgabe beim Lernen. – Baczek
Gern geschehen @Baczek. –