2011-12-20 7 views
2

ノードのテキストをメソッドの戻り値に書き換える書き換えルールを作成しようとしています。ANTLR書き換えルールを作成してメソッドの値に書き換える方法は?

しかし、私は書き換えルールのパーサーは最初のノードだけを解析し、その後例外なく停止します。 rewrite-ruleパーサーがなければ正常に動作します。ここで

私の働いていない例である:

grammar test01; 

options 
{ 
    output=AST; 
} 

@members{ 
    public String MyTestFun(){ 
    return "test"; 
    } 
} 

test : id+; 

    id : ID -> {MyTestFun()}; // With this rule only first node is parsed 
// id : ID -> {"test"};  // and with this rule too 

ID : ('a'..'z')+; 

そこで問題は、メソッドの値にノードのテキストを書き換える書き換えルールを作成する方法ですか?

答えて

0

書き換え矢印の右側にStringを挿入することはできません->{ ... }の間に置き換えます。 Treeのインスタンスである必要があります(CommonTreeがデフォルトです)。

これは動作します:

grammar test01; 

options { 
    output=AST; 
} 

@members{ 
    public CommonTree myTestFun(){ 
    CommonToken token = new CommonToken(ID, "test"); 
    return new CommonTree(token); 
    } 

    public static void main(String[] args) throws Exception { 
    test01Lexer lexer = new test01Lexer(new ANTLRStringStream("foo")); 
    test01Parser parser = new test01Parser(new CommonTokenStream(lexer)); 
    CommonTree tree = (CommonTree)parser.test().getTree(); 
    System.out.println(tree.toStringTree()); 
    } 
} 

test : id+; 
id : ID -> {myTestFun()}; 

ID : ('a'..'z')+; 

あなたが今実行してデモを実行する場合:

java -cp antlr-3.3.jar org.antlr.Tool test01.g 
javac -cp antlr-3.3.jar *.java 
java -cp .:antlr-3.3.jar test01Parser 

(Windows上で、最後のコマンドは次のとおりです。java -cp .;antlr-3.3.jar test01Parser

出力testコンソールに印刷されます。あなたはCommonTokenmyTestFun()の戻り値の型を変更した場合は、クラスキャスト例外を取得すること

注:

例外スレッド「メイン」とjava.lang.ClassCastExceptionで:org.antlr.runtime.CommonTokenあなたはoptions { ... }output=ASTがあるときorg.antlr.runtime.tree.Tree

にキャストすることはできません、あなたTreeのインスタンスを使用する必要があります。

+0

Thanx、Bart、それは動作しますが、CommonTokenではなくCommonTreeを返すmyTestFun()で動作します。あなたの答えを訂正し、それを受け入れてください。 – Astronavigator

+0

CommonTokenはANTLRWorks内でのみ動作します。 ANTLRWorksの外ではCommonTreeだけが動作します。 – Astronavigator

+0

@Astronavigator、よろしいですか?しかし、CommonTokenは動作しません。おそらくそれはあなたと同じですが、あなたの文法で 'output = AST'を使うことはできません。私は私の例を編集して完全なデモが含まれているので、 'CommonTree'ではなく' CommonToken'を返すと例外がスローされることがわかります。 –