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异常。