다시 작성 화살표 오른쪽에 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
콘솔에 인쇄됩니다. 스레드 "주요"java.lang.ClassCastException가에서
예외 : 당신이 CommonToken
에 myTestFun()
의 반환 형식을 변경하는 경우, 당신은 클래스 캐스트 예외를 얻을 것이다
는
주 org.antlr.runtime.CommonToken 당신의 options { ... }
내부
당신이 output=AST
있을 때마다 org.antlr.runtime.tree.Tree
캐스트 할 수없는, 당신은
Tree
의 인스턴스를 사용해야합니다.
Thanx, Bart, 작동하지만 myTestFun()은 CommonTree가 아니라 CommonToken을 반환합니다. 답을 정정하고 받아 들일 것입니다. – Astronavigator
CommonToken은 ANTLRWorks 내부에서만 작동합니다. ANTLRWorks 외부에서는 CommonTree 만 작동합니다. – Astronavigator
@Astronavigator, 환영합니다. 그러나 CommonToken은 작동하지 않습니다. 아마도 그것은 여러분과 함께하지만, 문법에'output = AST'를 사용할 수는 없습니다. 내 예제를 편집하여 전체 작업 데모를 포함하므로'CommonTree' 대신'CommonToken'을 반환 할 때 예외가 발생하는 것을 볼 수 있습니다. –