2012-03-31 20 views
3

ツリー文法で作成したノードに行番号情報を追加する簡単な方法はありますか?antlr - ツリー文法の行番号と位置を保持しますか?

パーサー文法

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

木文法:

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

私はなどa.start.token、に探してみましたが、私が見たものはヌルでした。

答えて

4

パーサールールaが、これは動作しますが、そのルートとして本当トークンが含まれている場合:しかし

parse 
: ^(PLUS a b) {System.out.println("line=" + $a.start.getLine());} 
; 

aはそのルートと虚数トークンがある場合:その後、

grammar T; 

tokens { 
    IMAG; 
} 

a : SomeToken -> ^(IMAG SomeToken) 
    ; 

をトークンIMAGには(明らかに)それに関連付けられた行番号はありません(実際は入力には実際にはありません)。このような場合は、手動でトークンを作成し、そのトークンに行番号を設定してASTのルートに挿入する必要があります。それは次のようになります。

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) 
    ; 

そのように、ルートIMAGSomeTokenと同じ行番号を取得します。

+0

ありがとうございます。私が見つけたチュートリアルのどれも、クラス参照を読むことは、学ぶときに厳しい命題ではありません。 – Baczek

+0

@Baczekようこそ。 –

関連する問題