Antlr 如何将多个父级表示为重写规则?
假设我有以下ANTLR规则:Antlr 如何将多个父级表示为重写规则?,antlr,Antlr,假设我有以下ANTLR规则: ROOT: 'r' ('0'..'9')*; CHILD: 'c' ('0'..'9')*; expression: ROOT ('.'^ CHILD)*; 对于输入,例如r.c1.c2.c3,ANTLR将生成以下树: .(.(.(r c1) c2) c3) 如果不直接使用^运算符(即在重写规则中),如何表示'.的父属性 expression: ROOT ('.' CHILD)* -> ? 诀窍是在重写规则中递归调用表达式规则(下面的$expressio
ROOT: 'r' ('0'..'9')*;
CHILD: 'c' ('0'..'9')*;
expression: ROOT ('.'^ CHILD)*;
对于输入,例如r.c1.c2.c3
,ANTLR将生成以下树:
.(.(.(r c1) c2) c3)
如果不直接使用^
运算符(即在重写规则中),如何表示'.
的父属性
expression: ROOT ('.' CHILD)* -> ?
诀窍是在重写规则中递归调用
表达式
规则(下面的$expression
部分):
这相当于:
expression: ROOT ('.'^ CHILD)*;
是的,我知道,它不漂亮,没有你(可能)希望的简单语法:
expression: ROOT ('.' CHILD)* -> ^(...);
参见:Parr的第7章第174页“在重写规则中引用以前的规则AST”一段。诀窍是在重写规则中递归调用
表达式
规则(下面的$expression
部分):
这相当于:
expression: ROOT ('.'^ CHILD)*;
是的,我知道,它不漂亮,没有你(可能)希望的简单语法:
expression: ROOT ('.' CHILD)* -> ^(...);
请参阅:Parr的第7章第174页“在重写规则中引用以前的规则AST”一段。有趣的是,您的方法是有效的,但前提是
ROOT
和CHILD
是标记而不是规则。使用规则时,由于if()
语句为空,生成的代码不会编译。我在这里有点不知所措…@LazloBonin,只要您的解析器规则生成正确的AST(1个根,0个或更多子级),它就应该可以工作。如果没有,你能用一个失败的案例来编辑你的问题吗?有趣的是,你的方法是有效的,但前提是ROOT
和CHILD
是标记而不是规则。使用规则时,由于if()
语句为空,生成的代码不会编译。我在这里有点不知所措…@LazloBonin,只要您的解析器规则生成正确的AST(1个根,0个或更多子级),它就应该可以工作。如果没有,你能用一个失败的案例来编辑你的问题吗?