2011-12-14 12 views
1

単純なDSL用のインタプリタを作成し、if-then-elseエバリュエーターをエレガントに実装する方法を考えています。私はantlr.orgからオンラインで1つの例を見つけましたが、実際には保護されているCommonTreeNodeStreamのgetNodeIndex()を使用しています。私は何ができる最高は以下の通りであった:これは働いているAntlr V3ツリーパーサーを使ってif-then-elseエバリュエーターを生成する

ifblock 
@init 
{ 
    int t = 0; 
    int f = 0; 
} 
@after 
{ 
    if(c) 
    stream.push(t); 
    else 
    stream.push(f); 
    statements(); // handle the statements in then or else branch 
    stream.pop() 
} 
    : ^(IF c=condition {t = input.mark();}. {f = input.mark();}.) 
; 

が、私は何とか本当に満足していません。より良い方法がありますか?

答えて

1

ロジックをツリー文法から分離し、入力を評価するカスタムノードクラスを作成します。あなたが文法の中にそれをすべて残しておくと、すぐに維持するのが難しいスパゲッティの大きな山になるでしょう、IMO。特に言語を拡張するとき。これを行う方法の例については

、前回のQ & Aをチエニル参照してください。if then else conditional evaluation

いくつかのより多くの関連リンク:

+0

ありがとうございます。私は実際にビジターパターンを使用して自分の評価を書いていますが、実際に可能かどうかを確かめるために、ツリー文法を使うことに決めました。私は賛否両論を今より明確に見ることができます。 「Xを正しく行う方法」の多くは厳しいルールではなく、慣習であり、Antlrでそれを学ぶ必要がありました:) – ntrolls

関連する問題