書き換え矢印の右側に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
コンソールに印刷されます。あなたはCommonToken
へmyTestFun()
の戻り値の型を変更した場合は、クラスキャスト例外を取得すること
注:
例外スレッド「メイン」とjava.lang.ClassCastExceptionで:org.antlr.runtime.CommonTokenあなたはoptions { ... }
内output=AST
があるときorg.antlr.runtime.tree.Tree
にキャストすることはできません、あなたはTree
のインスタンスを使用する必要があります。
Thanx、Bart、それは動作しますが、CommonTokenではなくCommonTreeを返すmyTestFun()で動作します。あなたの答えを訂正し、それを受け入れてください。 – Astronavigator
CommonTokenはANTLRWorks内でのみ動作します。 ANTLRWorksの外ではCommonTreeだけが動作します。 – Astronavigator
@Astronavigator、よろしいですか?しかし、CommonTokenは動作しません。おそらくそれはあなたと同じですが、あなたの文法で 'output = AST'を使うことはできません。私は私の例を編集して完全なデモが含まれているので、 'CommonTree'ではなく' CommonToken'を返すと例外がスローされることがわかります。 –