2

私は ANTLR を使用した言語の作成に取り組んでおり、expr.g の例を使用してベース言語を開始しました。私はANTLR 3を使用しています。intよりも多くのデータ型に取り組む準備ができています.

彼の例では、return float という式がありますが、これは int を返さないことを意味します。返品ルールで複数の返品タイプを許可する方法について混乱していますか? int と float を組み合わせた "number" 型を作成してそれを返すことができると考えていましたが、もちろん、Java 内で特に int または float を返さなければならないという問題に遭遇しました。データ型ごとに 1 つずつ、2 つのバージョンの式コードが必要ですか? これは必要ないと思いますが、困惑しています...式にオプションのルールを使用することは想像できます(つまり、この式ではfloatまたはintのいずれかが有効です)が、戻り値の型自体には特定の型が必要です。繰り返して申し訳ありませんが、私が混乱していることを明確にしていただければ幸いです。

ここに私の文法ファイルがあります

そして式文法セクション:

expr returns [int value]
    : e=mexpr {$value = $e.value;}
      ( PLUS e=mexpr {$value += $e.value;}
      | MINUS e=mexpr {$value -= $e.value;}
      )*
    ;

バートのものと比較してください:

additionExp returns [double value]
    :    m1=multiplyExp       {$value =  $m1.value;} 
         ( '+' m2=multiplyExp {$value += $m2.value;} 
         | '-' m2=multiplyExp {$value -= $m2.value;}
         )* 
    ;

そしてもちろん、私たちのルールは適切なデータ型を使用しています (私にとっては int、彼にとっては float)...

4

1 に答える 1

1

ルールが adouble intの両方を返すようにする必要があるとはint本当に思いませんdouble

つまり、ANTLR ルールは複数のオブジェクト (またはプリミティブ) を返すことができます。

additionExp returns [double value, int i]

{ ... }これは、 のように傾斜コードで設定するか$value@after{ ... }ブロックで設定できます。

additionExp returns [double value, int i]
@after{ $i = (int)$value; }
    :    m1=multiplyExp       {$value =  $m1.value;} 
         ( '+' m2=multiplyExp {$value += $m2.value;} 
         | '-' m2=multiplyExp {$value -= $m2.value;}
         )* 
    ;

他のルールでは、次のように、valueまたはルールiから単に参照します。additionExp

otherRule
 : a=additionExp { 
                   System.out.println("int a.i = " + $a.i);
                   System.out.println("double a.value = " + $a.value);
                 }
 ;
于 2012-10-11T19:31:48.170 に答える