2011-12-20 5 views
2

노드의 텍스트를 메서드의 반환 값으로 다시 작성하는 다시 쓰기 규칙을 만들려고합니다.ANTLR 메소드의 값에 재 작성 규칙을 작성하는 방법은 무엇입니까?

하지만 다시 작성 규칙을 사용할 때 파서는 첫 번째 노드 만 구문 분석 한 다음 예외없이 중지합니다. 재 작성 규칙이 없으면 파서가 정상적으로 작동합니다. 여기

내 작동하지 않는 예는 다음과 같습니다

grammar test01; 

options 
{ 
    output=AST; 
} 

@members{ 
    public String MyTestFun(){ 
    return "test"; 
    } 
} 

test : id+; 

    id : ID -> {MyTestFun()}; // With this rule only first node is parsed 
// id : ID -> {"test"};  // and with this rule too 

ID : ('a'..'z')+; 

그래서 질문은 메소드의 값으로 노드의 텍스트를 재 작성 재 작성 규칙을 만드는 방법입니까?

답변

0

다시 작성 화살표 오른쪽에 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가에서

예외 : 당신이 CommonTokenmyTestFun()의 반환 형식을 변경하는 경우, 당신은 클래스 캐스트 예외를 얻을 것이다

주 org.antlr.runtime.CommonToken 당신의 options { ... } 내부

당신이 output=AST있을 때마다 org.antlr.runtime.tree.Tree

캐스트 할 수없는, 당신은 Tree의 인스턴스를 사용해야합니다.

+0

Thanx, Bart, 작동하지만 myTestFun()은 CommonTree가 아니라 CommonToken을 반환합니다. 답을 정정하고 받아 들일 것입니다. – Astronavigator

+0

CommonToken은 ANTLRWorks 내부에서만 작동합니다. ANTLRWorks 외부에서는 CommonTree 만 작동합니다. – Astronavigator

+0

@Astronavigator, 환영합니다. 그러나 CommonToken은 작동하지 않습니다. 아마도 그것은 여러분과 함께하지만, 문법에'output = AST'를 사용할 수는 없습니다. 내 예제를 편집하여 전체 작업 데모를 포함하므로'CommonTree' 대신'CommonToken'을 반환 할 때 예외가 발생하는 것을 볼 수 있습니다. –

관련 문제