2011-12-20 66 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