FlexからBisonに対して、 単なる整数値以上の情報を渡す必要の生じることがよくあります。 例えば、 コンパイラにおいては、 どのような種類のトークンが認識されたかだけではなく、 そのトークンの値についても知る必要のある場合がときどきあります。 文字列、文字、および数値定数などが良い例です。 ここで問題なのは、 どのようにしてFlexにこうした情報を返させるかです。
その答は、
Bisonが持っている%union
文です。
これは、
YYSTYPE
という型を定義するものです。
YYSTYPE
は、
パーサ定義中において使われるすべての正当なデータ型の共用体(union
)です。
Bisonがカレントなパース状態に関連づけたデータを保存するために使う、
YYSTYPE
型の変数yylval
というものがあり、
Flexからyylval
に値を設定することができるので、
トークンの型だけでなく、
それ以上の情報をBisonに返すことができます。
Bisonにおいて%union
を宣言して`-d'オプションを使うと、
Bisonは.tab.hという拡張子を持つファイルを作成して、
そこにトークンの定義情報だけでなく、
YYSTYPE
とyylval
の宣言も含めます。
したがって、
yylval
にアクセスするためにしなければならないことは、
Flexの定義情報の中にこの.tab.hファイルをインクルードすることだけです。
これは、
追加のCコード・セクションにおける定義の先頭でインクルードしなければなりません
(see Interfacing Flex and Bison)。
注:初期のバージョンのBisonは、
自動的にYYSTYPE
とyylval
の宣言を生成しません。
この場合には、
より新しいバージョンのBisonを入手するか、
もしくは、
Flexの定義ファイルの先頭においてYYSTYPE
とyylval
を宣言する必要があります。