您不能在{ ... }
之间的重写箭头->
的右侧放置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
被打印到控制台。
注意,如果你改变myTestFun()
返回类型CommonToken
,你会得到一个类转换异常:在线程“主要” java.lang.ClassCastException
例外:org.antlr.runtime.CommonToken不能转换为org.antlr.runtime.tree.Tree
只要你有你的output=AST
里面options { ... }
,你必须使用一个Tree
的一个实例。
Thanx,Bart,它工作,但与myTestFun()返回CommonToken,而不是CommonTree。请协调你的答案,并接受它。 – Astronavigator 2011-12-21 05:24:03
糟糕,CommonToken只能在ANTLRWorks中使用。在ANTLRWorks以外的只有CommonTree的作品。 – Astronavigator 2011-12-21 08:10:04
@Astronavigator,不客气。但'CommonToken'不起作用。也许它对你有用,但是你的语法中不能有'output = AST'。我编辑了我的示例,以便它包含完整的工作演示,以便您可以看到当您返回“CommonToken”而不是“CommonTree”时引发异常。 – 2011-12-21 08:13:44