2011-12-21 6 views
2

(TokenRewriteStreamを使用して):ANTLR rewritedコードソースを取得する方法は?私のようなものを翻訳する簡単なトランスレータを作成しようとしています

grammar test01; 

options { 
    output=AST; 
} 

@members{ 
    int N; 
} 

test 
@init{ 
    N = 0; 
}: 
    id ('|' id)* -> id (BR id)*; 

id : {N++;} ID -> {new CommonTree(new CommonToken(ID, Integer.toString(N) + " : " + $ID.text))}; 
ID : ('a'..'z')+; 
BR : '\n'; 
WS : ' '{$channel=HIDDEN;}; 

翻訳元FooTest:

aaa | bbb | ccc 

ここ

1 : aaa 
2 : bbb 
c : ccc 

には、文法test01.gです。 java:

import org.antlr.runtime.*; 

class FooTest { 
    public static void main(String[] args) throws Exception {  
    String text = "aaa | bbb | ccc";   
    System.out.println("parsing: "+text);   
    ANTLRStringStream in = new ANTLRStringStream(text); 
    test01Lexer lexer = new test01Lexer(in); 
    CommonTokenStream tokens = new TokenRewriteStream(lexer); 
    test01Parser parser = new test01Parser(tokens); 
    parser.test(); 
    System.out.println("Result: "+tokens.toString());  
    } 
} 

私はそれを実行すると、私のような何かを得るためにexcpect:

parsing: aaa | bbb | ccc 
Result: 
1 : aaa 
2 : bbb 
3 : ccc 

をしかし、私は得る:

parsing: aaa | bbb | ccc 
    Result: aaa | bbb | ccc 

テキストが変更されていないようです。

ソースを変更するにはどうすればよいですか?

答えて

1

あなたは、単に行うことによって、トークンのフラットリストを印刷している:あなたがあなたのFooTestクラスを調整した場合

CommonTokenStream tokens = new TokenRewriteStream(lexer); 
// ... 
System.out.println("Result: "+tokens.toString()); 

import org.antlr.runtime.*; 
import org.antlr.runtime.tree.*; 

class FooTest { 
    public static void main(String[] args) throws Exception {  
    String text = "aaa | bbb | ccc";   
    System.out.println("parsing: "+text);   
    ANTLRStringStream in = new ANTLRStringStream(text); 
    test01Lexer lexer = new test01Lexer(in); 
    CommonTokenStream tokens = new TokenRewriteStream(lexer); 
    test01Parser parser = new test01Parser(tokens); 
    CommonTree root = (CommonTree)parser.test().getTree(); 
    for(int i = 0; i < root.getChildCount(); i++) { 
     CommonTree child = (CommonTree)root.getChild(i); 
     System.out.println("root.children[" + i + "] = " + child); 
    } 
    } 
} 

コンソールに出力され、以下:

parsing: aaa | bbb | ccc 
root.children[0] = 1 : aaa 
root.children[1] = BR 
root.children[2] = 2 : bbb 
root.children[3] = BR 
root.children[4] = 3 : ccc 

注意あなたがパーサクラスにグローバル変数を入れる必要はありません。ルールは変数(ローカル変数)も処理します。これが好ましい:

grammar test01; 

options { 
    output=AST; 
} 

test: 
    id ('|' id)* -> id (BR id)*; 

id 
@init{ 
    int N = 0; 
} 
    : {N++;} ID -> {new CommonTree(new CommonToken(ID, Integer.toString(N) + " : " + $ID.text))} 
    ; 

// other rules 
関連する問題