FreeBSD 日本語マニュアル検索 (jman/japropos/jwhatis)


日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。

4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.3-RELEASE-K, 13.0-RELEASE-K から 13.2-RELEASE-K は、全翻訳済み)

13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。



検索コマンド: man apropos whatis
コマンド/キーワード:
日本語マニュアル RELEASE :
セクション:
Table of Contents
名称 | 書式 | 概説 | 解説 | 簡単な例 | 入力ファイルのフォーマット | パターン | 入力のマッチ方法 | アクション | 生成されたスキャナ | 開始条件 | 複数の入力バッファ | ファイルの終りのルール | 雑多なマクロ | ユーザが使用可能な値 | YACC とのインタフェース | オプション | 性能関連 | C++ スキャナの生成 | 診断 | 関連ファイル | 欠陥 / バグ | 関連項目 | 作者
FLEX(1)                                                                FLEX(1)



名称
       flex, lex - 高速な字句解析処理系の生成ツール

書式
       flex [-bcdfhilnpstvwBFILTV78+? -C[aefFmr] -ooutput -Pprefix -Sskeleton]
       [--help --version] [filename ...]

概説
       このマニュアルは、テキストのパターンマッチングを行うプログラムを生成す
       るツール flex を扱います。このマニュアルは、チュートリアルとリファレン
       スのセクションを含みます:

           解説
               ツールの短い概説

           簡単な例

           入力ファイルのフォーマット

           パターン
               flex が使用する拡張した正規表現

           入力のマッチ方法
               何がマッチするかを決定する規則

           アクション
               パターンがマッチした時に何を行うかを指定する方法

           生成されたスキャナ
               flex が生成するスキャナに関する詳細;
               入力元の制御方法

           開始条件
               スキャナへの文脈の導入と、
               "ミニスキャナ" の制御方法

           複数の入力バッファ
               複数の入力元を扱う方法;
               ファイルではなく文字列からスキャンする方法

           ファイルの終りのルール
               ファイルの終りにマッチする特別なルール

           雑多なマクロ
               アクションで使用可能なマクロのまとめ

           ユーザが使用可能な値
               アクションで使用可能な値のまとめ

           Yacc とのインタフェース
               lex スキャナと yacc パーサとの結合

           オプション
               flex のコマンドラインオプションと、
               "%option" ディレクティブ

           性能関連
               スキャナを可能な限り高速にする方法

           C++ スキャナの生成
               C++ スキャナクラス生成のための
               (実験的な) 機能

           Lex および POSIX との非互換性
               AT&T lex および POSIX lex 標準と
               flex との違い

           診断
               flex (もしくは生成したスキャナ) が出力する
               エラーメッセージで意味が明確でないもの

           関連ファイル
               flex が使用するファイル

           欠陥 / バグ
               flex の既知の問題

           関連項目
               ツールに関係する他のドキュメント

           作者
               連絡方法を含みます


解説
       flex は、スキャナを生成するためのツールです。ここで、スキャナとは、テキ
       スト内の字句パターンを解析するプログラムです。flex は、指定したファイ
       ル、もしくはファイル名が与えられなかった場合は、標準入力から、生成する
       スキャナの記述を読み込みます。記述は、ルールと呼ばれる正規表現と C コー
       ドのペアの形をしています。flex は、出力として C ソースファイルの
       lex.yy.c を生成しますが、その中に yylex() ルーチンが定義されます。この
       ファイルは、コンパイルされ、-ll ライブラリとともにリンクされて、実行形
       式となります。実行形式が走り始めると、正規表現をマッチさせるために入力
       が解析されます。マッチするものを見つけると、対応する C コードが実行され
       ます。

簡単な例
       まず簡単な例から、flex の使い方を見て行きましょう。次の flex の入力は、
       "username" という文字列に出会うとユーザのログイン名に置き換えるスキャナ
       を指定しています:

           %%
           username    printf( "%s", getlogin() );

       デフォルトでは、flex スキャナにマッチしなかったテキストは、出力にコピー
       されますので、"username" を展開しながら入力を出力にコピーすることがこの
       スキャナの最終的な結果となります。この入力には、ただ一つのルールだけが
       あります。"username" は、パターンであり、"printf" は、アクションです。
       "%%" は、ルールの始まりの印です。

       別の例を見てみましょう:

           %{
                   int num_lines = 0, num_chars = 0;
           %}

           %%
           \n      ++num_lines; ++num_chars;
           .       ++num_chars;

           %%
           main()
                   {
                   yylex();
                   printf( "# of lines = %d, # of chars = %d\n",
                           num_lines, num_chars );
                   }

       このスキャナは、入力の文字数および行数を数えます (数えた最終結果を報告
       するだけです)。最初の行は、2 つの大域変数 "num_lines" と "num_chars" を
       宣言します。これらの変数は、2 番目の "%%" の後に宣言されている yylex()main() のルーチンからアクセス可能です。ここには、2 つのルールがあり
       ます。1 つ目は、改行文字 ("\n") にマッチし、行数と文字数のカウントを増
       加させます。もう 1 つは、改行文字以外の全ての文字 ("." という正規表現で
       表されています) にマッチします。

       次は、もうちょっと複雑な例です:

           /* scanner for a toy Pascal-like language */

           %{
           /* need this for the call to atof() below */
           #include <math.h>
           %}

           DIGIT    [0-9]
           ID       [a-z][a-z0-9]*

           %%

           {DIGIT}+    {
                       printf( "An integer: %s (%d)\n", yytext,
                               atoi( yytext ) );
                       }

           {DIGIT}+"."{DIGIT}*        {
                       printf( "A float: %s (%g)\n", yytext,
                               atof( yytext ) );
                       }

           if|then|begin|end|procedure|function        {
                       printf( "A keyword: %s\n", yytext );
                       }

           {ID}        printf( "An identifier: %s\n", yytext );

           "+"|"-"|"*"|"/"   printf( "An operator: %s\n", yytext );

           "{"[^}\n]*"}"     /* eat up one-line comments */

           [ \t\n]+          /* eat up whitespace */

           .           printf( "Unrecognized character: %s\n", yytext );

           %%

           main( argc, argv )
           int argc;
           char **argv;
               {
               ++argv, --argc;  /* skip over program name */
               if ( argc > 0 )
                       yyin = fopen( argv[0], "r" );
               else
                       yyin = stdin;

               yylex();
               }

       これは、Pascal のような言語の単純なスキャナの原型です。異なったタイプの
       トークンを定義し、これを見つけると報告します。

       この例の詳細は、以降の節で説明します。

入力ファイルのフォーマット
       flex の入力ファイルは、3 つの部分からなり、%% だけからなる行により分け
       られます:

           定義
           %%
           ルール
           %%
           ユーザコード

       定義部分は、スキャナの宣言を単純化する単純な名前の定義の宣言と、後で説
       明する開始条件の宣言とからなります。

       名前の定義は、次の形式です:

           名前 定義

       "名前" は、語であり、文字かアンダスコア ('_') から始まって 0 個以上の文
       字、数字、'_'、'-' (ダッシュ) が続きます。定義は、名前に続く最初の非空
       白文字から始まり、行末まで続くものとされます。定義は、後で "{名前}" で
       参照でき、"(定義)" を展開します。例えば、

           DIGIT    [0-9]
           ID       [a-z][a-z0-9]*

       は、"DIGIT" が単一の数字にマッチする正規表現であると定義し、"ID" が文字
       に 0 個以上の文字か数字が続く正規表現であると定義します。後で出て来る参
       照

           {DIGIT}+"."{DIGIT}*

       は、

           ([0-9])+"."([0-9])*

       と同じであり、1 個以上の数字に '.' が続き、0 個以上の数字が続くものに
       マッチします。

       flex の入力のルールは、次の形式の一連のルールからなります:

           パターン   アクション

       ここで、パターンは、インデントされていてはならず、アクションは、同じ行
       から始まる必要があります。

       パターンとアクションの詳細は、後の解説を見て下さい。

       最後に、ユーザコードの部分は、単純にそのままの形で lex.yy.c にコピーさ
       れます。スキャナを呼び出すまたは呼び出される付随ルーチンのために使用さ
       れます。この部分はあっても無くても構いません; 無い場合には、入力ファイ
       ル中の 2 番目の %% も省略できます。

       定義とルールの部分では、インデントされたテキストと %{%} との間のテ
       キストは、そのままの形で出力にコピーされます (この際 %{} は、削除されま
       す)。%{} は、インデントされていない行に現れる必要があります。

       ルールの部分では、最初のルールの前に現れるインデントされたもしくは %{}
       部分のテキストは、スキャンルーチンにローカルな変数と、(宣言の後では) ス
       キャンルーチンに入るたびに実行されるコードとを宣言します。ルール部分の
       他のインデントされたもしくは %{} 部分のテキストは、出力にコピーされます
       が、意味はちゃんと定義されておらずコンパイル時にエラーとなるかも知れま
       せん (この仕様は、POSIX 互換のためにあります; 他のこのような仕様は、以
       降を見て下さい)。

       定義の部分 (ルールの部分ではないです) では、インデントされていないコメ
       ント ("/*" から始まる行) は、次の "*/" までそのままの形でコピーされま
       す。

パターン
       入力ファイルのパターンは、拡張した正規表現を使って記述します。以下に示
       します:

           x          文字 'x' にマッチ。
           .          改行を除く全ての文字 (バイト)。
           [xyz]      "文字クラス"; この場合、'x', 'y', 'z' のいずれにも
                        マッチします。
           [abj-oZ]   範囲指定を含む "文字クラス"; この場合、'a', 'b' と
                        'j' から 'o' までの任意の文字と 'Z' にマッチします。
           [^A-Z]     "否定文字クラス"; クラスに含まれない任意の文字に
                        マッチします。この場合、'A' から 'Z' までの大文字
                        「以外の」文字にマッチします。
           [^A-Z\n]   大文字と改行を「除く」全ての文字。
           r*         0 もしくはそれ以上の r。r は、任意の正規表現。
           r+         1 もしくはそれ以上の r。
           r?         0 もしくは 1つの r (「おまけ」の r)
           r{2,5}     2 つから 5つまでの r。
           r{2,}      2 つ以上の r。
           r{4}       ちょうど 4 つの r。
           {名前}     "名前" の定義の展開。
                      (上を参照)
           "[xyz]\"foo"
                      文字列 [xyz]"foo
           \X         X が 'a', 'b', 'f', 'n', 'r', 't', 'v' のいずれかの
                        とき、ANSI-C での \X の解釈となります。
                        それ以外の場合、文字 'X' ('*' のようなオペレータの
                        意味を打ち消し、その文字自体を指定する際に使います)。
           \123       8進数で 123 と表される文字。
           \x2a       16進数で 2a と表される文字。
           (r)        r にマッチ; () は、優先順位を変えるために使用。
                        (以下を参照)


           rs         正規表現 r に正規表現 s が続く; 「連結 (concatenation)」
                        と呼びます。


           r|s        r もしくは s。


           r/s        後ろに s が続く時の r。
                        s にマッチするテキストは、このルールの "最長適合" を判定
                        する時には含まれますが、アクションが実行される前に
                        入力に戻されます。
                        アクションは、r にマッチするテキストだけを見ます。
                        このパターンは、"右文脈 (trailing context)" と呼ばれま
                        す。
                        (flex が正確にマッチ不能な r/s の組合せは複数あります;
                        "危険な右文脈" については、
                        以降の、欠陥 / バグの節の記述を見て下さい。)
           ^r         行頭にある r。(スキャンの始まりもしくは
                        スキャンされた改行の右です)。
           r$         行末にある r。"r/\n" と等価 (改行の前です)。
                        "r/\n" と同じです。

                      flex の "改行" の表現は、flex をコンパイルした
                      C コンパイラが解釈する '\n' と完全に一致することに
                      注意して下さい;
                      特定のシステム DOS では、\r を入力から取り除くか
                      "r$" を表すために明示的に r/\r\n を使用する必要がありま
                      す。


           <s>r       開始条件 s における r。(開始条件については、以下を参照)。
           <s1,s2,s3>r
                      上に同じ。ただし開始条件は、s1, s2, s3 のいずれでもよい。
           <*>r       任意の開始条件の r。開始条件は、排他的なものでもよい。


           <<EOF>>    ファイルの終了。
           <s1,s2><<EOF>>
                      開始条件が s1 もしくは s2 であるときのファイルの終了。

       文字クラス中では、全ての正規表現のオペレータは、エスケープ ('\') および
       文字クラスオペレータである '-' と ']' とクラスの先頭の '^' を除き特別な
       意味を失うことに注意して下さい。

       上に挙げた正規表現は、優先順位によってグループに分けられています。一番
       上のグループが最も高い優先度で、一番下のグループの優先順位が最も低く
       なっています。グループ内では、同じ優先順位です。例えば、

           foo|bar*

       は、

           (foo)|(ba(r*))

       と同じです。なぜなら '*' オペレータは、連結より優先度が高く、連結は、選
       言 ('|') より優先度が高いからです。このパターンは、文字列 "foo" もしく
       は文字列 "ba" に 0 個以上の r がつづくもののどちらにもマッチします。
       "foo" もしくは 0 個以上の "bar" にマッチさせるためには、次の表現を使用
       して下さい:

           foo|(bar)*

       0 個以上の "foo" または "bar" にマッチするためには、次の表現を使用して
       下さい:

           (foo|bar)*


       文字もしくは文字範囲に加え、文字クラスも文字クラスの表現を含みます。こ
       れらの表現は、[: および :] のデリミタに囲まれます (文字クラスの '[' と
       ']' との間に現れる必要があります; 他の要素が文字クラス中に現れても構い
       ません)。有効な表現は、以下の通りです:

           [:alnum:] [:alpha:] [:blank:]
           [:cntrl:] [:digit:] [:graph:]
           [:lower:] [:print:] [:punct:]
           [:space:] [:upper:] [:xdigit:]

       これらの表現は、対応する標準 C の isXXX 関数に適合する全ての文字集合を
       指示します。例えば、[:alnum:] は、isalnum() が真を返す文字を指示します
       - すなわちすべてのアルファベットと数字です。isblank(), が無いシステムで
       は、flex は、[:blank:] を空白とタブと定義します。

       例えば以下の表現は、全て同じです:

           [[:alnum:]]
           [[:alpha:][:digit:]]
           [[:alpha:]0-9]
           [a-zA-Z0-9]

       スキャナが大文字小文字を意識しない場合 (-i フラグ指定時) [:upper:][:lower:] は、[:alpha:] と同じです。

       パターンに関する注意点です:

       -      否定文字クラス、例えば上の "[^A-Z]" は、"\n" (もしくはこれを表す
              エスケープシーケンス) が明示的に否定文字クラスに現れている場合
              (例えば "[^A-Z\n]") を除き改行にマッチします。これは、他の正規表
              現ツールが否定文字クラスを扱う方法とは異なりますが、不幸なことに
              この矛盾は、歴史的に確立しています。改行にマッチするとは、入力に
              別のクォートが存在しない場合に [^"]* のようなパターンが入力全体
              にマッチすることを意味します。

       -      ルールは、右文脈 ('/' オペレータもしくは '$' オペレータ) を高々
              一つしか持てません。開始条件 '^' と "<<EOF>>" パターンは、パター
              ンの最初になければならず、'/', '$' 同様に () 内にいれることは出
              来ません。ルールの先頭ではない '^' もしくはルールの終りではない
              '$' は、特別な意味を失い、通常の文字として扱われます。

              以下は、無効です:

                  foo/bar$
                  <sc1>foo<sc2>bar

              前者は、"foo/bar\n" と書けます。

              以下では、'$' と '^' とは通常の文字として扱われます:

                  foo|(bar$)
                  foo|^bar

              "foo" もしくは "改行が続く bar" を指定したい場合は、次の表現を使
              用して下さい (特別な '|' の動作は、後で説明します):

                  foo      |
                  bar$     /* action goes here */

              同じ方法で、foo もしくは、行頭の bar を指定可能です。

入力のマッチ方法
       生成したスキャナを実行すると、スキャナは、入力を見てパターンにマッチす
       る文字列を探します。1 より多くのマッチを見つけると、最長テキストのマッ
       チを採用します (右文脈 (trailing context rule) の後ろの部分も長さに含み
       ますが、後ろの部分は、入力に戻されます)。同じ長さのマッチを 2 つ以上見
       つけた場合、flex 入力ファイルで最初に記述されたルールを採用します。

       マッチが決定すると、マッチに対応するテキスト (トークンと呼ばれます) が
       グローバル文字ポインタ yytext により使用可能となり、長さがグローバル整
       数 yyleng により使用可能となります。その後、マッチしたパターンに対応す
       るアクションが実行され (アクションの詳細な記述は、後で行います)、残りの
       入力が残りのマッチのためにスキャンされます。

       マッチが見つからないと、デフォルトルールが実行されます: 入力の次の文字
       がマッチしたと見なされ、標準出力にコピーされます。最も簡単で正当な flex
       の入力は、以下の通りです:

           %%

       これは、入力を単純に出力にコピー (1 度に 1 文字ずつ) するスキャナを生成
       します。

       yytext は、2 つの異なった方法により定義されうることに注意して下さい: 文
       字ポインタもしくは文字配列です。flex がどちらの定義を使用するかは、特別
       なディレクティブ %pointer もしくは %array を flex の入力の最初の (定義)
       部分に含めることにより制御できます。デフォルトは、%pointer であり、-l
       lex 互換オプションを使用した場合には、例外的に yytext は、配列になりま
       す。%pointer を使用する利点は、スキャンが高速であること、非常に大きな
       トークンにマッチする時にも (動的メモリを使用し尽くさない限り) バッファ
       オーバフローとならないことです。欠点は、アクションが yytext を修正する
       ことが制限されること (次節参照)、unput() 呼び出しが yytext の現在の内容
       を破壊することです。これは、異なる lex バージョン間での移植性に関する頭
       痛の種です。

       %array の利点は、yytext の内容を思った通りに変更できること、unput() を
       呼び出しても yytext の内容が破壊されないことです (下記参照)。その上、既
       存の lex プログラムは、yytext を外部から次の形式の宣言を使用してアクセ
       スしていることがあります:
           extern char yytext[];
       この定義は、%pointer 使用時には、誤りですが、%array 使用時には、正しい
       です。

       %array は、yytext を文字数 YYLMAX (デフォルトは、十分大きな値) の配列で
       あると定義します。この大きさは、flex の入力の最初の部分で単純に YYLMAX
       を異なった値に #define することにより変更できます。上記の通り、%pointer
       使用時には、yytext は、大きなトークンを格納するために動的に大きくなりま
       す。このことは、%pointer を使用したスキャナは、非常に大きなトークン (例
       えばコメントブロック全体) を格納可能であることを意味しますが、スキャナ
       が yytext の大きさを変えるたびにトークン全体を先頭から再スキャンするこ
       とが必要となるためこのようなトークンに対するマッチングは、遅くなりうる
       ことを覚えておいて下さい。現在、yytext は、unput() が結果として返すテキ
       ストが大きい時には、動的には大きくなりません; 実行時エラーとなります。

       また、%array は、C++ スキャナクラスでは、使用できないことに注意して下さ
       い (c++ オプションに関しては、下記参照)。

アクション
       ルール中のパターンは、対応するアクションを持ちます。アクションは、任意
       の C の文です。パターンは、最初のエスケープされていない空白文字で終りま
       す; 行の残りがアクションです。アクションが空である場合、パターンがマッ
       チした時に入力トークンは、単純に捨てられます。例えば入力から全ての "zap
       me" を削除するプログラムの仕様を示します:

           %%
           "zap me"

       (入力の他の全ての文字を出力にコピーします。なぜならデフォルトルールに
       マッチするからです。)

       次は、複数の空白や文字を単一の空白に圧縮し行末の空白を捨てるプログラム
       です:

           %%
           [ \t]+        putchar( ' ' );
           [ \t]+$       /* ignore this token */


       アクションが '{' を含む場合、アクションは、対応する '}' まで続き、複数
       行に渡る場合もあります。flex は、C の文字列およびコメントに関して知って
       おり、それらの中のブレースを誤解することはありませんが、アクションが %{
       で始まることを許し、次の %} までのテキストがアクションであるとします
       (アクション内部の任意個のブレースには、関係ありません)。

       垂直バー ('|') のみからなるアクションは、"次のルールと同じ" を意味しま
       す。説明は、以下を見て下さい。

       アクションは、任意の C コードを含むことが出来ます。これには、yylex() を
       呼び出したルーチンに対して値を返す return 文も含まれます。yylex() が呼
       ばれるたび、最後に残ったトークンから処理を再開し、ファイルの終了もしく
       は return を実行するまで処理を行います。

       アクションは、自由に yytext を変更できますが、例外は、長さを増やすこと
       です (文字を末尾に加えることになり、これは、入力ストリームの後続する文
       字を上書きします)。これは、%array 使用時には当てはまりません (上述); こ
       の場合 yytext を自由に変更できます。

       アクションは、自由に yyleng を変更できますが、アクションが yymore() を
       使用する時には、例外的に変更してはいけません (後述)。

       多くの特別なディレクティブがあり、アクション中に含めることが出来ます:

       -      ECHO yytext をスキャナの出力にコピーします。

       -      BEGIN 後ろに開始条件の名前を書くと、スキャナを対応する開始条件に
              設定します (後述)。

       -      REJECT 入力 (もしくは入力の頭) に "2 番目によく (second best)"
              マッチするルールに進むようにスキャナに指示します。"入力のマッチ
              方法" で示したようにルールは、選択され、yytextyyleng は、適
              切に設定されます。選択されるルールは、最初に選択されたルールと同
              じ長さであるが flex の入力ファイルにて後で出て来るもの、もしくは
              少ない文字数にマッチするものです。例えば次の例では、入力中の語を
              数え、"frob" が見つかるたびにルーチン special() を呼びます:

                          int word_count = 0;
                  %%

                  frob        special(); REJECT;
                  [^ \t\n]+   ++word_count;

              REJECT が無い場合、入力中の "frob" は、語として数えられず、ス
              キャナは、通常通りトークン毎に 1 つのアクションだけを行います。
              複数の REJECT を使用可能であり、それぞれ現在有効なルールの次に良
              い選択を見つけます。例えば次のスキャナは、"abcd" というトークン
              をスキャンし、出力に "abcdabcaba" を書きます:

                  %%
                  a        |
                  ab       |
                  abc      |
                  abcd     ECHO; REJECT;
                  .|\n     /* eat up any unmatched character */

              (前の 3 つのルールは、4 番目のルールのアクションを共有します。な
              ぜなら特別な '|' アクションが使用されているからです。) REJECT
              は、スキャナの性能という点で特にコストのかかる機能です; もしス
              キャナのアクションのいずれかにでも REJECT が使われたなら、スキャ
              ナの全てのマッチング速度を低下させるということです。さらに
              REJECT をオプション -Cf-CF と共に用いることは出来ません。

              また、他の特別アクションと違い REJECT は、分岐 (branch) であるこ
              とに注意してください; すなわち REJECT 直後のアクションは、実行さ
              れません。

       -      yymore() 次にルールとマッチしたときには、対応するトークンは、現
              在の yytext の内容と入れ換えるのではなく yytext に追加するようス
              キャナに指示します。例えば、入力 "mega-kludge" が与えられると、
              以下は、"mega-mega-kludge" を出力に書きます:

                  %%
                  mega-    ECHO; yymore();
                  kludge   ECHO;

              最初の "mega-" は、マッチし出力にエコーされます。次に "kludge"
              がマッチしますが、直前の "mega-" がまだ yytext の先頭に残ってお
              り、"kludge" の ECHO ルールは、実際には、"mage-kludge" を書きま
              す。

       yymore() の使用に関し 2 つの注意点があります。まず、yymore() は、現在の
       トークンの大きさを反映する yyleng の値の正確さに依存することであり、
       yymore() 使用時には、yyleng を変更してはなりません。次に、スキャナのア
       クションに yymore() があると、スキャナのマッチ速度に若干悪影響がありま
       す。

       -      yyless(n) 現在のトークンから最初の n 文字を除いたものを入力スト
              リームに戻します。戻した文字列は、スキャナが次のマッチングをとる
              ときに再度スキャンされます。yytextyyleng は、適切に調整され
              ます (例えば yyleng は、n となります)。例えば、入力 "foobar" が
              与えられると、以下は、"foobarbar" を書きます:

                  %%
                  foobar    ECHO; yyless(3);
                  [a-z]+    ECHO;

              引数 0 を yyless に与えると、現在の入力文字列全体が再度スキャン
              されます。(例えば BEGIN を使用して) 次にスキャナが入力する方法を
              変更していないと、無限ループとなります。

       yyless は、マクロであり、flex 入力ファイルでのみ使用可能であり、別の
       ソースファイルからは、使用不能であることに注意して下さい。

       -      unput(c) 文字 c を入力ストリームへ戻します。戻した文字は、次にス
              キャンされる文字になります。次のアクションは、現在のトークンを取
              り上げ、括弧内に入れて再スキャンします。

                  {
                  int i;
                  /* Copy yytext because unput() trashes yytext */
                  char *yycopy = strdup( yytext );
                  unput( ')' );
                  for ( i = yyleng - 1; i >= 0; --i )
                      unput( yycopy[i] );
                  unput( '(' );
                  free( yycopy );
                  }

              unput() は、文字を入力ストリームの先頭に戻すので、文字列を戻す場
              合には、後ろから前に向かって戻す必要があります。

       unput() 使用時の重要な潜在的な問題は、%pointer 使用時 (デフォルト) に
       unput() を呼び出すと、右端の文字から開始し 1 文字ずつ左に向かって消費さ
       れ、yytext の内容が破壊されることです。(上記例のように) unput() 呼び出
       し後も yytext の内容を保存するためには、始めに別の場所にコピーするか、
       スキャナを %array を使うように構築することです (入力のマッチ方法参照)。

       最後に、EOF を戻して入力ストリームにファイルの終りをマークするとは出来
       ないことに注意して下さい。

       -      input() 次の文字を入力ストリームから読みます。次の例は、C コメン
              トを食べます:

                  %%
                  "/*"        {
                              int c;

                              for ( ; ; )
                                  {
                                  while ( (c = input()) != '*' &&
                                          c != EOF )
                                      ;    /* eat up text of comment */

                                  if ( c == '*' )
                                      {
                                      while ( (c = input()) == '*' )
                                          ;
                                      if ( c == '/' )
                                          break;    /* found the end */
                                      }

                                  if ( c == EOF )
                                      {
                                      error( "EOF in comment" );
                                      break;
                                      }
                                  }
                              }

              (スキャナが C++ でコンパイルされたときは、input() は、yyinput()
              という名称になり、C++ ストリームの input と名前が衝突することを
              避けます。)

       -      YY_FLUSH_BUFFER スキャナの内部バッファをフラッシュし、次にスキャ
              ナがトークンをマッチしようとした時バッファを YY_INPUT にてリフィ
              ルします (生成されたスキャナで後述)。このアクションは、複数の入
              力バッファにおいて後述するより一般的な yy_flush_buffer() 関数の
              特別なケースです。

       -      yyterminate() アクションの return 文の代わりに使うことが出来ま
              す。yyterminate() は、スキャナを終了し、"全て終了" を意味する 0
              を呼び出し元関数に返します。デフォルトでは、yyterminate() は、
              ファイルの終わりに達したときにも呼ばれます。yyterminate() は、マ
              クロであり、定義しなおすことができます。

生成されたスキャナ
       flex の出力は、lex.yy.c というファイルであり、スキャンルーチン yylex()
       と、トークンのマッチングに使用する複数のテーブルと、複数の付属ルーチン
       とマクロからなります。デフォルトでは、yylex() は、次のように宣言されま
       す:

           int yylex()
               {
               ... various definitions and the actions in here ...
               }

       (環境が関数プロトタイプをサポートしている場合、"int yylex( void )" とな
       ります。) この定義は、"YY_DECL" マクロを定義することにより変更できま
       す。例えば次のように使用することが出来ます:

           #define YY_DECL float lexscan( a, b ) float a, b;

       これは、スキャンルーチンの名前を lexscan とし、浮動小数点数を返すように
       し、2 つの浮動小数点数を引数とします。K&R の非プロトタイプの関数宣言を
       使用してスキャンルーチンに対して引数を与える場合、定義をセミコロン (;)
       で終了する必要があります。

       yylex() は、呼ばれるたび、グローバル入力ファイル yyin (デフォルトでは、
       標準入力) からトークンをスキャンします。ファイルの終りになる (この場合
       0 を返します) か、アクションが return 文を実行するまで、実行を続けま
       す。

       スキャナがファイルの終りに到達すると、yyin が新たなファイルを指さないか
       (新たなファイルを指す場合は、このファイルのスキャンを続けます)、
       yyrestart() が呼ばれない限り、後続する呼び出しは、未定義です。
       yyrestart() は、FILE * ポインタ (YY_INPUT を設定して yyin 以外のソース
       をスキャンするようにした場合には、nil も可です) である引数を 1 つとり、
       そのファイルからのスキャンのために yyin を初期化します。本質的に、yyin
       を新しい入力ファイルに割り当てることと yyrestart() を使用することとは同
       じです; 後者は、前のバージョンの flex との互換性のために使用可能であ
       り、またスキャンの途中で入力ファイルを変えることが可能です。引数を yyin
       として呼び出すことにより、現在の入力バッファを捨てることも出来ます; た
       だし、YY_FLUSH_BUFFER (上述) を使用する方が良いです。yyrestart() は、
       INITIAL の開始条件を変更しないことに注意して下さい (後述の開始条件参
       照)。

       あるアクション中で return 文を実行することにより yylex() がスキャンを止
       めた場合、スキャナは、再度呼び出し可能であり、この場合スキャンの残りの
       部分から再開します。

       デフォルトで (効率のため)、スキャナは、単純な getc() コールではなくブ
       ロックリードを行い、yyin から文字を読みます。入力取得方法は、YY_INPUT
       マクロを定義することにより制御できます。YY_INPUT 呼び出し手順は、
       "YY_INPUT(buf,result,max_size)" です。このアクションは、buf 文字配列中
       に最大 max_size 文字を用意し、整数変数 result 中に読めた文字数もしくは
       定数 YY_NULL (Unix システムでは、0) を入れて返します。デフォルトの
       YY_INPUT は、グローバルファイルポインタ "yyin" から読みます。

       YY_INPUT のサンプル定義です (入力ファイルの定義部に格納):

           %{
           #define YY_INPUT(buf,result,max_size) \
               { \
               int c = getchar(); \
               result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \
               }
           %}

       この定義により、入力処理は、1 度に 1 文字ずつ行うように変更されます。

       スキャナが YY_INPUT からファイルの終りを通知された場合、スキャナは、
       yywrap() 関数をチェックします。yywrap() 関数が偽 (0) を返す場合、関数
       は、続行中であるとされ、yyin を別の入力ファイルを指すように設定し、ス
       キャンを続行します。関数が真 (非 0) を返す場合、スキャナは、終了し、呼
       び出し元に 0 を返します。どちらの場合も開始条件は、変化しないことに注意
       して下さい; つまり INITIAL には戻りません。

       独自の yywrap() を設定しない場合、%option noyywrap (この場合スキャナ
       は、yywrap() が 1 を返したかのように動作します) を使用するか、フラグ
       -ll を指定してデフォルトのルーチン (常に 1 を返します) を使用しなければ
       なりません。

       ファイルではなくメモリ中のバッファからスキャンするための 3 つのルーチン
       を使用可能です: yy_scan_string(), yy_scan_bytes(), yy_scan_buffer()。こ
       れらに関する議論は、複数の入力バッファの節を参照してください。

       スキャナは、自己の ECHO 出力を yyout グローバル (デフォルトでは、標準出
       力であり、別の FILE ポインタに割り当てることで再定義できます) に書きま
       す。

開始条件
       flex は、条件的に有効となるルールのための機構を提供します。パターンのプ
       レフィックスが "<sc>" となっているルールは、スキャナが "sc" という名前
       の開始条件にいる場合のみ有効です。例えば、

           <STRING>[^"]*        { /* eat up the string body ... */
                       ...
                       }

       は、スキャナが "STRING" 開始条件にいる時のみ有効であり、

           <INITIAL,STRING,QUOTE>\.        { /* handle an escape ... */
                       ...
                       }

       は、現在の開始条件が、"INITIAL", "STRING", "QUOTE" のいずれかの場合のみ
       有効です。

       開始条件は、入力の定義 (先頭) 部において、インデントされない行で %s も
       しくは %x から始まり名前が続く行において宣言されます。前者は、内包的開
       始条件を、後者は、排他的開始条件を、それぞれ宣言します。開始条件を有効
       にするのは、BEGIN アクションです。次の BEGIN アクションが実行されるま
       で、与えられた開始条件のルールは、有効であり、他の開始条件のルールは、
       無効です。開始条件が内包的な場合、開始条件を持たないルールもまた有効で
       す。開始条件が排他的な場合、開始条件を満たすルールだけが有効です。同じ
       排他開始条件に依存するルールの組は、flex 入力中の別のルールとは、独立な
       スキャナを記述します。そのため、排他開始条件を使用すれば、"ミニスキャ
       ナ" (別部分とは、文法的に異なる部分 (例えばコメント) に対するスキャナ)
       を簡単に指定できます。

       内包的開始条件と排他的開始条件とがまだ少し曖昧であるなら、両者の関係を
       表す例を示して説明します。以下のルールの組:

           %s example
           %%

           <example>foo   do_something();

           bar            something_else();

       は、

           %x example
           %%

           <example>foo   do_something();

           <INITIAL,example>bar    something_else();

       と等価です。<INITIAL,example> が無いと、2 番目の例における bar パターン
       は、開始条件が example の場合、有効となりません (すなわちマッチしませ
       ん)。<example> だけを bar につけると、example だけにおいて有効となり、
       INITIAL では有効となりません。一方、最初の例では、どちらの場合でも有効
       です。なぜなら最初の例では、example 開始条件は、内包的 (%s) 開始条件だ
       からです。

       特殊な開始条件指定子 <*> は、全ての開始条件にマッチすることに注意して下
       さい。このため、上の例は、次のようにも書けます;

           %x example
           %%

           <example>foo   do_something();

           <*>bar    something_else();


       デフォルトルール (マッチしなかった文字に対しては、ECHO です) は、開始条
       件中でも有効です。これは、次のものと等価です:

           <*>.|\n     ECHO;


       BEGIN(0) は、開始条件の無いルールだけが有効である、最初の状態に戻りま
       す。この状態は、開始条件 "INITIAL" として参照できるため、BEGIN(INITIAL)
       は、BEGIN(0) と等価です。(開始条件名を括る括弧は、不要ですが、良いスタ
       イルであるとされています。)

       BEGIN アクションは、ルール部の先頭のインデントされたコード中に現れても
       良いです。例えば以下の例では、yylex() が呼ばれグローバル変数
       enter_special が真の場合には、スキャナは、"SPECIAL" 開始条件に入ります:

                   int enter_special;

           %x SPECIAL
           %%
                   if ( enter_special )
                       BEGIN(SPECIAL);

           <SPECIAL>blahblahblah
           ...more rules follow...


       開始条件を説明するために、"123.456" のような文字列を 2 通りの異なった解
       釈をするスキャナを示します。デフォルトでは、これは、整数 "123" とドット
       ('.') と整数 "456" の 3 トークンに数えられます。しかし、この文字列の前
       に "expect-floats" の文字列がある場合、これは、単一のトークンであるとさ
       れ、浮動小数点数 123.456 とされます:

           %{
           #include <math.h>
           %}
           %s expect

           %%
           expect-floats        BEGIN(expect);

           <expect>[0-9]+"."[0-9]+      {
                       printf( "found a float, = %f\n",
                               atof( yytext ) );
                       }
           <expect>\n           {
                       /* that's the end of the line, so
                        * we need another "expect-number"
                        * before we'll recognize any more
                        * numbers
                        */
                       BEGIN(INITIAL);
                       }

           [0-9]+      {
                       printf( "found an integer, = %d\n",
                               atoi( yytext ) );
                       }

           "."         printf( "found a dot\n" );

       次は、C のコメントを理解 (して捨てる) 一方で、現在の入力行を数えるス
       キャナです。

           %x comment
           %%
                   int line_num = 1;

           "/*"         BEGIN(comment);

           <comment>[^*\n]*        /* eat anything that's not a '*' */
           <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
           <comment>\n             ++line_num;
           <comment>"*"+"/"        BEGIN(INITIAL);

       このスキャナは、各ルールで可能な最大のテキストにマッチしようとする場
       合、ちょっとした問題が起こります。一般的には、高速なスキャナを記述する
       場合、各ルールで最大のマッチを得ようとすることが最も成功します。

       開始条件名は、実際には、整数値であり、格納することが出来ることに注意し
       て下さい。そのため、上記例は、以下のように拡張できます:

           %x comment foo
           %%
                   int line_num = 1;
                   int comment_caller;

           "/*"         {
                        comment_caller = INITIAL;
                        BEGIN(comment);
                        }

           ...

           <foo>"/*"    {
                        comment_caller = foo;
                        BEGIN(comment);
                        }

           <comment>[^*\n]*        /* eat anything that's not a '*' */
           <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
           <comment>\n             ++line_num;
           <comment>"*"+"/"        BEGIN(comment_caller);

       さらに、現在の開始条件を整数値であるマクロ YY_START にてアクセスできま
       す。例えば、上記の comment_caller への代入は、次のように記述できます。

           comment_caller = YY_START;

       flex は、YYSTATEYY_START のエイリアスとして提供します (AT&T の lex
       が使用しています)。

       開始条件は、独自の名前空間を持たないことに注意して下さい; %s や %x の宣
       言における名前宣言の扱いは、#define と同じです。

       最後に、排他的開始条件を使用する、展開されたエスケープシーケンスを含む
       (長すぎる文字列のチェックは含みません) C スタイルのクォート文字列への
       マッチ方法を示します:

           %x str

           %%
                   char string_buf[MAX_STR_CONST];
                   char *string_buf_ptr;


           \"      string_buf_ptr = string_buf; BEGIN(str);

           <str>\"        { /* saw closing quote - all done */
                   BEGIN(INITIAL);
                   *string_buf_ptr = '\0';
                   /* return string constant token type and
                    * value to parser
                    */
                   }

           <str>\n        {
                   /* error - unterminated string constant */
                   /* generate error message */
                   }

           <str>\\[0-7]{1,3} {
                   /* octal escape sequence */
                   int result;

                   (void) sscanf( yytext + 1, "%o", &result );

                   if ( result > 0xff )
                           /* error, constant is out-of-bounds */

                   *string_buf_ptr++ = result;
                   }

           <str>\\[0-9]+ {
                   /* generate error - bad escape sequence; something
                    * like '\48' or '\0777777'
                    */
                   }

           <str>\\n  *string_buf_ptr++ = '\n';
           <str>\\t  *string_buf_ptr++ = '\t';
           <str>\\r  *string_buf_ptr++ = '\r';
           <str>\\b  *string_buf_ptr++ = '\b';
           <str>\\f  *string_buf_ptr++ = '\f';

           <str>\\(.|\n)  *string_buf_ptr++ = yytext[1];

           <str>[^\\\n\"]+        {
                   char *yptr = yytext;

                   while ( *yptr )
                           *string_buf_ptr++ = *yptr++;
                   }


       上記例のように同一の開始条件を持つ全てのルールの前に開始条件を書かねば
       ならないことが多いです。flex は、これを簡単かつ綺麗にするため開始条件ス
       コープを導入しました。開始条件スコープは、次のように始まります:

           <SCs>{

       ここで SCs は、1 つ以上の開始条件のリストです。開始条件スコープ内では、
       最初の '{' にマッチするまでの '}' において、全てのルールは、自動的に
       <SCs> のプレフィックスが付きます。そのため、例えば

           <ESC>{
               "\\n"   return '\n';
               "\\r"   return '\r';
               "\\f"   return '\f';
               "\\0"   return '\0';
           }

       は、次のものと等価です:

           <ESC>"\\n"  return '\n';
           <ESC>"\\r"  return '\r';
           <ESC>"\\f"  return '\f';
           <ESC>"\\0"  return '\0';

       開始条件スコープは、ネストすることが出来ます。

       開始条件のスタックを制御するために 3 つのルーチンを使用可能です:

       void yy_push_state(int new_state)
              現在の開始条件を開始条件スタックの先頭にプッシュし、BEGIN
              new_state を使用したかのように new_state に切り替えます (開始条
              件名は、整数値でもあることを思い出して下さい)。

       void yy_pop_state()
              スタックの先頭をポップし、BEGIN を使用してその開始条件に切り替え
              ます。

       int yy_top_state()
              スタックの内容を変更せずに、スタックの先頭を返します。

       開始条件スタックは、動的に大きくなり、また組み込み時のサイズ制限はあり
       ません。メモリを使い切ると、プログラム実行は、中止されます。

       開始条件スタックを使用するためには、スキャナは、%option stack ディレク
       ティブをインクルードする必要があります (下記オプションを参照してくださ
       い)。

複数の入力バッファ
       スキャナによっては、(ファイルの "include" をサポートする等) 複数の入力
       ストリームを扱う必要があります。flex スキャナでは、大きなバッファリング
       を行うため、スキャンコンテキストに影響される YY_INPUT を単純に書き換え
       るだけでは、次の入力がどこから読まれるのかを制御できません。YY_INPUT が
       呼ばれるのはスキャナがバッファの終りに到達する時だけですので、例えば
       "include" のように入力元を切り替える必要のある文をスキャンした後でも長
       時間を費す場合があります。

       この様な問題を解決するため、flex は、複数の入力バッファを生成して切り替
       える機構を提供します。入力バッファは、次のように生成されます:

           YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )

       これは、FILE ポインタと size を取り、与えられる file に関連し size 文字
       を保持するに十分なバッファを生成します (疑わしい場合には、size には、
       YY_BUF_SIZE を使用して下さい)。これは、別のルーチン (下記参照) に渡すた
       めの YY_BUFFER_STATE ハンドルを返します。YY_BUFFER_STATE のタイプは、
       struct yy_buffer_state 構造体へのポインタであるため、安全のため
       YY_BUFFER_STATE 変数を ((YY_BUFFER_STATE) 0) と初期化することが出来、ス
       キャナではなくソースファイルにおいて入力バッファを正しく宣言するために
       この構造体を参照することが出来ます。yy_create_buffer 呼び出しにおける
       FILE ポインタは、YY_INPUT から見える yyin の値と同じようにだけ使用され
       ることに注意して下さい; YY_INPUT を再定義して yyin を使わないようにする
       ことにより、yy_create_buffer に対して安全に nil の FILE ポインタを渡せ
       ます。スキャンするバッファを選択するためには、次のようにします:

           void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )

       これは、スキャナの入力バッファを切り替え、トークンが new_buffer から来
       るようになります。新たなファイルをオープンして yyin を指すのではなく、
       スキャンを継続するために yywrap() から yy_switch_to_buffer() を使用する
       ことがあることに注意して下さい。また、yy_switch_to_buffer() または
       yywrap() による入力元の切り替えは、開始条件を変更しないことにも注意して
       下さい。

           void yy_delete_buffer( YY_BUFFER_STATE buffer )

       は、バッファに関連づけられたストレージの返還要求に使用します。(buffer
       は、nil でも構いませんがこの場合このルーチンは、何もしません。) 現在の
       バッファの内容をクリアするには次のようにします:

           void yy_flush_buffer( YY_BUFFER_STATE buffer )

       この関数は、バッファの内容を捨てるため、次にスキャナがこのバッファと
       トークンのマッチを行う場合、スキャナは、まず YY_INPUT を使用してこの
       バッファをフィルします。

       yy_new_buffer() は、yy_create_buffer() のエイリアスであり、動的オブジェ
       クトの生成と破壊のために使用する C++ の newdelete との互換性のため
       に提供しています。

       最後に YY_CURRENT_BUFFER マクロは、現在のバッファに対する
       YY_BUFFER_STATE ハンドルを返します。

       この機能を使用してインクルードファイルを展開するスキャナの記述例です
       (<<EOF>> 機能は、後述します):

           /* the "incl" state is used for picking up the name
            * of an include file
            */
           %x incl

           %{
           #define MAX_INCLUDE_DEPTH 10
           YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
           int include_stack_ptr = 0;
           %}

           %%
           include             BEGIN(incl);

           [a-z]+              ECHO;
           [^a-z\n]*\n?        ECHO;

           <incl>[ \t]*      /* eat the whitespace */
           <incl>[^ \t\n]+   { /* got the include file name */
                   if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
                       {
                       fprintf( stderr, "Includes nested too deeply" );
                       exit( 1 );
                       }

                   include_stack[include_stack_ptr++] =
                       YY_CURRENT_BUFFER;

                   yyin = fopen( yytext, "r" );

                   if ( ! yyin )
                       error( ... );

                   yy_switch_to_buffer(
                       yy_create_buffer( yyin, YY_BUF_SIZE ) );

                   BEGIN(INITIAL);
                   }

           <<EOF>> {
                   if ( --include_stack_ptr < 0 )
                       {
                       yyterminate();
                       }

                   else
                       {
                       yy_delete_buffer( YY_CURRENT_BUFFER );
                       yy_switch_to_buffer(
                            include_stack[include_stack_ptr] );
                       }
                   }

       ファイルではなくメモリ上の文字列をスキャンするための入力バッファを設定
       するための 3 つのルーチンを使用可能です。いずれも文字列をスキャンする新
       しい入力バッファを生成し、対応する YY_BUFFER_STATE ハンドル (終了時に
       は、yy_delete_buffer() にて消去します) を返します。新しいバッファに切り
       替える時には、yy_switch_to_buffer() を使用し、次の yylex() の呼び出し時
       には、この文字列をスキャン開始します。

       yy_scan_string(const char *str)
              NUL ターミネートされた文字列をスキャンします。

       yy_scan_bytes(const char *bytes, int len)
              len バイト (NUL が含まれるかも知れません) を位置 bytes からス
              キャンします。

       どちらの関数も文字列もしくはバイト列のコピーを生成してからスキャンしま
       す。(yylex() は、スキャンするバッファの内容を変更するため、これが望まし
       いのです。) コピーを避けるためには、次のようにします:

       yy_scan_buffer(char *base, yy_size_t size)
              バッファ内で base から size バイトの長さをスキャンします。最後の
              2 バイトは、YY_END_OF_BUFFER_CHAR (ASCII NUL) である必要がありま
              す。これらの最後の 2 バイトは、スキャンされません; そのためス
              キャンの内容は、base[0] から base[size-2] までで両端を含みます。

              この様になるように base を設定しなかった場合 (つまり最後の 2 つ
              の YY_END_OF_BUFFER_CHAR バイトを忘れた場合)、yy_scan_buffer()
              は、新しいバッファを生成するのではなく nil ポインタを返します。

              型 yy_size_t は、整数型であり、バッファの大きさを反映する整数式
              をこの型にキャストすることが出来ます。

ファイルの終りのルール
       特別ルール "<<EOF>>" は、ファイルの終了時もしくは yywrap() が非 0 (すな
       わち処理するファイルが無いことを表す) の時に行われるべきアクションを表
       します。アクションは、以下の 4 つのうちのいずれかで終る必要があります。

       -      yyin に新しいファイルを割り当てる (前のバージョンの flex では、
              割り当て後に特別なアクション YY_NEW_FILE を呼び出す必要がありま
              した; 今では不要です。);

       -      return 文を実行する;

       -      特別な yyterminate() アクションを実行する;

       -      yy_switch_to_buffer() を使用して新たなバッファに切り替える (上記
              例で示した通り)。

       <<EOF>> ルールを他のパターンと共に使用してはなりません; 他のパターン
       は、開始条件のリストともにだけ満たされるからです。満たされない <<EOF>>
       ルールが与えられた場合、<<EOF>> アクションをまだ持っていない全ての開始
       条件に適用されます。<<EOF>> ルールを最初の開始条件だけに指定するために
       は、次のようにして下さい。

           <INITIAL><<EOF>>


       これらのルールは、閉じていないコメントを捕まえる場合等に便利です。例え
       ば:

           %x quote
           %%

           ...other rules for dealing with quotes...

           <quote><<EOF>>   {
                    error( "unterminated quote" );
                    yyterminate();
                    }
           <<EOF>>  {
                    if ( *++filelist )
                        yyin = fopen( *filelist, "r" );
                    else
                       yyterminate();
                    }


雑多なマクロ
       マクロ YY_USER_ACTION には、マッチルールアクションに先だって常に行うア
       クションを定義できます。例えば、yytext を小文字に変換するルーチンを呼ぶ
       ように #define 出来ます。YY_USER_ACTION 起動時には、変数 yy_act は、
       マッチしたルールの番号を与えます (ルールは、1 番から数えます)。各ルール
       がマッチする頻度を知りたい場合を想像して下さい。以下に仕掛けを示します:

           #define YY_USER_ACTION ++ctr[yy_act]

       ここで ctr は、配列であり、それぞれのルールがマッチした回数を計数しま
       す。マクロ YY_NUM_RULES は、ルールの総数を表すため (-s を使った時でさえ
       デフォルトルールを含みます)、正しい ctr の宣言は、次のようになります:

           int ctr[YY_NUM_RULES];


       マクロ YY_USER_INIT には、最初のスキャンの前に常に行うアクションを再定
       義できます (スキャナの内部初期化の前に行われます)。例えばデータ表を読み
       込んだり、ログファイルをオープンするために使用できます。

       マクロ yy_set_interactive(is_interactive) は、現在のバッファが対話的と
       見なされているか否かを制御するために使用します。対話的なバッファの処理
       は、遅くなりますが、スキャナの入力元が対話的でありバッファをフィルする
       のを待つことに起因する問題を避けるためには、指定しなければなりません
       (以下の -I %option interactive フラグに関する議論を参照してください)。
       マクロ起動時に非 0 を指定するとバッファは、対話的になり、0 を指定すると
       非対話的になります。このマクロの使用は、%option interactive , %option
       always-interactive , %option never-interactive に優先します (下記オプ
       ションを参照してください)。バッファをスキャンして対話的である (もしくは
       でない) と判断される前に、yy_set_interactive() を起動して下さい。

       マクロ yy_set_bol(at_bol) は、現在のバッファにおける次のトークンに対す
       るマッチのためのスキャンが行頭から始まるか否かを制御します。非 0 のマク
       ロ引数は、'^' が付いたルールを有効にしますが、0 のマクロ引数は、'^' が
       付いたルールを無効にします。

       現在のバッファからスキャンされた次のトークンが有効な '^' ルールを持つ
       時、マクロ YY_AT_BOL() は、真を返します。そうでない場合は、偽を返しま
       す。

       生成されたスキャナでは、全てのアクションは、大きな一つの switch 文に集
       められ、YY_BREAK で分けられています。YY_BREAK は、再定義可能です。デ
       フォルトでは、それぞれのルールのアクションを分けるための単なる "break"
       です。YY_BREAK を再定義することにより、例えば C++ ユーザが #define
       YY_BREAK を何もしないように定義し (ただし全てのルールが "break" か
       "return" で終るように注意しなければなりません!)、ルールのアクションが
       "return" で終ることにより YY_BREAK がアクセスできないことに起因する、到
       達できない文があるという警告を避けることが出来ます。

ユーザが使用可能な値
       この節では、ユーザがルールのアクション部分で使用可能な値をまとめます。

       -      char *yytext 現トークンのテキストを保持しています。内容を変更し
              ても構いませんが、その長さを伸ばしてはいけません (終りに文字を追
              加してはいけない)。

              スキャナの記述の最初の部分に特別な指示である %array が書かれてい
              るとき、yytext は、char yytext[YYLMAX] と定義されます。YYLMAX
              は、マクロで、デフォルトの値 (多くの場合 8KB) を変更したい場合に
              は、最初の部分で再定義可能です。%array を使うといくらか遅いス
              キャナになりますが、yytext の値は、input()unput() の呼び出し
              でも破壊されなくなります。yytext が文字ポインタである場合、これ
              らの関数呼び出しは、yytext を破壊する可能性があります。%array と
              対称な指定 %pointer がデフォルトです。

              C++ のスキャナクラスを生成する (オプション -+) ときには、%array
              は、使えません。

       -      int yyleng 現トークンの長さを保持しています。

       -      FILE *yyin は、デフォルトで flex が読むファイルです。再定義する
              ことは、可能ですが、スキャンを始める前か EOF に到達した後でのみ
              再定義は、意味を持ちます。スキャンの途中で変更すると予想外の結果
              をもたらします。というのも flex は、入力をバッファリングしている
              からです; そのような場合には、直接再定義せず yyrestart() を使っ
              て下さい。ファイルの終わりでスキャンが終了した場合には、yyin を
              新しい入力ファイルに割り当て、再びスキャナを呼び出してスキャンを
              続けることが出来ます。

       -      void yyrestart( FILE *new_file ) を呼ぶことで yyin が新しい入力
              ファイルを指すように出来ます。新しいファイルへの変更は、すぐに行
              われます (それまでにバッファに読み込まれていた入力は、失われま
              す)。yyin を引数として yyrestart() を呼ぶと、現在の入力バッファ
              を捨てて同じ入力ファイルをスキャンし続けることに注意して下さい。

       -      FILE *yyout は、ECHO アクションが行われる対象のファイルです。
              ユーザが再割当することが出来ます。

       -      YY_CURRENT_BUFFER カレントバッファの YY_BUFFER_STATE ハンドルを
              返します。

       -      YY_START 現在の開始条件に対応する整数値を返します。続いてこの値
              を BEGIN と共に使うことで、スキャナをその開始条件へ戻すことが出
              来ます。

YACC とのインタフェース
       flex の主な使用方法の一つは、yacc パーサジェネレータと共に使用すること
       です。yacc パーサは、yylex() と言う名前のルーチンを呼び、次の入力トーク
       ンを見つけるものとしています。このルーチンは、次のトークンの型を返し、
       関連する値をグローバルの yylval に格納するものとされています。flexyacc と共に使うには、yacc-d オプションを指定して、yacc の入力に現れ
       る全ての %tokens の定義を含む y.tab.h ファイルを生成させます。このファ
       イルは、flex スキャナにインクルードされます。例えばトークンの一つが
       "TOK_NUMBER" である場合、スキャナの一部分は、次のようになっています:

           %{
           #include "y.tab.h"
           %}

           %%

           [0-9]+        yylval = atoi( yytext ); return TOK_NUMBER;


オプション
       flex には、以下のようなオプションがあります:

       -b, --backup
              バックアップ情報を lex.backup に出力します。このファイルには、ス
              キャナのバックアップ (backing-up) を必要とする状態とそれに対応す
              る入力文字の一覧がリストされます。ルールを追加することでバック
              アップ状態を取り除くことができます。バックアップ状態が全て取り除
              かれ、-Cf または -CF を指定すると、生成されたスキャナの実行速度
              が向上します (-p フラグを見て下さい)。スキャナをぎりぎりまで最適
              化しようとしてるユーザのみがこのオプションに関係あります。(後述
              の性能関連の節を見て下さい。)

       -c     何もしません。POSIX 互換のために用意されています。

       -d, --debug
              生成されたスキャナがデバッグモードで実行されます。yy_flex_debug
              が非 0 の場合 (デフォルト)、パターンが認識されるたびに、スキャナ
              は、次のようなメッセージを標準エラーへ出力します。

                  --accepting rule at line 53 ("the matched text")

              行番号は、スキャナを定義しているファイル (flexに与えられたファイ
              ル) でのルールの位置です。スキャナがバックアップしたとき、デフォ
              ルトルールを受け入れたとき、入力バッファの最後に到達したとき (あ
              るいは、NULに到達したとき; スキャナには、この二つの区別はつきま
              せん)、ファイルの最後に到達したときにもメッセージが出力されま
              す。

       -f, --full
              高速なスキャナを指定します。テーブル圧縮は、行われず、標準入出力
              をバイパスします。その結果生成されるスキャナは、大きくなります
              が、高速なものになります。このオプションは、-Cfr と同等です (以
              下を参照)。

       -h, --help
              flex のオプションの要約からなる "ヘルプ" を標準出力に書き込み終
              了します。-?--help とは、-h と同じです。

       -i, --case-insensitive
              大文字小文字を区別しないスキャナを生成します。flex の入力パター
              ンに与えられる文字が大文字であるか小文字であるかは区別されず、ス
              キャナに入力される文字列は、大文字小文字に関係なくマッチします。
              マッチしたテキスト yytext では入力時の大文字小文字が保存されます
              (大文字を小文字に変換したりしません)。

       -l, --lex-compat
              AT&T の lex の実装に対して最大限の互換性を持たせます。これは、完
              全な互換性を意味しません。このオプションを使用すると性能に大きな
              影響があります。このオプションは、-+, -f, -F, -Cf, -CF と同時に
              使用できません。詳しくは、後述の "Lex および POSIX との非互換性"
              の節を御覧下さい。またこのオプションを使用すると、
              YY_FLEX_LEX_COMPAT が生成されたスキャナの名前に #define されま
              す。

       -n     何もしません。POSIX 互換のためにだけ用意されたオプションです。

       -p, --perf-report
              性能情報を標準エラーに出力します。flex 入力ファイルの記述のう
              ち、生成されるスキャナの性能低下の深刻な原因となる部分について、
              コメントされます。オプションを2回指定すると、より細かな性能低下
              についてもコメントが出力されます。

              REJECT%option yylineno ・可変長右文脈 (欠陥/バグの節で後述)
              は、多大なる性能への悪影響があります; yymore() の使用・ ^ オペ
              レータ・ -I フラグは、小さな性能の悪影響があります。

       -s, --no-default
              デフォルトルール (マッチしないスキャナの入力を標準出力に出力す
              る) が抑制されます。ルールにマッチしない入力が表れたとき、スキャ
              ナは、エラーで異常終了します。スキャナのルールの組に抜けが無いか
              を確認する場合に有効です。

       -t, --stdout
              lex.yy.c ではなく、標準出力にスキャナを書き込みます。

       -v, --verbose
              生成するスキャナの特徴の要約を標準エラーに出力するように flex に
              指示します。ほとんどの特徴は、通常の flex ユーザには、意味があり
              ませんが、最初の行は、flex のバージョンを表示し (-V で表示される
              もと同じです)、次の行は、デフォルトを含むスキャナ生成時のフラグ
              です。

       -w, --nowarn
              警告メッセージを抑制します。

       -B, --batch
              対話的なスキャナ (以下の -I の項を参照) ではなくバッチ的なスキャ
              ナを生成するよう flex に指示します。通常 -B を使用するのは、ス
              キャナを対話的に使用しないことが分かっている時であり、少しでも性
              能を追求したい時です。より大きい性能を追求する場合には、-Cf もし
              くは -CF オプションを使用すべきです (後述)。-B を自動的に設定し
              ます。

       -F, --fast
              高速なスキャナテーブルの表現を使う (標準入出力は、バイパスする)
              ことを指定します。この表現は、完全テーブル表現 (-f) とほぼ同じぐ
              らい高速で、ある種のパターンに対してはかなり小さく (ある種に対し
              ては大きく) なります。通常、次のように、パターンの組が
              "keywords" とその対応および "identifier" ルールからなる場合:

                  "case"    return TOK_CASE;
                  "switch"  return TOK_SWITCH;
                  ...
                  "default" return TOK_DEFAULT;
                  [a-z]+    return TOK_ID;

              この場合、完全テーブル表現を使用する方が良いです。もし
              "identifier" ルールからのみ表現され、キーワードを検出するために
              ハッシュ表等を使用する場合は、-F を使用する方が良いです。

              このオプションは、-CFr と等価です (以下を参照)。これは、-+ オプ
              ションとは同時に指定できません。

       -I, --interactive
              flex に対話的なスキャナを生成するように指示します。対話的なス
              キャナは、先読みすることによりマッチするトークンが完全に決まる場
              合のみ先読みします。現在のトークンが既に明らかな場合でも常に先読
              みする方法は、必要時のみ先読みする方法より少し速いです。しかし、
              常に先読みする方法では、対話性能に著しく悪影響があります; 例えば
              ユーザが改行を入力した場合、別のトークンを入力するまでそれは、改
              行として認識されません。大概の場合、次の行全体を入力することにな
              ります。

              flex のスキャナのデフォルトは、対話的であり、例外は、-Cf-CF
              といったテーブル圧縮オプション (後述) 使用時です。高性能追求時に
              は、これらのオプションを使用しているべきですので、これらのオプ
              ションを使用していない場合には、flex は、実行時性能を少し犠牲に
              して直観的な対話的な振舞いを取っているものとします。-I オプショ
              ンを -Cf-CF と共に使用できないことにも注意して下さい。実際
              は、このオプションは、不要です; 許される場合、デフォルトで有効に
              なっています。

              isatty() がスキャナの入力に対して偽を返す場合、-I が指定されてい
              た場合でも、flex は、バッチモードへ戻ります。なにがあっても対話
              モードを強制するには、%option always-interactive (後述のオプショ
              ンを参照) を使用します。

              スキャナを対話的で無いように強制するには、-B (先述) を使用しま
              す。

       -L, --noline
              flex#line ディレクティブを lex.yy.c 中に生成しないように指示
              します。デフォルトでは、この #line ディレクティブを生成するの
              で、アクションにおけるエラーメッセージは、オリジナルの flex 入力
              ファイル (エラーが入力ファイルのコードに起因する場合) もしくは
              ファイル lex.yy.c (flex の誤り -- 以下の電子メールアドレスに報告
              して下さい) における正しい位置を与えます。

       -T, --trace
              flex をトレースモードで実行します。入力の形式とその結果として出
              力される非決定性/決定性有限オートマトンに関して標準エラーに多量
              のメッセージを出力します。このオプションは、主に flex をメンテナ
              ンスするために使われます。

       -V, --version
              バージョン番号を標準出力に出力して終了します。--version は、-V
              と同じです。

       -7, --7bit
              flex は、7 ビットのスキャナを生成します。すなわち、入力に 7 ビッ
              トの文字のみを使用することを意味します。-7 を指定する利点は、-8
              オプション (後述) を指定して生成するテーブルの半分まで小さくなり
              うることです。欠点は、入力に 8 ビット文字が含まれている時に、ス
              キャナがハングもしくはクラッシュすることです。

              しかしながら、-Cf-CF といったテーブル圧縮オプション使用時に
              は、テーブル圧縮の効果は、少なく、移植性が著しく低下することに注
              意して下さい。flex のデフォルトの動作では、-Cf-CF, を指定し
              ない限り 8 ビットスキャナを生成します。指定時には、あなたのサイ
              トが常に 8 ビットスキャナを生成するように (USA 以外のサイトでは
              良くあります) していない場合には、7 ビットスキャナを生成します。
              flex が 7 ビットもしくは 8 ビットのいずれのスキャナを生成するの
              かを知りたい場合には、上述の -v の出力のフラグの要約を調べて下さ
              い。

              -Cfe もしくは -CFe (これらのテーブル圧縮オプションおよび等価クラ
              スは、後述) を使用しても、flex は、デフォルトで 8 ビットスキャナ
              を生成することに注意して下さい。なぜなら、完全な 8 ビットテーブ
              ルは、7 ビットテーブルと比べてもたいして高価にはならないからで
              す。

       -8, --8bit
              8 ビットのスキャナを生成するように flex に指示します。すなわち 8
              ビット文字を解釈します。圧縮オプション -Cf-CF 使用時にのみ必
              要です。なぜなら flex は、デフォルトでは、8 ビットスキャナを生成
              するからです。

              flex のデフォルト動作と 7 ビットおよび 8 ビットスキャナのトレー
              ドオフに関しては、上記 -7 の議論を見て下さい。

       -+, --c++
              C++ のスキャナクラスを生成します。詳しくは、C++ スキャナの生成で
              後述します。

       -C[aefFmr]
              テーブル圧縮の程度と、より一般的には小さいスキャナと高速なスキャ
              ナとのトレードオフを指定します。

              -Ca, --align ("アライン") 生成されるスキャナのテーブルは、メモリ
              アクセスおよび計算のためにアラインされるため、より大きなものにな
              ります。RISC アーキテクチャでは、ロングワードのフェッチおよび操
              作は、ショートワードといったより小さな大きさのものに対するものよ
              り効率的です。場合によっては、スキャナのテーブルサイズが通常の 2
              倍になることもあります。

              -Ce, --ecs 等価クラス (同一の字句属性を持つ文字セット) を構築し
              ます (例えば、flex 入力中に数字が現れるのが文字クラス "[0-9]" の
              みの場合、数字 '0', '1', ..., '9' は、全て同じ等価クラスになりま
              す)。多くの場合、等価クラスを用いることで最終的なテーブル/ オブ
              ジェクトファイルのサイズを劇的 (平均して 1/2-1/5) に減らすことが
              出来ます。また、その際の性能コストは、非常に低く抑えられます (1
              文字スキャンするごとに 1 回の配列検索を行うだけです)。

              -Cf 完全 (full) スキャナテーブルを生成することを指示します -
              flex は、別の状態に関する類似した遷移関数をうまく利用するとい
              う、テーブル圧縮手法を用いません。

              -CF 別の高速スキャナ表現 (-F フラグにて記述) を用いることを指定
              します。このオプションは、-+ と同時に使用できません。

              -Cm, --meta-ecs flex にメタ等価クラスを構築するよう指示します。
              メタ等価クラスは、一緒に使われることの多い等価クラス (等価クラス
              が使われていないときには、文字群) の集合です。圧縮テーブルを使っ
              ているとき、メタ等価クラスは、多くの場合にかなりの効果的をもたら
              しますが、やや性能に影響します (1-2 回の条件テストと 1 回の配列
              検索がスキャンした文字ごとに行われます)。

              -Cr, --read 生成されたスキャナは、入力に対しては、標準入出力ライ
              ブラリ (標準入出力) をバイパスします。スキャナは、fread()getc() ではなく、read() システムコールを使用します。性能改善結果
              は、システムに依存します。オプション -Cf もしくは -CF を使用して
              いない場合には、一般にこのオプションは、性能をあまり改善しませ
              ん。-Cr を指定すると、例えばスキャナを設定する前に標準入出力を使
              用して yyin から読み込んでいるときには、予想外の振る舞いをするこ
              とがあります。(標準入出力の入力バッファに以前読み込んだものを、
              スキャナは、読めません)。

              -Cr は、YY_INPUT を定義した場合意味がありません (前述の生成され
              たスキャナを参照)。

              -C のみを指定したときには、スキャナは、テーブル圧縮は、行います
              が、等価クラスもメタ等価クラスも使いません。

              オプション -Cf-CF は、オプション -Cm を同時に指定しても意味
              をなしません - なぜなら、テーブル圧縮が行われないときメタ等価ク
              ラスは、現れないからです。それ以外のオプションは、自由に組み合わ
              せることが出来ます。

              デフォルトの設定は、-Cem です。このとき flex は、等価クラスとメ
              タ等価クラスを生成します。この設定は、最も高いテーブル圧縮を行い
              ます。テーブルサイズの大きさと実行の高速性は、トレードオフの関係
              にあり、一般に

                  遅くて小さい
                        -Cem
                        -Cm
                        -Ce
                        -C
                        -C{f,F}e
                        -C{f,F}
                        -C{f,F}a
                  速くて大きい

              となります。小さいテーブルのスキャナは、通常生成もコンパイルも高
              速であるため、通常の開発時は、最大の圧縮を行うでしょう。

              製品のスキャナでは、-Cfe が速度と大きさの良いバランスです。

       -ooutput, --outputfile=FILE
              lex.yy.c ではなくファイル output にスキャナを書くように flex に
              指示します。-o-t オプションを組み合わせると、スキャナは、標
              準出力に書かれますが、#line ディレクティブ (-L にて上述) は、
              ファイル output を参照します。

       -Pprefix, --prefix=STRING
              flex の使うデフォルトのプレフィックス yy の代わりに prefix を使
              います。これは、グローバル変数とファイル名に影響します。例えば
              -Pfoo とすると、yytext の名前は、footext となります。またデフォ
              ルトの出力ファイル名を lex.yy.c から lex.foo.c に変えます。影響
              を受ける名前の一覧です:

                  yy_create_buffer
                  yy_delete_buffer
                  yy_flex_debug
                  yy_init_buffer
                  yy_flush_buffer
                  yy_load_buffer_state
                  yy_switch_to_buffer
                  yyin
                  yyleng
                  yylex
                  yylineno
                  yyout
                  yyrestart
                  yytext
                  yywrap

              (C++ スキャナ使用時には、yywrapyyFlexLexer だけが影響を受け
              ます。) スキャナの中では、グローバル変数および関数をどちらの名前
              ででも参照できます; 外部的には、修正した名前のみ持ちます。

              このオプションを使用することにより、複数の flex プログラムを同一
              の実行形式に容易にリンクすることが出来ます。しかし、このオプショ
              ンは、yywrap() の名前をも変えますので、独自の (適切に名前を付け
              た) ルーチンをスキャナのために用意するか、%option noyywrap を使
              用して -ll とリンクする必要があります。どれもデフォルトでは、提
              供されません。

       -Sskeleton_file, --skel=FILE
              flex がスキャナを構築するのに使うデフォルトのスケルトンファイル
              に優先します。flex のメンテナンスや開発をする場合以外、このオプ
              ションは、必要ありません。

       -X, --posix-compat
              POSIX lex との最大の互換性。

       --yylineno
              yylineno の行カウントを追跡します。

       --yyclass=NAME
              C++ クラスの名前。

       --header-file=FILE
              スキャナに加えて C ヘッダファイルを作成します。

       --tables-file[=FILE]
              FILE にテーブルを書き込みます。

       -Dmacro[=defn]
              #define マクロの defn (デフォルトで、defn は、'1' です)。

       -R, --reentrant
              リエントラントな C スキャナを生成します。

       --bison-bridge
              bison の純粋なパーサのためのスキャナ。

       --bison-locations
              yylloc サポートを含めます。

       --stdinit
              stdin/stdout への yyin/yyout を初期化します。

       --noansi-definitions
              古いスタイルの関数定義。

       --noansi-prototypes
              プロトタイプの空のパラメータのリスト。

       --nounistd
              <unistd.h> を含めません。

       --noFUNCTION
              特別の FUNCTION を生成しません。

       flex は、flex のコマンドラインではなく、スキャナ仕様記述中からオプショ
       ンを制御する機構を提供します。これは、スキャナの最初の部分に %option
       ディレクティブを含めることで実現できます。単一の %option ディレクティブ
       において複数のオプションを指定でき、また複数のディレクティブを flex 入
       力ファイルの最初の部分に置くことが出来ます。

       ほとんどのオプションが単純な名前であり、オプションとして前に "no" とい
       う語 (空白をはさみません) を付けて意味を反転できます。数値は、flex のフ
       ラグやその反転と等価です。

           7bit            -7 オプション
           8bit            -8 オプション
           align           -Ca オプション
           backup          -b オプション
           batch           -B オプション
           c++             -+ オプション

           caseful または
           case-sensitive  -i オプションの逆 (デフォルト)

           case-insensitive または
           caseless        -i オプション

           debug           -d オプション
           default         -s オプションの逆
           ecs             -Ce オプション
           fast            -F オプション
           full            -f オプション
           interactive     -I オプション
           lex-compat      -l オプション
           meta-ecs        -Cm オプション
           perf-report     -p オプション
           read            -Cr オプション
           stdout          -t オプション
           verbose         -v オプション
           warn            -w オプションの逆
                           (-w オプションには、"%option nowarn" を使用して下さい)

           array           "%array" と等価
           pointer         "%pointer" と等価 (デフォルト)

       %option には、他では利用できない機能を提供するものもあります:

       always-interactive
              入力を常に "対話的" に扱うスキャナを生成するように flex に指示し
              ます。通常、新たな入力ファイル毎にスキャナは、isatty() を呼び出
              し、スキャナの入力元が対話的であり 1 度に 1 文字ずつ読むべきかど
              うか判定しようとします。一方このオプションを使用するとこの様な呼
              び出しは行いません。

       main   スキャナに対し、yylex() を呼び出すだけのデフォルトの main() プロ
              グラムを提供するように指示します。このオプションは、noyywrap (後
              述) も暗黙的に指示します。

       never-interactive
              入力を "対話的" とはしないスキャナを生成するように flex に指示し
              ます (これもまた isatty() を呼び出しません)。これは、always-
              interactive の逆です。

       stack  開始条件スタックの使用を有効にします (前述の開始条件を参照)。

       stdinit
              設定されている場合 (すなわち %option stdinit) yyin および yyout
              を、デフォルトの nil ではなく、標準入力と標準出力に設定します。
              既存の lex プログラムには、ANSI C 互換ではないものの、この動作に
              依存しているものがあります。ANSI C では、標準入力と標準出力がコ
              ンパイル時の定数である必要はありません。

       yylineno
              入力から読み込んだ現在の行番号をグローバル変数 yylineno に保持す
              るスキャナを生成するように、flex に指示します。このオプション
              は、%option lex-compat から暗黙的に指定されます。

       yywrap セットされていない場合 (すなわち %option noyywrap)、スキャナは、
              ファイルの終りに際し yywrap() を呼ばず単にスキャンすべきファイル
              がもう無いものとするようになります (ユーザが yyin を新しいファイ
              ルを指すようにし、再度 yylex() を呼び出すまでです)。

       flex は、ルールアクションをスキャンし、REJECTyymore() の機能が使わ
       れているかどうかを調べます。rejectyymore のオプションを使用すると、
       オプションで指定した通りにこの判定に優先します。オプションの指定は、
       セットして機能を使用していることを示す (例えば %option reject)、もしく
       はアンセットして機能を使用していないことを示す (例えば %option
       noyymore) ものとします。

       次のオプションは、文字列の値を取り、'=' で区切ります:

           %option outfile="ABC"

       これは、-oABC と同じであり、

           %option prefix="XYZ"

       は、-PXYZ と同じです。最後に、

           %option yyclass="foo"

       は、C++ スキャナ生成時のみ有効 (-+ オプション) です。これは、flex に対
       して、fooyyFlexLexer のサブクラスであることを知らせますので、flex
       は、アクションを yyFlexLexer::yylex() ではなく foo::yylex() のメンバ関
       数とします。また、(yyFlexLexer::LexerError() を起動することにより)呼び
       出すと実行時エラーを除去する yyFlexLexer::yylex() メンバ関数を生成しま
       す。詳細は、後述の C++ スキャナの生成を見て下さい。

       生成されたスキャナから不要なルーチンを除きたい lint 純正主義者のために
       多くのオプションが用意されています。以下をアンセットすると (例えば
       %option nounput)、対応するルーチンは、生成されるスキャナから除かれます:

           input, unput
           yy_push_state, yy_pop_state, yy_top_state
           yy_scan_buffer, yy_scan_bytes, yy_scan_string

       (yy_push_state() 等は、%option stack を使用しない場合には現れません)。

性能関連
       flex の主なデザインゴールは、高性能なスキャナを生成することです。多くの
       ルールセットを良く扱うことで最適化されます。既に概説した -C オプション
       使用によるテーブル圧縮に起因する速度への影響の他に、性能を悪化させる多
       くのオプション/アクションがあります。それらを高価なものから安価なものへ
       と並べます:

           REJECT
           %option yylineno
           自由長の右文脈 (trailing context)

           バックアップが必要なパターンの組
           %array
           %option interactive
           %option always-interactive

           '^' 行頭オペレータ
           yymore()

       最初の 3 つは、非常に高価であり、最後の 2 つは、非常に安価です。unput()
       は、潜在的に非常に大きな仕事をするルーチン呼び出しとして実装されている
       のに対し、yyless() は、非常に安価なマクロです; ですからスキャンした余分
       なテキストを戻すだけの場合には、yyless() を使って下さい。

       性能が重要な場合には、出来うる限りの努力でもって REJECT を避けて下さ
       い。これは、特に高価なオプションです。

       バックアップを取り除くと、乱雑になり、ひどく苦労して複雑なスキャナを作
       ることになります。実際的には、-b フラグを指定して lex.backup ファイルを
       生成することから始めます。例えば、入力

           %%
           foo        return TOK_KEYWORD;
           foobar     return TOK_KEYWORD;

       に対しては、ファイルは、次のようになります:

           State #6 is non-accepting -
            associated rule line numbers:
                  2       3
            out-transitions: [ o ]
            jam-transitions: EOF [ \001-n  p-\177 ]

           State #8 is non-accepting -
            associated rule line numbers:
                  3
            out-transitions: [ a ]
            jam-transitions: EOF [ \001-`  b-\177 ]

           State #9 is non-accepting -
            associated rule line numbers:
                  3
            out-transitions: [ r ]
            jam-transitions: EOF [ \001-q  s-\177 ]

           Compressed tables always back up.

       最初の数行は、'o' に遷移できるが他の文字には、遷移できない状態があり、
       その状態では、現在スキャンされたテキストは、他のルールには、マッチしな
       いことを表します。この状態が発生したのは、入力ファイルの行 2, 3 のルー
       ルにマッチしようとした時です。スキャナがこの様な状態にあり 'o' 以外の文
       字を読んだ場合には、マッチするルールを探すためのバックアップが必要とな
       ります。少し考えれば、これは、"fo" を見た時にある状態に違いないことが分
       かるでしょう。この様な時、'o' 以外のものが現れると、スキャナは、単に
       'f' にマッチする (デフォルトルール) ところまで戻り (バックアップし) ま
       す。

       状態 #8 に関係するコメントは、"foob" がスキャンされた時に問題があること
       を表しています。実際、'a' 以外の文字に出会うと、スキャナは、"foo" を受
       理するところまで戻ります。同様に状態 #9 に関係するコメントは、"fooba"
       がスキャンされ 'r' が続かない場合に関係します。

       最後のコメントが通知するのは、-Cf-CF を使っているのでなければバック
       アップを取り除こうと努力することは、無意味であることです。なぜなら、圧
       縮されたスキャナに対してそのようなことをしても、性能上の利益は、無いか
       らです。

       バックアップを取り除くためには、"エラー" ルールを追加します:

           %%
           foo         return TOK_KEYWORD;
           foobar      return TOK_KEYWORD;

           fooba       |
           foob        |
           fo          {
                       /* false alarm, not really a keyword */
                       return TOK_ID;
                       }


       キーワードのリストからバックアップを取り除くには、"全てを捕まえる" ルー
       ルを使用することが出来ます:

           %%
           foo         return TOK_KEYWORD;
           foobar      return TOK_KEYWORD;

           [a-z]+      return TOK_ID;

       通常、適切な時には、これは、一番良い解決策です。

       バックアップメッセージは、カスケードすることが多いです。複雑なルールの
       組では、数百ものメッセージを得るのは、普通のことです。しかし、これを解
       析すれば、バックアップを除去するためには、大抵の場合数ダースのルールに
       だけ関係あることが分かるでしょう (しかし、間違えることが多く、誤った
       ルールが偶然有効なトークンにマッチし得ます。将来の flex の機能では、自
       動的にバックアップを除去するルールを追加するようになるかも知れません)。

       バックアップを除去することにより利益があるのは、全てのバックアップを除
       去した時だけということを覚えておくことは重要です。たった一つを残しても
       何も得ることが出来ません。

       可変長の右文脈 (左部分と右部分のいずれかもしくは両方が可変長) は、
       REJECT とほぼ同じだけの (すなわち相当の) 性能劣化となります。そのため次
       のようなルール:

           %%
           mouse|rat/(cat|dog)   run();

       は、次のように書くか:

           %%
           mouse/cat|dog         run();
           rat/cat|dog           run();

       次のように書いた方が良いです:

           %%
           mouse|rat/cat         run();
           mouse|rat/dog         run();

       特別な '|' アクションは、助けにはなりませんし、かえって状況を悪くします
       (後述の欠陥/バグを参照)。

       スキャナの性能を向上させるための余地 (実現は、最も容易) は、マッチする
       トークンが長ければスキャナが高速になることにあります。長いトークンでは
       ほとんどの入力処理は、(短い) 内部ループで処理され、アクションのためにス
       キャナ環境を設定する追加の仕事 (例えば yytext) をほとんどしないからで
       す。C コメントのスキャナを思い出しましょう:

           %x comment
           %%
                   int line_num = 1;

           "/*"         BEGIN(comment);

           <comment>[^*\n]*
           <comment>"*"+[^*/\n]*
           <comment>\n             ++line_num;
           <comment>"*"+"/"        BEGIN(INITIAL);

       次のように書くと高速になります:

           %x comment
           %%
                   int line_num = 1;

           "/*"         BEGIN(comment);

           <comment>[^*\n]*
           <comment>[^*\n]*\n      ++line_num;
           <comment>"*"+[^*/\n]*
           <comment>"*"+[^*/\n]*\n ++line_num;
           <comment>"*"+"/"        BEGIN(INITIAL);

       今度は、改行毎に別のアクションの処理を行うのではなく、改行認識は、ルー
       ル間で "分散" され、可能な限り長いテキストにマッチするようになっていま
       す。ルールの追加は、スキャナを遅くしません!  スキャナの速度は、ルール数
       とも、オペレータ '*' や '|' といったものに基づくルールの複雑さ (この節
       の始めで扱いました) とも独立です。

       最後の高速化の例です: 1 行に 1 つずつであり別の文字は、付かないような、
       識別子とキーワードを全てファイルからスキャンすることを考えます。最初
       は、次のようになるでしょう:

           %%
           asm      |
           auto     |
           break    |
           ... etc ...
           volatile |
           while    /* it's a keyword */

           .|\n     /* it's not a keyword */

       後戻りを避けるために全てを捕まえるルールを導入します:

           %%
           asm      |
           auto     |
           break    |
           ... etc ...
           volatile |
           while    /* it's a keyword */

           [a-z]+   |
           .|\n     /* it's not a keyword */

       1 行に正確に 1 語だけあることが保証されている場合、改行の認識を別のトー
       クンと併せることで、マッチの総数を半分に減らすことが出来ます:

           %%
           asm\n    |
           auto\n   |
           break\n  |
           ... etc ...
           volatile\n |
           while\n  /* it's a keyword */

           [a-z]+\n |
           .|\n     /* it's not a keyword */

       ここで、再度バックアップをスキャナに組み込んだことに気を付けなければな
       りません。実際、我々は入力ストリームは、文字と改行だけであることを知っ
       ていますが、flex は、これが分からないため、トークン "auto" などをスキャ
       ンした次の文字が改行でも文字でもない場合には、バックアップが必要である
       と考えます。以前は、"auto" ルールに適合しそれで終りでしたが、今は、
       "auto" ルールは、無く、"auto\n" ルールだけがあります。バックアップの可
       能性を除去するためには、最後の改行以外のルールを二重化するか、そのよう
       な入力に出くわさないので分類は、不要と分かっているため、改行を導入しな
       いもう一つの全てを捕まえるルールを導入することが出来ます:

           %%
           asm\n    |
           auto\n   |
           break\n  |
           ... etc ...
           volatile\n |
           while\n  /* it's a keyword */

           [a-z]+\n |
           [a-z]+   |
           .|\n     /* it's not a keyword */

       -Cf を付けてコンパイルすると、実際問題上 flex で得られるほぼ最速になり
       ます。

       最後の注意事項: flex は、NUL にマッチする時には、遅く、トークンが複数の
       NUL を含む時には、特に遅いです。テキストがしばしば NUL を含むものと予想
       される場合には、テキストの短い部分とマッチするようにルールを書くべきで
       す。

       もう一つの性能に関する最終注意事項: 入力のマッチ方法の節で既に示したよ
       うに、大きなトークンを納めるために yytext のサイズを動的に変更すると処
       理が遅くなります。なぜなら、(巨大な) トークンを再度先頭からスキャンしな
       おさねばならないからです。性能が重要な場合、テキストの "大きな" 部分に
       マッチさせるべきですが "巨大な" 部分にマッチさせるべきではありません。
       両者の堺目は、8K 文字/トークンです。

C++ スキャナの生成
       flex は、2 通りの C++ スキャナ生成方法を提供します。最初の方法は、flex
       が生成したスキャナを単に C コンパイラではなく C++ コンパイラでコンパイ
       ルするというものです。この場合コンパイルエラーには出会わないはずです
       (見つけた場合には、作者の節で後述する電子メールアドレスに報告して下さ
       い)。この場合ルールにおいて C コードではなく C++ コードを書くことが出来
       ます。スキャナのデフォルトの入力元は、yyin のままであり、デフォルトのエ
       コー先は、yyout のままであることに注意して下さい。どちらも FILE * 変数
       のままであり、C++ streams ではないです。

       flex に C++ スキャナクラスを生成させることも出来ます。-+ オプションを指
       定する (もしくは等価的に %option c++ を使う) とこのように実行され、
       flex++ のように flex の実行形式名が '+' で終っている場合には、自動的に
       指定されます。このオプションを指定すると flex が生成するスキャナのデ
       フォルトは、ファイル lex.yy.cc となり lex.yy.c ではありません。生成され
       たスキャナは、2 つの C++ クラスとのインタフェースを定義するヘッダファイ
       ル FlexLexer.h をインクルードします。

       最初のクラス FlexLexer は、一般的なスキャナクラスを定義する抽象基盤クラ
       スを提供します。以下のメンバ関数を提供します:

       const char* YYText()
              最後にマッチしたテキストを返します。yytext と等価です。

       int YYLeng()
              最後にマッチしたトークンの長さを返します。yyleng と等価です。

       int lineno() const
              現在の入力の行番号 (%option yylineno 参照) もしくは %option
              yylineno を使用していない場合には、1 を返します。

       void set_debug( int flag )
              スキャナのデバッグフラグをセットします。yy_flex_debug に代入する
              のと同じです (オプションの節で前述)。スキャナ構築時に %option
              debug を使用してデバッグ情報を組み込む必要があることに注意して下
              さい。

       int debug() const
              現在のデバッグフラグの設定を返します。

       また次のものと等価なメンバ関数も提供されます yy_switch_to_buffer(),
       yy_create_buffer() (最初の引数は、std::istream* オブジェクトポインタで
       あり FILE* ではありません), yy_flush_buffer(), yy_delete_buffer(),
       yyrestart() (これもまた最初の引数は、std::istream* オブジェクトポインタ
       です)。

       2 番目のクラスは、FlexLexer.h で定義される yyFlexLexer であり、
       FlexLexer から導出したものです。以下の追加のメンバ関数を定義します:

       yyFlexLexer( std::istream* arg_yyin = 0, std::ostream* arg_yyout = 0 )
              与えられた入出力ストリームを使う yyFlexLexer オブジェクトを構築
              します。指定しない場合には、それぞれストリームのデフォルト cincout になります。

       virtual int yylex()
              これは、yylex() が通常の flex スキャナに対して行ったのと同様の役
              割を担います: ルールのアクションが値を返すまで、入力ストリームを
              スキャンし、トークンを消費します。yyFlexLexer からサブクラス S
              を導出し yylex() から S のメンバ関数および変数をアクセスしたい場
              合、%option yyclass="S" を指定して yyFlexLexer ではなくサブクラ
              スを使用することを flex に知らせる必要があります。この場合
              yyFlexLexer::yylex() を生成するのではなく、flex は、S::yylex()
              (および呼び出されたなら yyFlexLexer::LexerError() を呼び出すダ
              ミーの yyFlexLexer::yylex() も) を生成します。

       virtual void switch_streams(std::istream* new_in = 0,
              std::ostream* new_out = 0) yyinnew_in (非 nil の場合) に再割
              当し、yyoutnew_out (同様) に再割当します。yyin が再割当され
              た場合には、以前の入力バッファは、消去されます。

       int yylex( std::istream* new_in, std::ostream* new_out = 0 )
              まず入力ストリームを switch_streams( new_in, new_out ) を使用し
              て切り替え、yylex() の値を返します。

       さらに、yyFlexLexer は、次のプロテクトされた仮想関数を定義します。ス
       キャナにあわせてこれらを導出クラスにおいて再定義出来ます:

       virtual int LexerInput( char* buf, int max_size )
              最大 max_size 文字を buf に読み込み、読めた文字数を返します。入
              力の終りを示すには、0 文字を返します。"対話的" スキャナ (-B-I フラグを参照) は、マクロ YY_INTERACTIVE を定義することに注意
              して下さい。LexerInput() を再定義し、対話的な入力元をスキャンす
              る可能性があるかどうかに依存して異なるアクションが必要となる場
              合、この名前が存在するかどうかのテストは、#ifdef にて可能です。

       virtual void LexerOutput( const char* buf, int size )
              size 文字をバッファ buf から書き込みます。スキャナのルールが NUL
              を含むテキストにマッチ可能な場合、NUL 終端されているこのバッファ
              は、"内部に" NUL を含んでいても構いません。

       virtual void LexerError( const char* msg )
              致命的なエラーメッセージを報告します。デフォルトのこの関数は、
              メッセージをストリーム cerr に書き、終了します。

       yyFlexLexer オブジェクトは、全てのスキャン時の状態を含むことに注意して
       下さい。それゆえこの様なオブジェクトをリエントラントなスキャナとして使
       用できます。同一の yyFlexLexer クラスの複数のインスタンスを具体化可能で
       あり、複数の C++ スキャナクラスを組み合わせ上記 -P オプションを使用する
       ことで同一のプログラムで使用可能です。

       最後に %array 機能は、C++ スキャナクラスでは、使用できないことに注意し
       て下さい; %pointer を使用しなければなりません (デフォルト)。

       単純な C++ スキャナの例を以下に示します:

               // An example of using the flex C++ scanner class.

           %{
           int mylineno = 0;
           %}

           string  \"[^\n"]+\"

           ws      [ \t]+

           alpha   [A-Za-z]
           dig     [0-9]
           name    ({alpha}|{dig}|\$)({alpha}|{dig}|[_.\-/$])*
           num1    [-+]?{dig}+\.?([eE][-+]?{dig}+)?
           num2    [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)?
           number  {num1}|{num2}

           %%

           {ws}    /* skip blanks and tabs */

           "/*"    {
                   int c;

                   while((c = yyinput()) != 0)
                       {
                       if(c == '\n')
                           ++mylineno;

                       else if(c == '*')
                           {
                           if((c = yyinput()) == '/')
                               break;
                           else
                               unput(c);
                           }
                       }
                   }

           {number}  cout << "number " << YYText() << '\n';

           \n        mylineno++;

           {name}    cout << "name " << YYText() << '\n';

           {string}  cout << "string " << YYText() << '\n';

           %%

           int main( int /* argc */, char** /* argv */ )
               {
               FlexLexer* lexer = new yyFlexLexer;
               while(lexer->yylex() != 0)
                   ;
               return 0;
               }
       複数の (異なった) 字句解析クラスを生成したい場合、-P フラグ (もしくは
       prefix= オプション) を使用して各 yyFlexLexerxxFlexLexer 等の別の名
       前にします。次に字句解析クラスのソースごとに <FlexLexer.h> をインクルー
       ドします。以下のように yyFlexLexer をリネームします:

           #undef yyFlexLexer
           #define yyFlexLexer xxFlexLexer
           #include <FlexLexer.h>

           #undef yyFlexLexer
           #define yyFlexLexer zzFlexLexer
           #include <FlexLexer.h>

       これは、あるスキャナに対し %option prefix="xx" を使用しもう一方に対し
       %option prefix="zz" を使用した場合です。

       重要: 現在のスキャンクラスの形式は、実験的であり、メジャーリリースが変
       わると大きく変更される可能性があります。

LEX および POSIX との非互換性
       flex は、AT&T Unix の lex ツールのリライトですが (2 つの実装は、いかな
       るコードも共有しません)、いくばくかの拡張と非互換性を持っており、どちら
       の実装でも受理可能なスキャナを書きたい方は、これを意識しなければなりま
       せん。flex は、POSIX lex 仕様に完全合致しますが、例外は、%pointer (デ
       フォルト) 使用と unput() 呼び出しにより yytext の内容を破壊することであ
       り、これは、POSIX 仕様に反します。

       この節では、flex と AT&T lex と POSIX 仕様との間の全ての既知の非互換性
       を扱います。

       flex-l オプションは、オリジナルの AT&T lex 実装との最大の互換性を有
       効にしますが、生成されたスキャナの性能は、大きく低下します。-l オプショ
       ンを使用しても発生しうる非互換性は、後で述べます。

       flex は、以下の例外を除き lex と完全互換です:

       -      ドキュメントに記載されていない lex スキャナ内部の変数 yylineno
              は、-l もしくは %option yylineno を使用しないとサポートされませ
              ん。

              yylineno は、スキャナ毎 (単一のグローバル変数) ではなく、バッ
              ファ毎に管理されるべきです。

              yylineno は、POSIX 仕様ではありません。

       -      input() ルーチンは、再定義できませんが、ルールにマッチしたものに
              後続する文字を読むために呼ばれえます。input() がファイルの終りに
              到達すると、通常の yywrap() 処理は、終了します。``実際の'' ファ
              イルの終りは、EOF として返されます。

              実際には、入力は、YY_INPUT マクロを定義することにより制御されま
              す。

              input() を再定義できないという flex の制限は、最初に yyin を設定
              する以外のスキャナ入力制御方法を単に規定していないという、POSIX
              仕様と合致します。

       -      unput() ルーチンは、再定義できません。この制限は、POSIX に合致し
              ています。

       -      flex スキャナは、lex スキャナとは、異なりリエントラントではあり
              ません。実際、対話的なスキャナにおいて、割り込みハンドラにてロン
              グジャンプを用いてスキャナから脱出し、その後スキャナを再度呼び出
              す場合、以下のメッセージを得るでしょう:

                  fatal flex scanner internal error--end of buffer missed

              スキャナに再度入るためには、まず以下のようにして下さい

                  yyrestart( yyin );

              この呼び出しにより入力バッファは、捨てられることに注意して下さ
              い; 通常これは、対話的スキャナでは問題ではありません。

              また、C++ スキャナクラスは、リエントラントですので、C++ を使用で
              きるのなら、C++ を使用すべきです。前述の "C++ スキャナの生成" を
              参照してください。

       -      output() は、サポートされていません。ECHO マクロからの出力は、
              ファイルポインタ yyout (デフォルトでは、標準出力) に対して行われ
              ます。

              output() は、POSIX 仕様にはありません。

       -      lex は、排他的開始条件 (%x) をサポートしませんが、これは、POSIX
              仕様にあります。

       -      定義を展開する時、flex では括弧で括ります。lex では、以下は:

                  NAME    [A-Z][A-Z0-9]*
                  %%
                  foo{NAME}?      printf( "Found it\n" );
                  %%

              文字列 "foo" にはマッチしません。なぜなら展開されたマクロは、
              ルール "foo[A-Z][A-Z0-9]*?" と等価になり、優先度にて `?' は、
              "[A-Z0-9]*" と結び付きます。flex では、ルールが展開されると
              "foo([A-Z][A-Z0-9]*)?" となり、文字列 "foo" がマッチします。

              ^ で始まるか $ で終る定義は、展開時に括弧で括らず、これらのオペ
              レータが定義において特別な意味を失わないようにすることに注意して
              下さい。しかし <s>, /, <<EOF>> オペレータは、flex の定義では、使
              用できません。

              -l を使用すると、lex の振舞いと同じく定義を括弧で括りません。

              POSIX 仕様では、定義を括弧で括ります。

       -      lex の実装によっては、ルールのパターンの右側に空白がある場合、
              ルールのアクションを別の行から始めることを許します:

                  %%
                  foo|bar<space here>
                    { foobar_action(); }

              flex は、この機能をサポートしません。

       -      lex%r (Ratfor スキャナの生成) オプションは、サポートされてい
              ません。これは、POSIX 仕様には含まれません。

       -      スキャナを %array を使用して構築したのではない限り、unput() 呼び
              出し後には、次のトークンにマッチするまで yytext は、未定義です。
              これは、lex にも POSIX 仕様にも当てはまりません。-l オプションを
              指定するとこの非互換性を取り除きます。

       -      {} (数値範囲) オペレータの優先度が異なります。lex は、"abc{1,3}"
              を "1 度か 2 度か 3 度の 'abc' にマッチ" と解釈しますが、flex
              は、"'ab' に 1 度か 2 度か 3 度の 'c' が続くものにマッチ" と解釈
              します。後者が POSIX 仕様に合致します。

       -      ^ オペレータの優先度が異なります。lex は、"^foo|bar" を "行頭の
              'foo' か任意位置の 'bar' にマッチ" と解釈しますが、flex は、"行
              頭の 'foo' か 'bar' にマッチ" と解釈します。後者が POSIX 仕様に
              合致します。

       -      lex でサポートされている %a 等の特別なテーブルサイズの宣言は、
              flex スキャナでは、不要です; flex は、これらを無視します。

       -      flexlex のどちらでもスキャナを使用可能に書けるように、
              FLEX_SCANNER という名前を定義します。スキャナを生成した flex の
              バージョンを表す YY_FLEX_MAJOR_VERSIONYY_FLEX_MINOR_VERSION
              を、スキャナは、含みます (例えば 2.5 リリースでは、これらは、そ
              れぞれ 2 と 5 になります)。

       以下の flex の機能は、lex および POSIX 仕様には含まれません:

           C++ スキャナ
           %option
           開始条件スコープ
           開始条件スタック
           対話的/非対話的スキャナ
           yy_scan_string() 等
           yyterminate()
           yy_set_interactive()
           yy_set_bol()
           YY_AT_BOL()
           <<EOF>>
           <*>
           YY_DECL
           YY_START
           YY_USER_ACTION
           YY_USER_INIT
           #line ディレクティブ
           アクションの周りの %{}
           単一行における複数のアクション

       さらにほぼ全ての flex フラグです。リストの最後の機能の意味は、flex で
       は、複数のアクションをセミコロンで区切って同一行に記述可能ですが、lex
       では、次の

           foo    handle_foo(); ++num_foos_seen;

       は、(驚くべきことに) 次のように切り詰められるということです。

           foo    handle_foo();

       flex は、アクションを切り詰めません。ブレースで括られないアクションは、
       単純に行末で終了します。

診断
       warning, rule cannot be matched 常に同じテキストにマッチするルールが前
       にあるので、与えられたルールがマッチしません。例えば以下の "foo" は、"
       全てを捕まえる" ルールの後ろにありますので決してマッチしません:

           [a-z]+    got_identifier();
           foo       got_foo();

       スキャナ中で REJECT を使用するとこの警告を抑制します。

       warning, -s option given but default rule can be matched (おそらくある
       特定の開始条件のもとでは) デフォルトルール (任意の一文字にマッチする)
       しか特定の入力に対しては、マッチしないことがあります。-s を指定している
       ので、おそらくそうなりません。

       reject_used_but_not_detected undefined あるいは
       yymore_used_but_not_detected undefined - これらのエラーは、コンパイル時
       に起きます。スキャナが REJECT もしくは yymore() を使っていますが flex
       がそのことに気づかなかったということです。つまり、flex は、最初の 2 つ
       の部分を探してもこれらのアクションの出現を見つけられなかったのですが、
       実際には、何らかの方法 (例えば #include ファイルを介して) でこれらが記
       述されていた、ということです。%option reject%option yymore を使用し
       て、flex にこれらの機能を実際に使用していることを教えて下さい。

       flex scanner jammed - -s でコンパイルされたスキャナが、どのルールにも
       マッチしない入力文字列に遭遇しました。内部的な問題に起因してこのエラー
       が起こることもあります。

       token too large, exceeds YYLMAX - スキャナが %array を使っている場合
       に、あるルールが定数 YYLMAX (デフォルトで 8K バイト) より大きな文字列と
       マッチしました。flex の入力ファイルの定義部で YYLMAX を #define するこ
       とで値を大きくできます。

       scanner requires -8 flag to use the character 'x' - スキャナの記述に 8
       ビットの文字 'x' を識別する部分があり、-Cf もしくは -CF のテーブル圧縮
       オプションのためにデフォルトの 7 ビットになっているにもかかわらず、-8
       オプションをつけていないということです。詳細は、-7 フラグのオプションの
       議論を参照してください。

       flex scanner push-back overflow - unput() でテキストを戻しすぎたため、
       スキャナのバッファは、戻したテキストと現トークンを yytext に保てませ
       ん。この場合、理想的には、スキャナが動的にバッファの大きさを変えるべき
       ですが、現在のところそうなってはいません。

       input buffer overflow, can't enlarge buffer because scanner uses REJECT
       - スキャナは、非常に大きなトークンのマッチを調べていて、入力バッファを
       拡張する必要が起きました。しかしながら、バッファの拡張は、REJECT を使う
       スキャナでは、働きません。

       fatal flex scanner internal error--end of buffer missed - スキャナが使
       用しているフレームから (を越えて) ロングジャンプした後、再度スキャナに
       入った場合に起こります。再度スキャナに入る前に:

           yyrestart( yyin );

       を使うか、前述のように C++ スキャナクラスを使用するようにして下さい。

       too many start conditions in <> construct! - 存在するより多くの開始条件
       を <> 中に記載しました (少なくとも一つを二度記載しました)。

関連ファイル
       -ll    スキャナがリンクしなければならないライブラリ。

       lex.yy.c
              生成されたスキャナ (システムによっては、lexyy.c という名前になり
              ます)。

       lex.yy.cc
              -+ を使った時に作成された C++ スキャナクラス。

       <FlexLexer.h>
              C++ スキャナベースクラス FlexLexer とその導出クラス yyFlexLexer
              を定義するヘッダファイル。

       flex.skl
              スケルトンスキャナ。このファイルは、flex の実行時ではなく、flex
              を構築する時のみ利用されます。

       lex.backup
              -b フラグ用のバックアップ情報 (システムによっては、lex.bck とい
              う名前になります)。

欠陥 / バグ
       右文脈 (trailing context) パターンの中には、正しくマッチせず警告メッ
       セージ ("dangerous trailing context") を出すものがあります。これらのパ
       ターンは、ルールの最初の部分が 2番目の頭の部分とマッチするようなもので
       す。例えば "zx*/xy*" の場合、'x*' は、右文脈の頭の 'x' とマッチします。
       (POSIX ドラフトでは、そのようなパターンにマッチするテキストは、未定義で
       あると述べていることに注意して下さい。)

       右文脈の中には、実際には、固定長であるのにそうとは解釈されないものがあ
       り、上に述べた性能の低下が起こります。特に、'|' や {n} (例えば
       "foo{3}") は、常に可変長であると解釈されます。

       右文脈と特別なアクション '|' を組み合わせると固定の右文脈がよりコストの
       かかる可変の右文脈となります。例えば、次のようなものです:

           %%
           abc      |
           xyz/def


       %array もしくは -l オプションを指定しない場合、unput() を使うと yytext
       と yyleng を破壊します。

       NUL のパターンマッチングは、他の文字の比較よりかなり遅くなっています。

       入力バッファの動的な大きさの再調整は、時間がかかります。これは、現トー
       クン (一般に巨大) までのマッチした全テキストの再スキャンを伴うためで
       す。

       入力のバッファリングと先読みのため、<stdio.h> ルーチンと混合して使うこ
       とが出来ません。例えば、getchar()flex のルールは、うまく行きませ
       ん。代わりに input() を使って下さい。

       -v オプションで表示される全テーブルエントリには、どのルールがマッチした
       のかを決定するのに必要なテーブルエントリ数が含まれていません。エントリ
       の数は、スキャナが REJECT を使っていないときには DFA 状態数に等しく、
       使っているときには DFA 状態数よりいくらか大きくなります。

       REJECT がオプション -f もしくは -F とともに使えません。

       flex の内部アルゴリズムについてのドキュメントが必要です。

関連項目
       lex(1), yacc(1), sed(1), awk(1)

       John Levine, Tony Mason, and Doug Brown, Lex & Yacc, O'Reilly and
       Associates.  第 2 版を入手すること。

       M. E. Lesk and E. Schmidt, LEX - Lexical Analyzer Generator

       Alfred Aho, Ravi Sethi and Jeffrey Ullman, Compilers: Principles,
       Techniques and Tools, Addison-Wesley (1986).  flex で使用しているパター
       ンマッチング技法を解説している (決定性オートマトン)。

作者
       Vern Paxson が多くのアイデアとインスピレーションを得る助けを Van
       Jacobson から受けました。オリジナルバージョンは、Jef Poskanzer が作成し
       ました。高速テーブル表現は、Van Jacobson のデザインの部分実装です。この
       実装は、Kevin Gong と Vern Paxson が行いました。

       多くの flex ベータテスタ、フィードバッカ、コントリビュータ、特に
       Francois Pinard, Casey Leedom, Robert Abramovitz, Stan Adermann, Terry
       Allen, David Barker-Plummer, John Basrai, Neal Becker, Nelson H.F.
       Beebe, benson@odi.com, Karl Berry, Peter A. Bigot, Simon Blanchard,
       Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick Christopher,
       Brian Clapper, J.T. Conklin, Jason Coughlin, Bill Cox, Nick Cropper,
       Dave Curtis, Scott David Daniels, Chris G. Demetriou, Theo Deraadt,
       Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin, Chris Faylor,
       Chris Flatters, Jon Forrest, Jeffrey Friedl, Joe Gayda, Kaveh R. Ghazi,
       Wolfgang Glunz, Eric Goldman, Christopher M. Gould, Ulrich Grepel, Peer
       Griebel, Jan Hajic, Charles Hemphill, NORO Hideo, Jarkko Hietaniemi,
       Scott Hofmann, Jeff Honig, Dana Hudes, Eric Hughes, John Interrante,
       Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones,
       Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O Kane, Amir
       Katz, ken@ken.hilco.com, Kevin B. Kenny, Steve Kirsch, Winfried Koenig,
       Marq Kole, Ronald Lamprecht, Greg Lee, Rohan Lenard, Craig Leres, John
       Levine, Steve Liddle, David Loffredo, Mike Long, Mohamed el Lozy, Brian
       Madsen, Malte, Joe Marshall, Bengt Martensson, Chris Metcalf, Luke
       Mewburn, Jim Meyering, R. Alexander Milowski, Erik Naggum, G.T. Nicol,
       Landon Noll, James Nordby, Marc Nozell, Richard Ohnemus, Karsten
       Pahnke, Sven Panne, Roland Pesch, Walter Pelissero, Gaumond Pierre,
       Esmond Pitt, Jef Poskanzer, Joe Rahmeh, Jarmo Raiha, Frederic
       Raimbault, Pat Rankin, Rick Richardson, Kevin Rodgers, Kai Uwe Rommel,
       Jim Roskind, Alberto Santini, Andreas Scherer, Darrell Schiebel, Raf
       Schietekat, Doug Schmidt, Philippe Schnoebelen, Andreas Schwab, Larry
       Schwimmer, Alex Siegel, Eckehard Stolz, Jan-Erik Strvmquist, Mike
       Stump, Paul Stuart, Dave Tallman, Ian Lance Taylor, Chris Thewalt,
       Richard M. Timoney, Jodi Tsai, Paul Tuinenga, Gary Weik, Frank Whaley,
       Gerhard Wilhelms, Kent Williams, Ken Yap, Ron Zellar, Nathan Zelle,
       David Zuhn, および私の最低のメールアーカイブ能力から滑り落ちた方々、そ
       れらの方々の協力にも同様に感謝します。

       Keith Bostic, Jon Forrest, Noah Friedman, John Gilmore, Craig Leres,
       John Levine, Bob Mulcahy, G.T.  Nicol, Francois Pinard, Rich Salz,
       Richard Stallman には多くの悩みの分散に関して感謝します。

       Esmond Pitt と Earle Horton には、8 ビット文字サポートに関して; Benson
       Margulies と Fred Burke には、C++ サポートに関して; Kent Williams と
       Tom Epperly には、C++ クラスサポートに関して; Ove Ewerlid には、NUL の
       サポートに関して; Eric Hughes には、複数バッファのサポートに関して、そ
       れぞれ感謝します。

       この作品は、当初、私が CA Berkeley の Lawrence Berkeley Laboratory にお
       ける Real Time Systems Group にいた時に作成されました。私に協力してくれ
       た方々に感謝します。

       コメントは、vern@ee.lbl.gov に送って下さい。



Version 2.5.37                   May 21, 2013                          FLEX(1)

Table of Contents

FreeBSD マニュアル検索