2011-12-20 104 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。它需要是TreeCommonTree是默認值)的實例。

這工作:

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的一個實例。

+0

Thanx,Bart,它工作,但與myTestFun()返回CommonToken,而不是CommonTree。請協調你的答案,並接受它。 – Astronavigator 2011-12-21 05:24:03

+0

糟糕,CommonToken只能在ANTLRWorks中使用。在ANTLRWorks以外的只有CommonTree的作品。 – Astronavigator 2011-12-21 08:10:04

+0

@Astronavigator,不客氣。但'CommonToken'不起作用。也許它對你有用,但是你的語法中不能有'output = AST'。我編輯了我的示例,以便它包含完整的工作演示,以便您可以看到當您返回「CommonToken」而不是「CommonTree」時引發異常。 – 2011-12-21 08:13:44