ファイルの終端(EOF)が見つかると、
Flexはyywrap()
を呼び出し、
ほかに処理できる状態のファイルが存在するか調べます。
yywrap()
が0以外の値を返すと、
もうこれ以上ファイルはないということを意味し、
したがって、
これがまさに入力の最後であるということになります。
状況によっては、
この時点でさらに処理を行う必要のある場合があります
(例えば、
入力のために別のファイルをセットアップしたいということがあるかもしれません)。
このような場合のために、
Flexは<<EOF>>
演算子を提供しています。
これを使うことで、
EOFが見つかった時に実行すべきことを定義することができます。
See 複数バッファを使う実例。
EOFルールを使って、
終わりのないコメントやインクルードされているファイルの終端を見つける、
良い例が示されています。
<<EOF>>
演算子の使用にはいくつか制限があります。
制限事項を以下に示します。
EOFルールは、
スタート状態とのみ一緒に使うことができます。
スタート状態が指定されていない場合
(すなわち、
<<EOF>>
ルールが状態により制限されない場合)、
<<EOF>>
が使われていないすべての
(排他的スタート状態を含む)
状態が影響を受けます。
つまり、
"foo"<<EOF>>
が不当である一方で、
<<EOF>> /* <<EOF>>が使われていないすべての */ /* 状態におけるEOF */ <indent><<EOF>> /* indent状態におけるEOF */ <comment><<EOF>> /* コメント内のEOF */
はすべて正当であることを意味しています。
1つ注意しなければならない点は、
EOFルールは入力の最後で呼び出されるという点です。
したがって、
EOFルールのアクションは、
(1) (yy_switch_to_buffer()
、
またはYY_NEW_FILE
を使って)新しい入力ストリームを確立する、
(2) (return
文を使って)復帰する、
(3) (yyterminate()
、
またはexit()
を使って)スキャナの実行を終了させる、
のいずれかを実行しなければなりません。
See 複数バッファを使う実例。
yy_terminate()
とyy_switch_to_buffer()
を使う例が示されています。
また、
yyterminate()
の説明については、
Flex and Cを参照してください。