如何将多个父母表示为重写规则?

时间:2012-05-04 16:55:50

标签: 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)* -> ?

1 个答案:

答案 0 :(得分:1)

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

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

相当于:

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

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

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

请参阅:Parr的Definitive ANTLR Reference,第7章,"在重写规则中引用先前规则AST" ,第174页。