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

假设我有以下ANTLR规则:

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个或更多子级),它就应该可以工作。如果没有,你能用一个失败的案例来编辑你的问题吗?