1

假设我有以下 ANTLR 规则:

ROOT: 'r' ('0'..'9')*;
CHILD: 'c' ('0'..'9')*;
expression: ROOT ('.'^ CHILD)*;

对于诸如 的输入r.c1.c2.c3,ANTLR 将生成以下树:

.(.(.(r c1) c2) c3)

如何在'.'没有^运算符的情况下直接表示父属性,即在重写规则中?

expression: ROOT ('.' CHILD)* -> ?
4

1 回答 1

1

诀窍是expression在重写规则中递归调用规则($expression下面的部分):

expression : (ROOT -> ROOT) ('.' CHILD -> ^('.' $expression CHILD))*;

这相当于:

expression: ROOT ('.'^ CHILD)*;

是的,我知道,它并不漂亮,没有像您(可能)希望的那样简单的语法:

expression: ROOT ('.' CHILD)* -> ^(...);

请参阅:Parr 的权威 ANTLR 参考,第 7 章,段落“在重写规则中引用先前的规则 AST”,第 174 页。

于 2012-05-04T18:02:46.140 回答