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 に答える