您不能在{ ... }
之間的重寫箭頭->
的右側放置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