2017-11-21 6 views
0

のは、我々はこの文法バイソンの文法から変数を始めるには?

start: 
expressions; 
expressions: 
      expressions expression 
      | expression 
      ; 
expression: 
      expression NAME value { float $2 = $3;} 
      | NAME value { float $1 = $2;} 
      ; 
value: 
     INT '.' INT 
     ; 

とこの文法のために私たちは、この入力

これは、このような私たちの文法(フロートA = 2.0によって解釈されるべきである2.0 B 3.0

を適用してい想像してみましょう; float b = 3.0;)

私の目的は、本当にいくつかの変数を名前で宣言し、コンストラクタでmyClass NAME(value)のようなことをすることです。値は浮動小数点数です。

問題は、私のexempleの値のような文法上のブロックの全体的な価値を得る方法と、入力ファイルで各行で変更される変数名の宣言をどうやって作るのか分からないジェネリックfloat a = $ 1;

私はすでにあなたがC++での変数名の代わりに文字列を使用することはできません私の名前と値

答えて

0

を与える私のフレックストークナイザの作業を持っています。その代わりに文字列から浮動小数点までのマップを定義し、次にfloat $2 = $3;の代わりにthe_map[$2] = $3;のようなものを実行します。

関連性のないノートでは、valueにアクションを追加して浮動小数点値を生成する必要があります(または、レクサーが浮動小数点用の単一トークンを生成して使用する)。それ以外の場合はexpressionのアクションで$3に適切な値が設定されていません。

+0

と浮動小数点値の生成方法新しいユニオンを作成し、浮動小数点型の値の型を作成するようにしますか? – Gengetsu

+0

@Gengetsu 2つの整数から浮動小数点数を作成するには、それらの整数をドットの間の文字列に貼り付け、その文字列に 'strtod'を使います。これは、あなたのレクサーが 'int'ではなくINTトークンの文字列値を作成すると仮定しています。レクサーから 'int'を取得した場合、正しく動作する方法はありません(小数部の先頭の0を失います)。より良い選択肢は、おそらくレクサーが浮動小数点のための単一のトークンをとにかく生成させることだけだろう。私はあなたのコメントの第二部分を理解していない。 – sepp2k

+0

ok、私のコメントの2番目の部分は、INT(int)を浮動小数点数に変換する方法です。既に浮動小数点数に変換できませんでした。どうもありがとうございます。 – Gengetsu

関連する問題