假设我有以下 ANTLR 规则:
ROOT: 'r' ('0'..'9')*;
CHILD: 'c' ('0'..'9')*;
expression: ROOT ('.'^ CHILD)*;
对于诸如 的输入r.c1.c2.c3
,ANTLR 将生成以下树:
.(.(.(r c1) c2) c3)
如何在'.'
没有^
运算符的情况下直接表示父属性,即在重写规则中?
expression: ROOT ('.' CHILD)* -> ?
假设我有以下 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
下面的部分):
expression : (ROOT -> ROOT) ('.' CHILD -> ^('.' $expression CHILD))*;
这相当于:
expression: ROOT ('.'^ CHILD)*;
是的,我知道,它并不漂亮,没有像您(可能)希望的那样简单的语法:
expression: ROOT ('.' CHILD)* -> ^(...);
请参阅:Parr 的权威 ANTLR 参考,第 7 章,段落“在重写规则中引用先前的规则 AST”,第 174 页。