2012-03-31 4 views
3

Gibt es eine einfache Möglichkeit, Zeilennummerninformationen zu den erstellten Knoten in der Baumgrammatik hinzuzufügen?antlr - Zeilennummer und Position in der Baumgrammatik beibehalten?

z.B. Parser Grammatik

rule: a '+' b -> ^(PLUS a b); 

Baumgrammatik:

rule: ^(PLUS a b) { print_message_with_line_number_of(a); }; 

Ich habe versucht, in a.start.token suchen, usw., aber die, die ich sah waren nulls.

Antwort

4

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.

+0

vielen Dank. Keines der Tutorien, die ich fand, erwähnt das und das Lesen der Klassenreferenz ist eine schwierige Aufgabe beim Lernen. – Baczek

+0

Gern geschehen @Baczek. –

Verwandte Themen