私はこの問題の回避策をすでに知っていますが、少なくとも1つの理由から、この1つのアプローチを実際に使用したいと思います。それは機能するはずです。
これは、TerenceParrによる「TheDefinitiveANTLR Reference」から抜粋したルールです(本はANTLR3用です)。
expr : (INT -> INT) ('+' i=INT -> ^('+' $expr $i) )*;
INT
が続かない場合+
、結果はINT(単一ノード)になります。そうである場合、サブツリーは最初INT
(と呼ばれる$expr
)を左ブランチとして構築されます。
同様のルールを作成したいのですが、カスタムアクションを使用します。
mult_expr : (pow_expr -> pow_expr )
(op=MUL exr=pow_expr
-> { new BinExpr($op,$mult_expr.tree,$exr.tree) })*;
ANTLRはそのようなルールを受け入れますが、入力(たとえば)「5 * 3」でパーサーを実行すると、「行1:1に'*'5でEOFがありません」というエラーが表示されます。
質問:カスタム書き換えアクションでバックリファレンスを使用する方法は?