说我有以下ANTLR规则:
ROOT: 'r' ('0'..'9')*;
CHILD: 'c' ('0'..'9')*;
expression: ROOT ('.'^ CHILD)*;
对于r.c1.c2.c3
之类的输入,ANTLR会生成以下树:
.(.(.(r c1) c2) c3)
如何在没有'.'
运算符的情况下直接表示^
的父属性,即在重写规则中?
expression: ROOT ('.' CHILD)* -> ?
答案 0 :(得分:1)
诀窍是在重写规则(下面的expression
部分)中递归调用$expression
规则:
expression : (ROOT -> ROOT) ('.' CHILD -> ^('.' $expression CHILD))*;
相当于:
expression: ROOT ('.'^ CHILD)*;
是的,我知道,它并不漂亮,没有像您(可能)希望的简单语法:
expression: ROOT ('.' CHILD)* -> ^(...);
请参阅:Parr的Definitive ANTLR Reference,第7章,"在重写规则中引用先前规则AST" ,第174页。