ANTLR如何创建重写规则重写到方法';s值多少?

ANTLR如何创建重写规则重写到方法';s值多少?,antlr,abstract-syntax-tree,Antlr,Abstract Syntax Tree,我试图创建重写规则,将节点的文本重写为方法的返回值 但当我使用重写规则时,解析器只解析第一个节点,然后毫无例外地停止。无需重写,规则解析器工作正常 以下是我不起作用的例子: grammar test01; options { output=AST; } @members{ public String MyTestFun(){ return "test"; } } test : id+; id : ID -> {MyTestFun()}; // W

我试图创建重写规则,将节点的文本重写为方法的返回值

但当我使用重写规则时,解析器只解析第一个节点,然后毫无例外地停止。无需重写,规则解析器工作正常

以下是我不起作用的例子:

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')+;

所以问题是如何创建重写规则,将节点文本重写为方法的值?

您不能将
字符串
放在重写箭头的右侧
->
之间的
{…}
。它需要是
树的一个实例
CommonTree
是默认值)

这项工作:

语法测试01;
选择权{
输出=AST;
}
@成员{
公共CommonTree myTestFun(){
CommonToken token=新的CommonToken(ID,“测试”);
返回新的CommonTree(令牌);
}
公共静态void main(字符串[]args)引发异常{
test01Lexer lexer=newtest01lexer(newantlrstringstream(“foo”));
test01Parser parser=newtest01parser(newcommontokenstream(lexer));
CommonTree=(CommonTree)parser.test().getTree();
System.out.println(tree.toStringTree());
}
}
测试: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

输出
测试
打印到控制台

请注意,如果将
myTestFun()
的返回类型更改为
CommonToken
,则会出现类强制转换异常:

线程“main”java.lang.ClassCastException中的异常:org.antlr.runtime.CommonToken无法强制转换为org.antlr.runtime.tree.tree


每当在
选项{…}
中有
output=AST
时,必须使用
树的实例

您不能在
{…}
之间的重写箭头的右侧放置
字符串
。它需要是
树的一个实例
CommonTree
是默认值)

这项工作:

语法测试01;
选择权{
输出=AST;
}
@成员{
公共CommonTree myTestFun(){
CommonToken token=新的CommonToken(ID,“测试”);
返回新的CommonTree(令牌);
}
公共静态void main(字符串[]args)引发异常{
test01Lexer lexer=newtest01lexer(newantlrstringstream(“foo”));
test01Parser parser=newtest01parser(newcommontokenstream(lexer));
CommonTree=(CommonTree)parser.test().getTree();
System.out.println(tree.toStringTree());
}
}
测试: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

输出
测试
打印到控制台

请注意,如果将
myTestFun()
的返回类型更改为
CommonToken
,则会出现类强制转换异常:

线程“main”java.lang.ClassCastException中的异常:org.antlr.runtime.CommonToken无法强制转换为org.antlr.runtime.tree.tree


每当在
选项{…}
中有
output=AST
时,必须使用
树的一个实例

Thanx,Bart,它可以工作,但myTestFun()返回的是CommonToken,而不是CommonTree。请更正您的答案,并接受它。哎呀,CommonToken只在ANTLRWorks内部工作。在AntlWorks外,只有CommonTree工作。@Astronavigator,不客气。但是
CommonToken
不起作用。也许它对您有影响,但是您的语法中不能有
output=AST
。我对我的示例进行了编辑,使其包含一个完整的工作演示,这样您就可以看到,当您返回
CommonToken
而不是
CommonTree
时,会引发异常。Thanx,Bart,它可以工作,但myTestFun()返回CommonToken,而不是CommonTree。请更正您的答案,并接受它。哎呀,CommonToken只在ANTLRWorks内部工作。在AntlWorks外,只有CommonTree工作。@Astronavigator,不客气。但是
CommonToken
不起作用。也许它对您有影响,但是您的语法中不能有
output=AST
。我对我的示例进行了编辑,使其包含一个完整的工作演示,这样您就可以看到,当您返回
CommonToken
而不是
CommonTree
时,会引发en异常。