Нельзя поместить 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
, вы получите исключение приведения класса:
Исключение в потоке "main" java.lang.ClassCastException: org.antlr.runtime.CommonToken нельзя преобразовать в org.antlr.runtime.tree.Tree
Когда у вас есть output=AST
внутри вашего options { ... }
, вы должны использовать экземпляр Tree
.