2012-04-03 7 views
1

私は言語の文法(以下のサンプルコード)ANTLRのif-elseブロックを歩くには?

//this is a procedure 
procedure main() 
    $i := 0 
begin 
    if ($i = 0) 
     $i := 10 
     loop while ($i != 0) 
      print($i) 
      $i := $i - 1 
     end loop 
    end if 
end procedure 

私は表現、印刷メッセージなどを評価することができますが、私は可能な数字

@members { 
    private Map<String, Integer> variablesTable = new HashMap<String, Integer>(); 
} 
procedure 
    : ^('procedure' IDENTIFIER assignment_expression* 'begin' statement+) 
    ; 
statement 
    : assignment_expression | selection_statement 
    ; 
assignment_expression 
    : ^(':=' IDENTIFIER e=expression) 
     { variablesTable.put($IDENTIFIER.text, e); } 
    ; 
expression returns [int result] 
    : ^('+' op1=expression op2=expression) { result = op1 + op2; } 
    /* removed similar lines */ 
    | IDENTIFIER { result = variablesTable.get($IDENTIFIER.text); } 
    | INTEGER { result = Integer.parseInt($INTEGER.text); } 
    ; 

equality_expression returns [boolean truth] 
    : ^('=' op1=expression op2=expression) { truth = op1 == op2; } 
    | ^('!=' op1=expression op2=expression) { truth = op1 != op2; } 
    ; 
selection_statement 
    : ^('if' e=equality_expression block1=statement+ ('else' block2=statement+)?) 
     { 
      if (e) { 
       //What do I put here? 
      } 
     } 
    ; 

ないですされたツリー文法を書かれていますプログラムの実行(解釈)をどのように変更するか。
上記のコードと同様に、if-elseの場合、case述語がtrueの場合はif-blockを実行し、elseにスキップするにはどうすればよいですか?
同じループになりますが、ループの最後にループ述語を評価するにはどうすればよいですか?

ありがとうございます!

答えて

3

ツリーの文法の中にコードを埋め込むことは、非常に単純な言語(電卓など)にのみ適しています。それを埋め込むことで(IMO)、混合文法ルール、プログラミングロジック、ルールパラメータ、およびルールリターン値の混乱を招きます。ほとんどすべてのルールは、少なくともbooleanの値が必要です(実行する必要があるかどうかは、if - またはelseブロックですか)。

if - とwhileの文で構成された言語を解釈するときは、シンプルなので、カスタムのツリー/ノードを作成して評価することをお勧めします。

私はこれを行う方法を示すブログシリーズを作成しました:http://bkiers.blogspot.com/2011/03/creating-your-own-programming-language.html

+1

ありがとう!あなたのブログシリーズは、とても役に立ちました。私はたくさん書き直さなければならなかったが、今はとてもよく見える。私はScopeクラスを使わなかったので、グローバルスコープを実装するのに苦労しました。私はシングルトンクラスでそれを働いた。再度ありがとう:) –

+0

あなたはようこそ@VinayakGarg。 –