0

ほとんどのルールでカスタムの初期化とクリーンアップを行う必要があります。@init/finally ブロックでの重複を避ける方法はありますか?

現在、私のルールは次のようになっています。

rule
@init { int mark = init(); } // Don't want to duplicate this!
...
;
finally { cleanup(mark); } // ... and that!

したがって、私が望むのは、 @init/finally ブロックをどこにでもコピーアンドペーストせずに、「このルールはこれらの標準の init/cleanup 呼び出しを行う必要がある」と宣言することです。

私は ANTLR3 を使用しており、ターゲット言語は Java です。

4

1 に答える 1

1

ANTLR 3 で必要なことを行う簡単な方法はありません。すべてのルール メソッドが final と宣言されているため、生成されたパーサーをサブクラス化することさえできませんでした。

おそらく最も簡単に維持できるのは、前処理またはコード インジェクションのいずれかです。あなたの例のように、コードがルール アクションによって実際に使用されない場合は、AspectJ http://www.eclipse.org/aspectj/や Spring AOP http:// static.springsource.org/spring/docs/2.0.x/reference/aop.html . ルールが変数にアクセスするという点でより複雑な場合は、markある種のプリプロセッサを使用してすべてのinitsとを追加する必要がありfinallysます。

個人的には、コピペします。通常、パーサーは事前に多くの開発を行い、マイナーなバグ修正のみを行います。どこへ行っても、ある程度の面倒はあるでしょう。

于 2013-05-07T05:33:01.810 に答える