.\"
.\" $FreeBSD$
.TH FLEX 1 "April 1995" "Version 2.5"
-.SH ̾¾Î
-flex \- ¹â®¤Ê»ú¶ç²òÀϽèÍý·Ï¤ÎÀ¸À®¥Ä¡¼¥ë
-.SH ½ñ¼°
+.SH 名称
+flex \- 高速な字句解析処理系の生成ツール
+.SH 書式
.B flex
.B [\-bcdfhilnpstvwBFILTV78+? \-C[aefFmr] \-ooutput \-Pprefix \-Sskeleton]
.B [\-\-help \-\-version]
.I [filename ...]
-.SH ³µÀâ
-Ëܥޥ˥奢¥ë¤Ï¡¢
-¥Æ¥¥¹¥È¤Î¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤ò¹Ô¤¦¥×¥í¥°¥é¥à¤òÀ¸À®¤¹¤ë¥Ä¡¼¥ë
+.SH 概説
+本マニュアルは、
+テキストのパターンマッチングを行うプログラムを生成するツール
.I flex
-¤ò°·¤¤¤Þ¤¹¡£
-Ëܥޥ˥奢¥ë¤Ï¥Á¥å¡¼¥È¥ê¥¢¥ë¤È¥ê¥Õ¥¡¥ì¥ó¥¹Àá¤È¤ò´Þ¤ß¤Þ¤¹:
+を扱います。
+本マニュアルはチュートリアルとリファレンス節とを含みます:
.nf
- ²òÀâ
- ¥Ä¡¼¥ë¤Îû¤¤³µÀâ
+ 解説
+ ツールの短い概説
- ´Êñ¤ÊÎã
+ 簡単な例
- ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È
+ 入力ファイルのフォーマット
- ¥Ñ¥¿¡¼¥ó
- flex ¤¬»ÈÍѤ¹¤ë³ÈÄ¥¤·¤¿Àµµ¬É½¸½
+ パターン
+ flex が使用する拡張した正規表現
- ÆþÎϤΥޥåÁÊýË¡
- ²¿¤¬¥Þ¥Ã¥Á¤¹¤ë¤«¤ò·èÄꤹ¤ëµ¬Â§
+ 入力のマッチ方法
+ 何がマッチするかを決定する規則
- ¥¢¥¯¥·¥ç¥ó
- ¥Ñ¥¿¡¼¥ó¤¬¥Þ¥Ã¥Á¤·¤¿»þ¤Ë²¿¤ò¹Ô¤¦¤«¤ò»ØÄꤹ¤ëÊýË¡
+ アクション
+ パターンがマッチした時に何を行うかを指定する方法
- À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê
- flex ¤¬À¸À®¤¹¤ë¥¹¥¥ã¥Ê¤Ë´Ø¤¹¤ë¾ÜºÙ;
- ÆþÎϸµ¤ÎÀ©¸æÊýË¡
+ 生成されたスキャナ
+ flex が生成するスキャナに関する詳細;
+ 入力元の制御方法
- ³«»Ï¾ò·ï
- ¥¹¥¥ã¥Ê¤Ø¤Îʸ̮¤ÎƳÆþ¤È¡¢
- "¥ß¥Ë¥¹¥¥ã¥Ê" ¤ÎÀ©¸æÊýË¡
+ 開始条件
+ スキャナへの文脈の導入と、
+ "ミニスキャナ" の制御方法
- Ê£¿ô¤ÎÆþÎϥХåե¡
- Ê£¿ô¤ÎÆþÎϸµ¤ò°·¤¦ÊýË¡;
- ¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯Ê¸»úÎ󤫤饹¥¥ã¥ó¤¹¤ëÊýË¡
+ è¤\87æ\95°ã\81®å\85¥å\8a\9bã\83\90ã\83\83ã\83\95ã\82¡
+ 複数の入力元を扱う方法;
+ ファイルではなく文字列からスキャンする方法
- ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Î¥ë¡¼¥ë
- ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Ë¥Þ¥Ã¥Á¤¹¤ëÆÃÊ̤ʥ롼¥ë
+ ファイルの終りのルール
+ ファイルの終りにマッチする特別なルール
- »¨Â¿¤Ê¥Þ¥¯¥í
- ¥¢¥¯¥·¥ç¥ó¤Ç»ÈÍѲÄǽ¤Ê¥Þ¥¯¥í¤Î¤Þ¤È¤á
+ 雑多なマクロ
+ アクションで使用可能なマクロのまとめ
- ¥æ¡¼¥¶¤¬»ÈÍѲÄǽ¤ÊÃÍ
- ¥¢¥¯¥·¥ç¥ó¤Ç»ÈÍѲÄǽ¤ÊÃͤΤޤȤá
+ ユーザが使用可能な値
+ アクションで使用可能な値のまとめ
- Yacc ¤È¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹
- lex ¥¹¥¥ã¥Ê¤È yacc ¥Ñ¡¼¥µ¤È¤Î·ë¹ç
+ Yacc ã\81¨ã\81®ã\82¤ã\83³ã\82¿ã\83\95ã\82§ã\83¼ã\82¹
+ lex スキャナと yacc パーサとの結合
- ¥ª¥×¥·¥ç¥ó
- flex ¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤È¡¢
- "%option" ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö
+ オプション
+ flex のコマンドラインオプションと、
+ "%option" ディレクティブ
- Àǽ´ØÏ¢
- ¥¹¥¥ã¥Ê¤ò²Äǽ¤Ê¸Â¤ê¹â®¤Ë¤¹¤ëÊýË¡
+ 性能関連
+ スキャナを可能な限り高速にする方法
- C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®
- C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹À¸À®¤Î¤¿¤á¤Î
- (¼Â¸³Åª¤Ê) µ¡Ç½
+ C++ スキャナの生成
+ C++ スキャナクラス生成のための
+ (å®\9fé¨\93ç\9a\84ã\81ª) æ©\9fè\83½
- Lex ¤ª¤è¤Ó POSIX ¤È¤ÎÈó¸ß´¹À
- AT&T lex ¤ª¤è¤Ó POSIX lex ɸ½à¤È
- flex ¤È¤Î°ã¤¤
+ Lex および POSIX との非互換性
+ AT&T lex および POSIX lex 標準と
+ flex との違い
- ¿ÇÃÇ
- flex (¤â¤·¤¯¤ÏÀ¸À®¤·¤¿¥¹¥¥ã¥Ê) ¤¬½ÐÎϤ¹¤ë
- ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ç°ÕÌ£¤¬ÌÀ³Î¤Ç¤Ê¤¤¤â¤Î
+ 診断
+ flex (もしくは生成したスキャナ) が出力する
+ エラーメッセージで意味が明確でないもの
- ´ØÏ¢¥Õ¥¡¥¤¥ë
- flex ¤¬»ÈÍѤ¹¤ë¥Õ¥¡¥¤¥ë
+ 関連ファイル
+ flex が使用するファイル
- ·ç´Ù / ¥Ð¥°
- flex ¤Î´ûÃΤÎÌäÂê
+ æ¬ é\99¥ / ã\83\90ã\82°
+ flex の既知の問題
- ´ØÏ¢¹àÌÜ
- ¥Ä¡¼¥ë¤Ë´Ø·¸¤¹¤ë¾¤Î¥É¥¥å¥á¥ó¥È
+ 関連項目
+ ツールに関係する他のドキュメント
- ºî¼Ô
- Ï¢ÍíÊýË¡¤ò´Þ¤ß¤Þ¤¹
+ 作者
+ 連絡方法を含みます
.fi
-.SH ²òÀâ
+.SH 解説
.I flex
-¤Ï
-.I ¥¹¥¥ã¥Ê
-¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥Ä¡¼¥ë¤Ç¤¹¡£
-¤³¤³¤Ç¡¢¥¹¥¥ã¥Ê¤È¤Ï¡¢
-¥Æ¥¥¹¥ÈÆâ¤Î»ú¶ç¥Ñ¥¿¡¼¥ó¤ò²òÀϤ¹¤ë¥×¥í¥°¥é¥à¤Ç¤¹¡£
+は
+.I スキャナ
+を生成するためのツールです。
+ここで、スキャナとは、
+テキスト内の字句パターンを解析するプログラムです。
.I flex
-¤Ï»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¤â¤·¤¯¤Ï¥Õ¥¡¥¤¥ë̾¤¬Í¿¤¨¤é¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï
-ɸ½àÆþÎϤ«¤é¡¢À¸À®¤¹¤ë¥¹¥¥ã¥Ê¤Îµ½Ò¤òÆɤ߹þ¤ß¤Þ¤¹¡£
-¤³¤Îµ½Ò¤Ï¡¢
-Àµµ¬É½¸½¤È C ¥³¡¼¥É¤Î¥Ú¥¢¤Î·Á¤ò¤È¤Ã¤Æ¤¤¤Þ¤¹¡£
-¤³¤ì¤Ï
-.I ¥ë¡¼¥ë
-¤È¸Æ¤Ð¤ì¤Þ¤¹¡£
+は指定したファイル、もしくはファイル名が与えられなかった場合は
+標準入力から、生成するスキャナの記述を読み込みます。
+この記述は、
+正規表現と C コードのペアの形をとっています。
+これは
+.I ルール
+と呼ばれます。
.I flex
-¤Ï¡¢½ÐÎϤȤ·¤Æ C ¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Î
+は、出力として C ソースファイルの
.B lex.yy.c
-¤òÀ¸À®¤·¤Þ¤¹¤¬¡¢¤½¤ÎÃæ¤Ë
+を生成しますが、その中に
.B yylex()
-¥ë¡¼¥Á¥ó¤¬ÄêµÁ¤µ¤ì¤Þ¤¹¡£
-¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¡¢
+ルーチンが定義されます。
+このファイルはコンパイルされ、
.B \-ll
-¥é¥¤¥Ö¥é¥ê¤È¤È¤â¤Ë¥ê¥ó¥¯¤µ¤ì¤Æ¡¢
-¼Â¹Ô·Á¼°¤È¤Ê¤ê¤Þ¤¹¡£
-¼Â¹Ô·Á¼°¤¬Áö¤ê»Ï¤á¤ë¤È¡¢
-Àµµ¬É½¸½¤ò¥Þ¥Ã¥Á¤µ¤»¤ë¤¿¤á¤Ë
-ÆþÎϤ¬²òÀϤµ¤ì¤Þ¤¹¡£
-¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤ò¸«¤Ä¤±¤ë¤È¡¢Âбþ¤¹¤ë C ¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
-.SH ´Êñ¤ÊÎã
-¤Þ¤º´Êñ¤ÊÎ㤫¤é¡¢
+ライブラリとともにリンクされて、
+実行形式となります。
+実行形式が走り始めると、
+正規表現をマッチさせるために
+入力が解析されます。
+マッチするものを見つけると、対応する C コードが実行されます。
+.SH 簡単な例
+まず簡単な例から、
.I flex
-¤Î»È¤¤Êý¤ò¸«¤Æ¹Ô¤¤Þ¤·¤ç¤¦¡£
-¼¡¤Î
+の使い方を見て行きましょう。
+次の
.I flex
-¤ÎÆþÎϤϡ¢"username" ¤È¤¤¤¦Ê¸»úÎó¤Ë½Ð²ñ¤¦¤È¥æ¡¼¥¶¤Î¥í¥°¥¤¥ó̾¤ËÃÖ¤´¹¤¨¤ë
-¥¹¥¥ã¥Ê¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹:
+の入力は、"username" という文字列に出会うとユーザのログイン名に置き換える
+スキャナを指定しています:
.nf
%%
username printf( "%s", getlogin() );
.fi
-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢
+デフォルトでは、
.I flex
-¥¹¥¥ã¥Ê¤Ë¥Þ¥Ã¥Á¤·¤Ê¤«¤Ã¤¿¥Æ¥¥¹¥È¤Ï½ÐÎϤ˥³¥Ô¡¼¤µ¤ì¤Þ¤¹¤Î¤Ç¡¢
-"username" ¤òŸ³«¤·¤Ê¤¬¤éÆþÎϤò½ÐÎϤ˥³¥Ô¡¼¤¹¤ë¤³¤È¤¬
-¤³¤Î¥¹¥¥ã¥Ê¤ÎºÇ½ªÅª¤Ê·ë²Ì¤È¤Ê¤ê¤Þ¤¹¡£
-¤³¤ÎÆþÎϤˤϤ¿¤À°ì¤Ä¤Î¥ë¡¼¥ë¤À¤±¤¬¤¢¤ê¤Þ¤¹¡£
-"username" ¤Ï
-.I ¥Ñ¥¿¡¼¥ó
-¤Ç¤¢¤ê¡¢"printf" ¤Ï
-.I ¥¢¥¯¥·¥ç¥ó
-¤Ç¤¹¡£
-"%%" ¤Ï¥ë¡¼¥ë¤Î»Ï¤Þ¤ê¤Î°õ¤Ç¤¹¡£
+スキャナにマッチしなかったテキストは出力にコピーされますので、
+"username" を展開しながら入力を出力にコピーすることが
+このスキャナの最終的な結果となります。
+この入力にはただ一つのルールだけがあります。
+"username" は
+.I パターン
+であり、"printf" は
+.I アクション
+です。
+"%%" はルールの始まりの印です。
.PP
-Ê̤ÎÎã¤ò¸«¤Æ¸«¤Þ¤·¤ç¤¦:
+別の例を見て見ましょう:
.nf
%{
}
.fi
-¤³¤Î¥¹¥¥ã¥Ê¤ÏÆþÎϤÎʸ»ú¿ô¤ª¤è¤Ó¹Ô¿ô¤ò¿ô¤¨¤Þ¤¹
-(¿ô¤¨¤¿ºÇ½ª·ë²Ì¤òÊó¹ð¤¹¤ë¤À¤±¤Ç¤¹)¡£
-ºÇ½é¤Î¹Ô¤Ï 2 ¤Ä¤ÎÂç°èÊÑ¿ô "num_lines" ¤È "num_chars" ¤òÀë¸À¤·¤Þ¤¹¡£
-¤³¤ì¤é¤ÎÊÑ¿ô¤Ï¡¢2 ÈÖÌܤΠ"%%" ¤Î¸å¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ë
+このスキャナは入力の文字数および行数を数えます
+(数えた最終結果を報告するだけです)。
+最初の行は 2 つの大域変数 "num_lines" と "num_chars" を宣言します。
+これらの変数は、2 番目の "%%" の後に宣言されている
.B yylex()
-¤È
+と
.B main()
-¤Î¥ë¡¼¥Á¥ó¤«¤é¥¢¥¯¥»¥¹²Äǽ¤Ç¤¹¡£
-¤³¤³¤Ë¤Ï 2 ¤Ä¤Î¥ë¡¼¥ë¤¬¤¢¤ê¤Þ¤¹¡£
-1 ¤ÄÌܤϲþ¹Ôʸ»ú ("\\n") ¤Ë¥Þ¥Ã¥Á¤·¡¢¹Ô¿ô¤Èʸ»ú¿ô¤Î¥«¥¦¥ó¥È¤òÁý²Ã¤µ¤»¤Þ¤¹¡£
-¤â¤¦ 1 ¤Ä¤Ï¡¢²þ¹Ôʸ»ú°Ê³°¤ÎÁ´¤Æ¤Îʸ»ú
-("." ¤È¤¤¤¦Àµµ¬É½¸½¤Çɽ¤µ¤ì¤Æ¤¤¤Þ¤¹)¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
+のルーチンからアクセス可能です。
+ここには 2 つのルールがあります。
+1 つ目は改行文字 ("\\n") にマッチし、行数と文字数のカウントを増加させます。
+もう 1 つは、改行文字以外の全ての文字
+("." という正規表現で表されています)にマッチします。
.PP
-¼¡¤Ï¤â¤¦¤Á¤ç¤Ã¤ÈÊ£»¨¤ÊÎã¤Ç¤¹:
+次はもうちょっと複雑な例です:
.nf
/* scanner for a toy Pascal-like language */
}
.fi
-¤³¤ì¤Ï Pascal ¤Î¤è¤¦¤Ê¸À¸ì¤Îñ½ã¤Ê¥¹¥¥ã¥Ê¤Î¸¶·¿¤Ç¤¹¡£
-°Û¤Ê¤Ã¤¿¥¿¥¤¥×¤Î
-.I ¥È¡¼¥¯¥ó
-¤òÄêµÁ¤·¡¢¤³¤ì¤ò¸«ÉÕ¤±¤ë¤ÈÊó¹ð¤·¤Þ¤¹¡£
+これは Pascal のような言語の単純なスキャナの原型です。
+異なったタイプの
+.I トークン
+を定義し、これを見付けると報告します。
.PP
-¤³¤ÎÎã¤Î¾ÜºÙ¤Ï¡¢°Ê¹ß¤ÎÀá¤ÇÀâÌÀ¤·¤Þ¤¹¡£
-.SH ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È
+この例の詳細は、以降の節で説明します。
+.SH 入力ファイルのフォーマット
.I flex
-¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Ï 3 ¤Ä¤ÎÉôʬ¤«¤é¤Ê¤ê¡¢
+の入力ファイルは 3 つの部分からなり、
.B %%
-¤À¤±¤«¤é¤Ê¤ë¹Ô¤Ë¤è¤êʬ¤±¤é¤ì¤Þ¤¹:
+だけからなる行により分けられます:
.nf
- ÄêµÁ
+ 定義
%%
- ¥ë¡¼¥ë
+ ルール
%%
- ¥æ¡¼¥¶¥³¡¼¥É
+ ユーザコード
.fi
-.I ÄêµÁ
-Éôʬ¤Ï¡¢¥¹¥¥ã¥Ê¤ÎÀë¸À¤òñ½ã²½¤¹¤ëñ½ã¤Ê
-.I ̾Á°
-¤ÎÄêµÁ¤ÎÀë¸À¤È¡¢¸å¤ÇÀâÌÀ¤¹¤ë
-.I ³«»Ï¾ò·ï
-¤ÎÀë¸À¤È¤«¤é¤Ê¤ê¤Þ¤¹¡£
+.I 定義
+部分は、スキャナの宣言を単純化する単純な
+.I 名前
+の定義の宣言と、後で説明する
+.I 開始条件
+の宣言とからなります。
.PP
-̾Á°¤ÎÄêµÁ¤Ï¼¡¤Î·Á¼°¤Ç¤¹:
+名前の定義は次の形式です:
.nf
- ̾Á°\ ÄêµÁ
+ 名前\ 定義
.fi
-"̾Á°" ¤Ï¸ì¤Ç¤¢¤ê¡¢
-¥ì¥¿¡¼¤«¥¢¥ó¥À¡¼¥¹¥³¥¢ ('_') ¤«¤é»Ï¤Þ¤Ã¤Æ 0 ¸Ä°Ê¾å¤Î¥ì¥¿¡¼¡¦¿ô»ú¡¦'_'¡¦'-'
-(¥À¥Ã¥·¥å)¤¬Â³¤¤Þ¤¹¡£
-ÄêµÁ¤Ï¡¢Ì¾Á°¤Ë³¤¯ºÇ½é¤ÎÈó¶õÇòʸ»ú¤«¤é»Ï¤Þ¤ê¡¢¹ÔËö¤Þ¤Ç³¤¯¤â¤Î¤È¤µ¤ì¤Þ¤¹¡£
-ÄêµÁ¤Ï¸å¤Ç "{̾Á°}" ¤Ç»²¾È¤Ç¤¡¢"(ÄêµÁ)" ¤òŸ³«¤·¤Þ¤¹¡£
-Î㤨¤Ð¡¢
+"名前" は語であり、
+レターかアンダースコア ('_') から始まって 0 個以上のレター・数字・'_'・'-'
+(ダッシュ)が続きます。
+定義は、名前に続く最初の非空白文字から始まり、行末まで続くものとされます。
+定義は後で "{名前}" で参照でき、"(定義)" を展開します。
+例えば、
.nf
DIGIT [0-9]
ID [a-z][a-z0-9]*
.fi
-¤Ï¡¢
-"DIGIT" ¤¬Ã±°ì¤Î¿ô»ú¤Ë¥Þ¥Ã¥Á¤¹¤ëÀµµ¬É½¸½¤Ç¤¢¤ë¤ÈÄêµÁ¤·¡¢
-"ID" ¤¬¥ì¥¿¡¼¤Ë 0 ¸Ä°Ê¾å¤Î¥ì¥¿¡¼¤«¿ô»ú¤¬Â³¤¯Àµµ¬É½¸½¤Ç¤¢¤ë¤ÈÄêµÁ¤·¤Þ¤¹¡£
-¸å¤Ç½Ð¤ÆÍè¤ë»²¾È
+は、
+"DIGIT" が単一の数字にマッチする正規表現であると定義し、
+"ID" がレターに 0 個以上のレターか数字が続く正規表現であると定義します。
+後で出て来る参照
.nf
{DIGIT}+"."{DIGIT}*
.fi
-¤Ï
+は
.nf
([0-9])+"."([0-9])*
.fi
-¤ÈƱ¤¸¤Ç¤¢¤ê¡¢1 ¸Ä°Ê¾å¤Î¿ô»ú¤Ë '.' ¤¬Â³¤¡¢
-0 ¸Ä°Ê¾å¤Î¿ô»ú¤¬Â³¤¯¤â¤Î¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
+と同じであり、1 個以上の数字に '.' が続き、
+0 個以上の数字が続くものにマッチします。
.PP
.I flex
-¤ÎÆþÎϤÎ
-.I ¥ë¡¼¥ë
-¤Ï¼¡¤Î·Á¼°¤Î°ìÏ¢¤Î¥ë¡¼¥ë¤«¤é¤Ê¤ê¤Þ¤¹:
+の入力の
+.I ルール
+は次の形式の一連のルールからなります:
.nf
- ¥Ñ¥¿¡¼¥ó\ \ \ ¥¢¥¯¥·¥ç¥ó
+ パターン\ \ \ アクション
.fi
-¤³¤³¤Ç¡¢¥Ñ¥¿¡¼¥ó¤Ï¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Æ¤¤¤Æ¤Ï¤Ê¤é¤º¡¢
-¥¢¥¯¥·¥ç¥ó¤ÏƱ¤¸¹Ô¤«¤é»Ï¤Þ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
+ここで、パターンはインデントされていてはならず、
+アクションは同じ行から始まる必要があります。
.PP
-¥Ñ¥¿¡¼¥ó¤È¥¢¥¯¥·¥ç¥ó¤Î¾ÜºÙ¤Ï¸å¤Î²òÀâ¤ò¸«¤Æ²¼¤µ¤¤¡£
+パターンとアクションの詳細は後の解説を見て下さい。
.PP
-ºÇ¸å¤Ë¡¢¥æ¡¼¥¶¥³¡¼¥É¤ÎÉôʬ¤Ïñ½ã¤Ë¤½¤Î¤Þ¤Þ¤Î·Á¤Ç
+最後に、ユーザコードの部分は単純にそのままの形で
.B lex.yy.c
-¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£
-¥¹¥¥ã¥Ê¤ò¸Æ¤Ó½Ð¤¹¤Þ¤¿¤Ï¸Æ¤Ó½Ð¤µ¤ì¤ëÉÕ¿ï¥ë¡¼¥Á¥ó¤Î¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£
-¤³¤ÎÉôʬ¤Ï¤¢¤Ã¤Æ¤â̵¤¯¤Æ¤â¹½¤¤¤Þ¤»¤ó;
-̵¤¤¾ì¹ç¤Ë¤Ï¡¢ÆþÎÏ¥Õ¥¡¥¤¥ëÃæ¤Î 2 ÈÖÌܤÎ
+にコピーされます。
+スキャナを呼び出すまたは呼び出される付随ルーチンのために使用されます。
+この部分はあっても無くても構いません;
+無い場合には、入力ファイル中の 2 番目の
.B %%
-¤â¾Êά¤Ç¤¤Þ¤¹¡£
+も省略できます。
.PP
-ÄêµÁ¤È¥ë¡¼¥ë¤ÎÉôʬ¤Ç¤Ï¡¢
-.I ¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿
-¥Æ¥¥¹¥È¤È
+定義とルールの部分では、
+.I インデントされた
+テキストと
.B %{
-¤È
+と
.B %}
-¤È¤Î´Ö¤Î¥Æ¥¥¹¥È¤Ï¤½¤Î¤Þ¤Þ¤Î·Á¤Ç½ÐÎϤ˥³¥Ô¡¼¤µ¤ì¤Þ¤¹
-(¤³¤ÎºÝ %{} ¤Ïºï½ü¤µ¤ì¤Þ¤¹)¡£
-%{} ¤Ï¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¹Ô¤Ë¸½¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
-.PP
-¥ë¡¼¥ë¤ÎÉôʬ¤Ç¤Ï¡¢
-ºÇ½é¤Î¥ë¡¼¥ë¤ÎÁ°¤Ë¸½¤ì¤ë¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿¤â¤·¤¯¤Ï %{} Éôʬ¤Î¥Æ¥¥¹¥È¤Ï¡¢
-¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó¤Ë¥í¡¼¥«¥ë¤ÊÊÑ¿ô¤È¡¢
-(Àë¸À¤Î¸å¤Ç¤Ï)¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó¤ËÆþ¤ë¤¿¤Ó¤Ë¼Â¹Ô¤µ¤ì¤ë¥³¡¼¥É¤È¤òÀë¸À¤·¤Þ¤¹¡£
-¥ë¡¼¥ëÉôʬ¤Î¾¤Î¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿¤â¤·¤¯¤Ï %{} Éôʬ¤Î¥Æ¥¥¹¥È¤Ï
-½ÐÎϤ˥³¥Ô¡¼¤µ¤ì¤Þ¤¹¤¬¡¢
-°ÕÌ£¤Ï¤Á¤ã¤ó¤ÈÄêµÁ¤µ¤ì¤Æ¤ª¤é¤º¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥¨¥é¡¼¤È¤Ê¤ë¤«¤âÃΤì¤Þ¤»¤ó
-(¤³¤Î»ÅÍͤÏ
+との間のテキストはそのままの形で出力にコピーされます
+(この際 %{} は削除されます)。
+%{} はインデントされていない行に現れる必要があります。
+.PP
+ルールの部分では、
+最初のルールの前に現れるインデントされたもしくは %{} 部分のテキストは、
+スキャンルーチンにローカルな変数と、
+(宣言の後では)スキャンルーチンに入るたびに実行されるコードとを宣言します。
+ルール部分の他のインデントされたもしくは %{} 部分のテキストは
+出力にコピーされますが、
+意味はちゃんと定義されておらずコンパイル時にエラーとなるかも知れません
+(この仕様は
.I POSIX
-¸ß´¹¤Î¤¿¤á¤Ë¤¢¤ê¤Þ¤¹; ¾¤Î¤³¤Î¤è¤¦¤Ê»ÅÍͤϰʹߤò¸«¤Æ²¼¤µ¤¤)¡£
-.PP
-ÄêµÁ¤ÎÉôʬ(¥ë¡¼¥ë¤ÎÉôʬ¤Ç¤Ï¤Ê¤¤¤Ç¤¹)¤Ç¤Ï¡¢
-¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥³¥á¥ó¥È("/*" ¤«¤é»Ï¤Þ¤ë¹Ô) ¤Ï¼¡¤Î "*/" ¤Þ¤Ç
-¤½¤Î¤Þ¤Þ¤Î·Á¤Ç¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£
-.SH ¥Ñ¥¿¡¼¥ó
-ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¿¡¼¥ó¤Ï³ÈÄ¥¤·¤¿Àµµ¬É½¸½¤ò»È¤Ã¤Æµ½Ò¤·¤Þ¤¹¡£
-°Ê²¼¤Ë¼¨¤·¤Þ¤¹:
-.nf
-
- 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¡£
- {̾Á°} "̾Á°" ¤ÎÄêµÁ¤ÎŸ³«¡£
- (¾å¤ò»²¾È)
+互換のためにあります; 他のこのような仕様は以降を見て下さい)。
+.PP
+定義の部分(ルールの部分ではないです)では、
+インデントされていないコメント("/*" から始まる行) は次の "*/" まで
+そのままの形でコピーされます。
+.SH パターン
+入力ファイルのパターンは拡張した正規表現を使って記述します。
+以下に示します:
+.nf
+
+ 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¡£(³«»Ï¾ò·ï¤Ë¤Ä¤¤¤Æ¤Ï°Ê²¼¤ò
- »²¾È)¡£
+ 文字列 [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¡£³«»Ï¾ò·ï¤ÏÇÓ¾Ū¤Ê¤â¤Î¤Ç¤â¤è¤¤¡£
+ 上に同じ。ただし開始条件は s1, s2, s3 のいずれでもよい。
+ <*>r 任意の開始条件の r。開始条件は排他的なものでもよい。
- <<EOF>> ¥Õ¥¡¥¤¥ë¤Î½ªÎ»¡£
+ <<EOF>> ファイルの終了。
<s1,s2><<EOF>>
- ³«»Ï¾ò·ï¤¬ s1 ¤â¤·¤¯¤Ï s2 ¤Ç¤¢¤ë¤È¤¤Î¥Õ¥¡¥¤¥ë¤Î½ªÎ»¡£
+ 開始条件が s1 もしくは s2 であるときのファイルの終了。
.fi
-ʸ»ú¥¯¥é¥¹Ãæ¤Ç¤Ï¡¢Á´¤Æ¤ÎÀµµ¬É½¸½¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï¡¢
-¥¨¥¹¥±¡¼¥× ('\\') ¤ª¤è¤Ó
-ʸ»ú¥¯¥é¥¹¥ª¥Ú¥ì¡¼¥¿¤Ç¤¢¤ë '-' ¤È ']' ¤È¥¯¥é¥¹¤ÎÀèƬ¤Î '^' ¤ò½ü¤
-ÆÃÊ̤ʰÕÌ£¤ò¼º¤¦¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
+文字クラス中では、全ての正規表現のオペレータは、
+エスケープ ('\\') および
+文字クラスオペレータである '-' と ']' とクラスの先頭の '^' を除き
+特別な意味を失うことに注意して下さい。
.PP
-¾å¤Ëµó¤²¤¿Àµµ¬É½¸½¤ÏÍ¥Àè½ç°Ì¤Ë¤è¤Ã¤Æ¥°¥ë¡¼¥×¤Ëʬ¤±¤é¤ì¤Æ¤¤¤Þ¤¹¡£
-°ìÈÖ¾å¤Î¥°¥ë¡¼¥×¤¬ºÇ¤â¹â¤¤Í¥ÀèÅ٤ǡ¢
-°ìÈÖ²¼¤Î¥°¥ë¡¼¥×¤ÎÍ¥Àè½ç°Ì¤¬ºÇ¤âÄ㤯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
-¥°¥ë¡¼¥×Æâ¤Ç¤ÏƱ¤¸Í¥Àè½ç°Ì¤Ç¤¹¡£Î㤨¤Ð¡¢
+上に挙げた正規表現は優先順位によってグループに分けられています。
+一番上のグループが最も高い優先度で、
+一番下のグループの優先順位が最も低くなっています。
+グループ内では同じ優先順位です。例えば、
.nf
foo|bar*
.fi
-¤Ï
+は
.nf
(foo)|(ba(r*))
.fi
-¤ÈƱ¤¸¤Ç¤¹¡£¤Ê¤¼¤Ê¤é '*' ¥ª¥Ú¥ì¡¼¥¿¤ÏÏ¢·ë¤è¤êÍ¥ÀèÅÙ¤¬¹â¤¯¡¢
-Ï¢·ë¤ÏÁª¸À ('|') ¤è¤êÍ¥ÀèÅÙ¤¬¹â¤¤¤«¤é¤Ç¤¹¡£¤³¤Î¥Ñ¥¿¡¼¥ó¤Ï
-ʸ»úÎó "foo"
-.I ¤â¤·¤¯¤Ï
-ʸ»úÎó "ba" ¤Ë 0 ¸Ä°Ê¾å¤Î r ¤¬¤Ä¤Å¤¯¤â¤Î¤Î
-.I ¤É¤Á¤é¤Ë¤â
-¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
-"foo" ¤â¤·¤¯¤Ï 0 ¸Ä°Ê¾å¤Î "bar" ¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¤¿¤á¤Ë¤Ï¼¡¤Îɽ¸½¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤:
+と同じです。なぜなら '*' オペレータは連結より優先度が高く、
+連結は選言 ('|') より優先度が高いからです。このパターンは
+文字列 "foo"
+.I もしくは
+文字列 "ba" に 0 個以上の r がつづくものの
+.I どちらにも
+マッチします。
+"foo" もしくは 0 個以上の "bar" にマッチさせるためには次の表現を使用して下さい:
.nf
foo|(bar)*
.fi
-0 ¸Ä°Ê¾å¤Î "foo" ¤Þ¤¿¤Ï "bar" ¤Ë¥Þ¥Ã¥Á¤¹¤ë¤¿¤á¤Ë¤Ï¼¡¤Îɽ¸½¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤:
+0 個以上の "foo" または "bar" にマッチするためには次の表現を使用して下さい:
.nf
(foo|bar)*
.fi
.PP
-ʸ»ú¤â¤·¤¯¤Ïʸ»úÈϰϤ˲䨡¢Ê¸»ú¥¯¥é¥¹¤âʸ»ú¥¯¥é¥¹¤Î
-.I ɽ¸½
-¤ò´Þ¤ß¤Þ¤¹¡£
-¤³¤ì¤é¤Îɽ¸½¤Ï
+文字もしくは文字範囲に加え、文字クラスも文字クラスの
+.I 表現
+を含みます。
+これらの表現は
.B [:
-¤ª¤è¤Ó
+および
.B :]
-¤Î¥Ç¥ê¥ß¥¿¤Ë°Ï¤Þ¤ì¤Þ¤¹ (ʸ»ú¥¯¥é¥¹¤Î '[' ¤È ']' ¤È¤Î´Ö¤Ë¸½¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹;
-¾¤ÎÍ×ÁǤ¬Ê¸»ú¥¯¥é¥¹Ãæ¤Ë¸½¤ì¤Æ¤â¹½¤¤¤Þ¤»¤ó)¡£
-͸ú¤Êɽ¸½¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¹:
+のデリミタに囲まれます (文字クラスの '[' と ']' との間に現れる必要があります;
+他の要素が文字クラス中に現れても構いません)。
+有効な表現は以下の通りです:
.nf
[:alnum:] [:alpha:] [:blank:]
[:space:] [:upper:] [:xdigit:]
.fi
-¤³¤ì¤é¤Îɽ¸½¤ÏÂбþ¤¹¤ëɸ½à C ¤Î
+これらの表現は対応する標準 C の
.B isXXX
-´Ø¿ô¤ËŬ¹ç¤¹¤ëÁ´¤Æ¤Îʸ»ú½¸¹ç¤ò»Ø¼¨¤·¤Þ¤¹¡£Î㤨¤Ð¡¢
+関数に適合する全ての文字集合を指示します。例えば、
.B [:alnum:]
-¤Ï
+は
.B isalnum()
-¤¬¿¿¤òÊÖ¤¹Ê¸»ú¤ò»Ø¼¨¤·¤Þ¤¹ - ¤¹¤Ê¤ï¤Á¤¹¤Ù¤Æ¤Î¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¤È¿ô»ú¤Ç¤¹¡£
+が真を返す文字を指示します - すなわちすべてのアルファベットと数字です。
.B isblank(),
-¤¬Ìµ¤¤¥·¥¹¥Æ¥à¤Ç¤Ï¡¢flex ¤Ï
+が無いシステムでは、flex は
.B [:blank:]
-¤ò¶õÇò¤È¥¿¥Ö¤ÈÄêµÁ¤·¤Þ¤¹¡£
+を空白とタブと定義します。
.PP
-Î㤨¤Ð°Ê²¼¤Îɽ¸½¤ÏÁ´¤ÆƱ¤¸¤Ç¤¹:
+例えば以下の表現は全て同じです:
.nf
[[:alnum:]]
[a-zA-Z0-9]
.fi
-¥¹¥¥ã¥Ê¤¬Âçʸ»ú¾®Ê¸»ú¤ò°Õ¼±¤·¤Ê¤¤¾ì¹ç(
+スキャナが大文字小文字を意識しない場合(
.B \-i
-¥Õ¥é¥°»ØÄê»þ)
+フラグ指定時)
.B [:upper:]
-¤È
+と
.B [:lower:]
-¤Ï
+は
.B [:alpha:]
-¤ÈƱ¤¸¤Ç¤¹¡£
+と同じです。
.PP
-¥Ñ¥¿¡¼¥ó¤Ë´Ø¤¹¤ëÃí°ÕÅÀ¤Ç¤¹:
+パターンに関する注意点です:
.IP -
-ÈÝÄêʸ»ú¥¯¥é¥¹¡¢Î㤨¤Ð¾å¤Î "[^A-Z]" ¤Ï
-"\\n" (¤â¤·¤¯¤Ï¤³¤ì¤òɽ¤¹¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹) ¤¬ÌÀ¼¨Åª¤Ë
-ÈÝÄêʸ»ú¥¯¥é¥¹¤Ë¸½¤ì¤Æ¤¤¤ë¾ì¹ç (Î㤨¤Ð "[^A-Z\\n]") ¤ò½ü¤
-.I ²þ¹Ô¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
-¤³¤ì¤Ï¾¤ÎÀµµ¬É½¸½¥Ä¡¼¥ë¤¬ÈÝÄêʸ»ú¥¯¥é¥¹¤ò°·¤¦ÊýË¡¤È¤Ï°Û¤Ê¤ê¤Þ¤¹¤¬¡¢
-ÉÔ¹¬¤Ê¤³¤È¤Ë¤³¤ÎÌ·½â¤ÏÎò»ËŪ¤Ë³ÎΩ¤·¤Æ¤¤¤Þ¤¹¡£
-²þ¹Ô¤Ë¥Þ¥Ã¥Á¤¹¤ë¤È¤Ï¡¢
-ÆþÎϤËÊ̤Υ¯¥ª¡¼¥È¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ë [^"]* ¤Î¤è¤¦¤Ê¥Ñ¥¿¡¼¥ó¤¬
-ÆþÎÏÁ´ÂΤ˥ޥåÁ¤¹¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£
+否定文字クラス、例えば上の "[^A-Z]" は
+"\\n" (もしくはこれを表すエスケープシーケンス) が明示的に
+否定文字クラスに現れている場合 (例えば "[^A-Z\\n]") を除き
+.I 改行にマッチします。
+これは他の正規表現ツールが否定文字クラスを扱う方法とは異なりますが、
+不幸なことにこの矛盾は歴史的に確立しています。
+改行にマッチするとは、
+入力に別のクオートが存在しない場合に [^"]* のようなパターンが
+入力全体にマッチすることを意味します。
.IP -
-¥ë¡¼¥ë¤Ï±¦Ê¸Ì®('/' ¥ª¥Ú¥ì¡¼¥¿¤â¤·¤¯¤Ï '$' ¥ª¥Ú¥ì¡¼¥¿)
-¤ò¹â¡¹°ì¤Ä¤·¤«»ý¤Æ¤Þ¤»¤ó¡£
-³«»Ï¾ò·ï '^' ¤È "<<EOF>>" ¥Ñ¥¿¡¼¥ó¤Ï
-¥Ñ¥¿¡¼¥ó¤ÎºÇ½é¤Ë¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¢ '/', '$'
-ƱÍÍ¤Ë () Æâ¤Ë¤¤¤ì¤ë¤³¤È¤Ï½ÐÍè¤Þ¤»¤ó¡£
-¥ë¡¼¥ë¤ÎÀèƬ¤Ç¤Ï¤Ê¤¤ '^' ¤â¤·¤¯¤Ï¥ë¡¼¥ë¤Î½ª¤ê¤Ç¤Ï¤Ê¤¤ '$' ¤Ï
-ÆÃÊ̤ʰÕÌ£¤ò¼º¤¤¡¢Ä̾ï¤Îʸ»ú¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£
+ã\83«ã\83¼ã\83«ã\81¯å\8f³æ\96\87è\84\88('/' ã\82ªã\83\9aã\83¬ã\83¼ã\82¿ã\82\82ã\81\97ã\81\8fã\81¯ '$' ã\82ªã\83\9aã\83¬ã\83¼ã\82¿)
+を高々一つしか持てません。
+開始条件 '^' と "<<EOF>>" パターンは
+パターンの最初になければならず、 '/', '$'
+同様に () 内にいれることは出来ません。
+ルールの先頭ではない '^' もしくはルールの終りではない '$' は
+特別な意味を失い、通常の文字として扱われます。
.IP
-°Ê²¼¤Ï̵¸ú¤Ç¤¹:
+以下は無効です:
.nf
foo/bar$
<sc1>foo<sc2>bar
.fi
-Á°¼Ô¤Ï "foo/bar\\n" ¤È½ñ¤±¤Þ¤¹¡£
+前者は "foo/bar\\n" と書けます。
.IP
-°Ê²¼¤Ç¤Ï '$' ¤È '^' ¤È¤ÏÄ̾ï¤Îʸ»ú¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹:
+以下では '$' と '^' とは通常の文字として扱われます:
.nf
foo|(bar$)
foo|^bar
.fi
-"foo" ¤â¤·¤¯¤Ï "²þ¹Ô¤¬Â³¤¯ bar" ¤ò»ØÄꤷ¤¿¤¤¾ì¹ç¤Ï¡¢
-¼¡¤Îɽ¸½¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤ (ÆÃÊÌ¤Ê '|' ¤ÎÆ°ºî¤Ï¸å¤ÇÀâÌÀ¤·¤Þ¤¹):
+"foo" もしくは "改行が続く bar" を指定したい場合は、
+次の表現を使用して下さい (特別な '|' の動作は後で説明します):
.nf
foo |
bar$ /* action goes here */
.fi
-Ʊ¤¸ÊýË¡¤Ç¡¢foo ¤â¤·¤¯¤Ï ¹ÔƬ¤Î bar ¤ò»ØÄê²Äǽ¤Ç¤¹¡£
-.SH ÆþÎϤΥޥåÁÊýË¡
-À¸À®¤·¤¿¥¹¥¥ã¥Ê¤ò¼Â¹Ô¤¹¤ë¤È¡¢
-¥¹¥¥ã¥Ê¤ÏÆþÎϤò¸«¤Æ¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ëʸ»úÎó¤òõ¤·¤Þ¤¹¡£
-1 ¤è¤ê¿¤¯¤Î¥Þ¥Ã¥Á¤ò¸«ÉÕ¤±¤ë¤È¡¢ºÇĹ¥Æ¥¥¹¥È¤Î¥Þ¥Ã¥Á¤òºÎÍѤ·¤Þ¤¹
-(±¦Ê¸Ì®(trailing context rule)¤Î¸å¤í¤ÎÉôʬ¤âŤµ¤Ë´Þ¤ß¤Þ¤¹¤¬¡¢
-¸å¤í¤ÎÉôʬ¤ÏÆþÎϤËÌᤵ¤ì¤Þ¤¹)¡£
-Ʊ¤¸Ä¹¤µ¤Î¥Þ¥Ã¥Á¤ò 2 ¤Ä°Ê¾å¸«ÉÕ¤±¤¿¾ì¹ç¡¢
+同じ方法で、foo もしくは 行頭の bar を指定可能です。
+.SH 入力のマッチ方法
+生成したスキャナを実行すると、
+スキャナは入力を見てパターンにマッチする文字列を探します。
+1 より多くのマッチを見付けると、最長テキストのマッチを採用します
+(右文脈(trailing context rule)の後ろの部分も長さに含みますが、
+後ろの部分は入力に戻されます)。
+同じ長さのマッチを 2 つ以上見付けた場合、
.I flex
-ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÇºÇ½é¤Ëµ½Ò¤µ¤ì¤¿¥ë¡¼¥ë¤òºÎÍѤ·¤Þ¤¹¡£
+入力ファイルで最初に記述されたルールを採用します。
.PP
-¥Þ¥Ã¥Á¤¬·èÄꤹ¤ë¤È¡¢¥Þ¥Ã¥Á¤ËÂбþ¤¹¤ë¥Æ¥¥¹¥È(
-.I ¥È¡¼¥¯¥ó
-¤È¸Æ¤Ð¤ì¤Þ¤¹)¤¬¥°¥í¡¼¥Ð¥ëʸ»ú¥Ý¥¤¥ó¥¿
+マッチが決定すると、マッチに対応するテキスト(
+.I トークン
+ã\81¨å\91¼ã\81°ã\82\8cã\81¾ã\81\99)ã\81\8cã\82°ã\83ã\83¼ã\83\90ã\83«æ\96\87å\97ã\83\9dã\82¤ã\83³ã\82¿
.B yytext
-¤Ë¤è¤ê»ÈÍѲÄǽ¤È¤Ê¤ê¡¢Ä¹¤µ¤¬¥°¥í¡¼¥Ð¥ëÀ°¿ô
+により使用可能となり、長さがグローバル整数
.B yyleng
-¤Ë¤è¤ê»ÈÍѲÄǽ¤È¤Ê¤ê¤Þ¤¹¡£
-¤½¤Î¸å¡¢¥Þ¥Ã¥Á¤·¤¿¥Ñ¥¿¡¼¥ó¤ËÂбþ¤¹¤ë
-.I ¥¢¥¯¥·¥ç¥ó
-¤¬¼Â¹Ô¤µ¤ì(¥¢¥¯¥·¥ç¥ó¤Î¾ÜºÙ¤Êµ½Ò¤Ï¸å¤Ç¹Ô¤¤¤Þ¤¹)¡¢
-»Ä¤ê¤ÎÆþÎϤ¬»Ä¤ê¤Î¥Þ¥Ã¥Á¤Î¤¿¤á¤Ë¥¹¥¥ã¥ó¤µ¤ì¤Þ¤¹¡£
+により使用可能となります。
+その後、マッチしたパターンに対応する
+.I アクション
+が実行され(アクションの詳細な記述は後で行います)、
+残りの入力が残りのマッチのためにスキャンされます。
.PP
-¥Þ¥Ã¥Á¤¬¸«ÉÕ¤«¤é¤Ê¤¤¤È¡¢
-.I ¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë
-¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹: ÆþÎϤμ¡¤Îʸ»ú¤¬¥Þ¥Ã¥Á¤·¤¿¤È¸«Ê蘆¤ì¡¢
-ɸ½à½ÐÎϤ˥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ºÇ¤â´Êñ¤ÇÀµÅö¤Ê
+マッチが見付からないと、
+.I デフォルトルール
+が実行されます: 入力の次の文字がマッチしたと見倣され、
+標準出力にコピーされます。最も簡単で正当な
.I flex
-¤ÎÆþÎϤϰʲ¼¤ÎÄ̤ê¤Ç¤¹:
+の入力は以下の通りです:
.nf
%%
.fi
-¤³¤ì¤Ï¡¢ÆþÎϤòñ½ã¤Ë½ÐÎϤ˥³¥Ô¡¼(1 ÅÙ¤Ë 1 ʸ»ú¤º¤Ä)¤¹¤ë¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£
+これは、入力を単純に出力にコピー(1 度に 1 文字ずつ)するスキャナを生成します。
.PP
.B yytext
-¤Ï 2 ¤Ä¤Î°Û¤Ê¤Ã¤¿ÊýË¡¤Ë¤è¤êÄêµÁ¤µ¤ì¤¦¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤: ʸ»ú
-.I ¥Ý¥¤¥ó¥¿
-¤â¤·¤¯¤Ïʸ»ú
-.I ÇÛÎó
-¤Ç¤¹¡£
+は 2 つの異なった方法により定義されうることに注意して下さい: 文字
+.I ã\83\9dã\82¤ã\83³ã\82¿
+もしくは文字
+.I 配列
+です。
.I flex
-¤¬¤É¤Á¤é¤ÎÄêµÁ¤ò»ÈÍѤ¹¤ë¤«¤ÏÆÃÊ̤ʥǥ£¥ì¥¯¥Æ¥£¥Ö
+がどちらの定義を使用するかは特別なディレクティブ
.B %pointer
-¤â¤·¤¯¤Ï
+もしくは
.B %array
-¤ò flex ¤ÎÆþÎϤκǽé¤Î(ÄêµÁ)Éôʬ¤Ë´Þ¤á¤ë¤³¤È¤Ë¤è¤êÀ©¸æ¤Ç¤¤Þ¤¹¡£
-¥Ç¥Õ¥©¥ë¥È¤Ï
+を flex の入力の最初の(定義)部分に含めることにより制御できます。
+デフォルトは
.B %pointer
-¤Ç¤¢¤ê¡¢
+であり、
.B -l
-lex ¸ß´¹¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¤Ë¤ÏÎ㳰Ū¤Ë
+lex 互換オプションを使用した場合には例外的に
.B yytext
-¤ÏÇÛÎó¤Ë¤Ê¤ê¤Þ¤¹¡£
+は配列になります。
.B %pointer
-¤ò»ÈÍѤ¹¤ëÍøÅÀ¤Ï¥¹¥¥ã¥ó¤¬¹â®¤Ç¤¢¤ë¤³¤È¡¢
-Èó¾ï¤ËÂ礤ʥȡ¼¥¯¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë»þ¤Ë¤â
-(ưŪ¥á¥â¥ê¤ò»ÈÍѤ·¿Ô¤¯¤µ¤Ê¤¤¸Â¤ê)¥Ð¥Ã¥Õ¥¡¥ª¡¼¥Ð¥Õ¥í¡¼¤È¤Ê¤é¤Ê¤¤¤³¤È¤Ç¤¹¡£
-·çÅÀ¤Ï¡¢¥¢¥¯¥·¥ç¥ó¤¬
+を使用する利点はスキャンが高速であること、
+非常に大きなトークンにマッチする時にも
+(動的メモリを使用し尽くさない限り)バッファオーバフローとならないことです。
+欠点は、アクションが
.B yytext
-¤ò½¤Àµ¤¹¤ë¤³¤È¤¬À©¸Â¤µ¤ì¤ë¤³¤È(¼¡ÀỲ¾È)¡¢
+を修正することが制限されること(次節参照)、
.B unput()
-¸Æ¤Ó½Ð¤·¤¬
+呼び出しが
.B yytext
-¤Î¸½ºß¤ÎÆâÍƤòÇ˲õ¤¹¤ë¤³¤È¤Ç¤¹¡£
-¤³¤ì¤Ï°Û¤Ê¤ë
+の現在の内容を破壊することです。
+これは異なる
.I lex
-¥Ð¡¼¥¸¥ç¥ó´Ö¤Ç¤Î°Ü¿¢À¤Ë´Ø¤¹¤ëƬÄˤμï¤Ç¤¹¡£
+バージョン間での移植性に関する頭痛の種です。
.PP
.B %array
-¤ÎÍøÅÀ¤Ï
+の利点は
.B yytext
-¤ÎÆâÍƤò»×¤Ã¤¿Ä̤ê¤ËÊѹ¹¤Ç¤¤ë¤³¤È¡¢
+の内容を思った通りに変更できること、
.B unput()
-¤ò¸Æ¤Ó½Ð¤·¤Æ¤â
+を呼び出しても
.B yytext
-¤ÎÆâÍƤ¬Ç˲õ¤µ¤ì¤Ê¤¤¤³¤È¤Ç¤¹(²¼µ»²¾È)¡£
-¤½¤Î¾å¡¢´û¸¤Î
+の内容が破壊されないことです(下記参照)。
+その上、既存の
.I lex
-¥×¥í¥°¥é¥à¤Ï
+プログラムは
.B yytext
-¤ò³°Éô¤«¤é¼¡¤Î·Á¼°¤ÎÀë¸À¤ò»ÈÍѤ·¤Æ¥¢¥¯¥»¥¹¤·¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹:
+を外部から次の形式の宣言を使用してアクセスしていることがあります:
.nf
extern char yytext[];
.fi
-¤³¤ÎÄêµÁ¤Ï
+この定義は
.B %pointer
-»ÈÍÑ»þ¤Ë¤Ï¸í¤ê¤Ç¤¹¤¬¡¢
+使用時には誤りですが、
.B %array
-»ÈÍÑ»þ¤Ë¤ÏÀµ¤·¤¤¤Ç¤¹¡£
+使用時には正しいです。
.PP
.B %array
-¤Ï
+は
.B yytext
-¤òʸ»ú¿ô
+を文字数
.B YYLMAX
-(¥Ç¥Õ¥©¥ë¥È¤Ï½½Ê¬Â礤ÊÃÍ)¤ÎÇÛÎó¤Ç¤¢¤ë¤ÈÄêµÁ¤·¤Þ¤¹¡£
-¤³¤ÎÂ礤µ¤Ï¡¢
+(デフォルトは十分大きな値)の配列であると定義します。
+この大きさは、
.I flex
-¤ÎÆþÎϤκǽé¤ÎÉôʬ¤Çñ½ã¤Ë
+の入力の最初の部分で単純に
.B YYLMAX
-¤ò°Û¤Ê¤Ã¤¿ÃÍ¤Ë #define ¤¹¤ë¤³¤È¤Ë¤è¤êÊѹ¹¤Ç¤¤Þ¤¹¡£
-¾åµ¤ÎÄ̤ꡢ
+を異なった値に #define することにより変更できます。
+上記の通り、
.B %pointer
-»ÈÍÑ»þ¤Ë¤Ï yytext ¤ÏÂ礤ʥȡ¼¥¯¥ó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËưŪ¤ËÂ礤¯¤Ê¤ê¤Þ¤¹¡£
-¤³¤Î¤³¤È¤Ï
+使用時には yytext は大きなトークンを格納するために動的に大きくなります。
+このことは
.B %pointer
-¤ò»ÈÍѤ·¤¿¥¹¥¥ã¥Ê¤ÏÈó¾ï¤ËÂ礤ʥȡ¼¥¯¥ó
-(Î㤨¤Ð¥³¥á¥ó¥È¥Ö¥í¥Ã¥¯Á´ÂÎ)¤ò³ÊǼ²Äǽ¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¤¬¡¢
-¥¹¥¥ã¥Ê¤¬
+を使用したスキャナは非常に大きなトークン
+(例えばコメントブロック全体)を格納可能であることを意味しますが、
+スキャナが
.B yytext
-¤ÎÂ礤µ¤òÊѤ¨¤ë¤¿¤Ó¤Ë¥È¡¼¥¯¥óÁ´ÂΤòÀèƬ¤«¤éºÆ¥¹¥¥ã¥ó¤¹¤ë¤³¤È¤¬É¬ÍפȤʤ뤿¤á
-¤³¤Î¤è¤¦¤Ê¥È¡¼¥¯¥ó¤ËÂФ¹¤ë¥Þ¥Ã¥Á¥ó¥°¤ÏÃÙ¤¯¤Ê¤ê¤¦¤ë¤³¤È¤ò³Ð¤¨¤Æ¤ª¤¤¤Æ²¼¤µ¤¤¡£
-¸½ºß¡¢
+の大きさを変えるたびにトークン全体を先頭から再スキャンすることが必要となるため
+このようなトークンに対するマッチングは遅くなりうることを覚えておいて下さい。
+現在、
.B yytext
-¤Ï
+は
.B unput()
-¤¬·ë²Ì¤È¤·¤ÆÊÖ¤¹¥Æ¥¥¹¥È¤¬Â礤¤»þ¤Ë¤ÏưŪ¤Ë¤ÏÂ礤¯¤Ê¤ê
-.I ¤Þ¤»¤ó;
-¼Â¹Ô»þ¥¨¥é¡¼¤È¤Ê¤ê¤Þ¤¹¡£
+が結果として返すテキストが大きい時には動的には大きくなり
+.I ません;
+実行時エラーとなります。
.PP
-¤Þ¤¿¡¢
+また、
.B %array
-¤Ï
-C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤Ç¤Ï»ÈÍѤǤ¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤(
+は
+C++ スキャナクラスでは使用できないことに注意して下さい(
.B c++
-¥ª¥×¥·¥ç¥ó¤Ë´Ø¤·¤Æ¤Ï²¼µ»²¾È)¡£
-.SH ¥¢¥¯¥·¥ç¥ó
-¥ë¡¼¥ëÃæ¤Î¥Ñ¥¿¡¼¥ó¤ÏÂбþ¤¹¤ë¥¢¥¯¥·¥ç¥ó¤ò»ý¤Á¤Þ¤¹¡£
-¥¢¥¯¥·¥ç¥ó¤ÏǤ°Õ¤Î C ¤Îʸ¤Ç¤¹¡£
-¥Ñ¥¿¡¼¥ó¤ÏºÇ½é¤Î¥¨¥¹¥±¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤¤¶õÇòʸ»ú¤Ç½ª¤ê¤Þ¤¹;
-¹Ô¤Î»Ä¤ê¤¬¥¢¥¯¥·¥ç¥ó¤Ç¤¹¡£
-¥¢¥¯¥·¥ç¥ó¤¬¶õ¤Ç¤¢¤ë¾ì¹ç¡¢
-¥Ñ¥¿¡¼¥ó¤¬¥Þ¥Ã¥Á¤·¤¿»þ¤ËÆþÎϥȡ¼¥¯¥ó¤Ïñ½ã¤Ë¼Î¤Æ¤é¤ì¤Þ¤¹¡£
-Î㤨¤ÐÆþÎϤ«¤éÁ´¤Æ¤Î "zap me" ¤òºï½ü¤¹¤ë¥×¥í¥°¥é¥à¤Î»ÅÍͤò¼¨¤·¤Þ¤¹:
+オプションに関しては下記参照)。
+.SH アクション
+ルール中のパターンは対応するアクションを持ちます。
+アクションは任意の C の文です。
+パターンは最初のエスケープされていない空白文字で終ります;
+行の残りがアクションです。
+アクションが空である場合、
+パターンがマッチした時に入力トークンは単純に捨てられます。
+例えば入力から全ての "zap me" を削除するプログラムの仕様を示します:
.nf
%%
"zap me"
.fi
-(ÆþÎϤξ¤ÎÁ´¤Æ¤Îʸ»ú¤ò½ÐÎϤ˥³¥Ô¡¼¤·¤Þ¤¹¡£
-¤Ê¤¼¤Ê¤é¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤¹¤ë¤«¤é¤Ç¤¹¡£)
+(入力の他の全ての文字を出力にコピーします。
+なぜならデフォルトルールにマッチするからです。)
.PP
-¼¡¤Ï¡¢Ê£¿ô¤Î¶õÇò¤äʸ»ú¤òñ°ì¤Î¶õÇò¤Ë°µ½Ì¤·¹ÔËö¤Î¶õÇò¤ò¼Î¤Æ¤ë¥×¥í¥°¥é¥à¤Ç¤¹:
+次は、複数の空白や文字を単一の空白に圧縮し行末の空白を捨てるプログラムです:
.nf
%%
.fi
.PP
-¥¢¥¯¥·¥ç¥ó¤¬ '{' ¤ò´Þ¤à¾ì¹ç¡¢¥¢¥¯¥·¥ç¥ó¤ÏÂбþ¤¹¤ë '}' ¤Þ¤Ç³¤¡¢
-Ê£¿ô¹Ô¤ËÅϤë¾ì¹ç¤â¤¢¤ê¤Þ¤¹¡£
+アクションが '{' を含む場合、アクションは対応する '}' まで続き、
+複数行に渡る場合もあります。
.I flex
-¤Ï C ¤Îʸ»úÎ󤪤è¤Ó¥³¥á¥ó¥È¤Ë´Ø¤·¤ÆÃΤäƤª¤ê¡¢
-¤½¤ì¤é¤ÎÃæ¤Î¥Ö¥ì¡¼¥¹¤ò¸í²ò¤¹¤ë¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢
-¥¢¥¯¥·¥ç¥ó¤¬
+は C の文字列およびコメントに関して知っており、
+それらの中のブレースを誤解することはありませんが、
+アクションが
.B %{
-¤Ç»Ï¤Þ¤ë¤³¤È¤òµö¤·¡¢¼¡¤Î
+で始まることを許し、次の
.B %}
-¤Þ¤Ç¤Î¥Æ¥¥¹¥È¤¬¥¢¥¯¥·¥ç¥ó¤Ç¤¢¤ë¤È¤·¤Þ¤¹
-(¥¢¥¯¥·¥ç¥óÆâÉô¤ÎǤ°Õ¸Ä¤Î¥Ö¥ì¡¼¥¹¤Ë¤Ï´Ø·¸¤¢¤ê¤Þ¤»¤ó)¡£
+までのテキストがアクションであるとします
+(アクション内部の任意個のブレースには関係ありません)。
.PP
-¿âľ¥Ð¡¼ ('|') ¤Î¤ß¤«¤é¤Ê¤ë¥¢¥¯¥·¥ç¥ó¤Ï
-"¼¡¤Î¥ë¡¼¥ë¤ÈƱ¤¸" ¤ò°ÕÌ£¤·¤Þ¤¹¡£ÀâÌÀ¤Ï°Ê²¼¤ò¸«¤Æ²¼¤µ¤¤¡£
+垂直バー ('|') のみからなるアクションは
+"次のルールと同じ" を意味します。説明は以下を見て下さい。
.PP
-¥¢¥¯¥·¥ç¥ó¤ÏǤ°Õ¤Î C ¥³¡¼¥É¤ò´Þ¤à¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
-¤³¤ì¤Ë¤Ï¡¢
+アクションは任意の C コードを含むことが出来ます。
+これには、
.B yylex()
-¤ò¸Æ¤Ó½Ð¤·¤¿¥ë¡¼¥Á¥ó¤ËÂФ·¤ÆÃͤòÊÖ¤¹
+を呼び出したルーチンに対して値を返す
.B return
-ʸ¤â´Þ¤Þ¤ì¤Þ¤¹¡£
+文も含まれます。
.B yylex()
-¤¬¸Æ¤Ð¤ì¤ë¤¿¤Ó¡¢ºÇ¸å¤Ë»Ä¤Ã¤¿¥È¡¼¥¯¥ó¤«¤é½èÍý¤òºÆ³«¤·¡¢
-¥Õ¥¡¥¤¥ë¤Î½ªÎ»¤â¤·¤¯¤Ï return ¤ò¼Â¹Ô¤¹¤ë¤Þ¤Ç½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£
+が呼ばれるたび、最後に残ったトークンから処理を再開し、
+ファイルの終了もしくは return を実行するまで処理を行います。
.PP
-¥¢¥¯¥·¥ç¥ó¤Ï¼«Í³¤Ë
+アクションは自由に
.B yytext
-¤òÊѹ¹¤Ç¤¤Þ¤¹¤¬¡¢Îã³°¤ÏŤµ¤òÁý¤ä¤¹¤³¤È¤Ç¤¹
-(ʸ»ú¤òËöÈø¤Ë²Ã¤¨¤ë¤³¤È¤Ë¤Ê¤ê¡¢
-¤³¤ì¤ÏÆþÎÏ¥¹¥È¥ê¡¼¥à¤Î¸å³¤¹¤ëʸ»ú¤ò¾å½ñ¤¤·¤Þ¤¹)¡£
-¤³¤ì¤Ï
+を変更できますが、例外は長さを増やすことです
+(文字を末尾に加えることになり、
+これは入力ストリームの後続する文字を上書きします)。
+これは
.B %array
-»ÈÍÑ»þ¤Ë¤ÏÅö¤Æ¤Ï¤Þ¤ê¤Þ¤»¤ó(¾å½Ò); ¤³¤Î¾ì¹ç
+使用時には当てはまりません(上述); この場合
.B yytext
-¤ò¼«Í³¤ËÊѹ¹¤Ç¤¤Þ¤¹¡£
+を自由に変更できます。
.PP
-¥¢¥¯¥·¥ç¥ó¤Ï¼«Í³¤Ë
+アクションは自由に
.B yyleng
-¤òÊѹ¹¤Ç¤¤Þ¤¹¤¬¡¢¥¢¥¯¥·¥ç¥ó¤¬
+を変更できますが、アクションが
.B yymore()
-¤ò»ÈÍѤ¹¤ë»þ¤Ë¤ÏÎ㳰Ū¤ËÊѹ¹¤·¤Æ¤Ï¤¤¤±¤Þ¤»¤ó(¸å½Ò)¡£
+を使用する時には例外的に変更してはいけません(後述)。
.PP
-¿¤¯¤ÎÆÃÊ̤ʥǥ£¥ì¥¯¥Æ¥£¥Ö¤¬¤¢¤ê¡¢¥¢¥¯¥·¥ç¥óÃæ¤Ë´Þ¤á¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹:
+多くの特別なディレクティブがあり、アクション中に含めることが出来ます:
.IP -
.B ECHO
-yytext ¤ò¥¹¥¥ã¥Ê¤Î½ÐÎϤ˥³¥Ô¡¼¤·¤Þ¤¹¡£
+yytext をスキャナの出力にコピーします。
.IP -
.B BEGIN
-¸å¤í¤Ë³«»Ï¾ò·ï¤Î̾Á°¤ò½ñ¤¯¤È¡¢¥¹¥¥ã¥Ê¤òÂбþ¤¹¤ë³«»Ï¾ò·ï¤ËÀßÄꤷ¤Þ¤¹(¸å½Ò)¡£
+後ろに開始条件の名前を書くと、スキャナを対応する開始条件に設定します(後述)。
.IP -
.B REJECT
-ÆþÎÏ(¤â¤·¤¯¤ÏÆþÎϤÎƬ)¤Ë "2 ÈÖÌܤˤ褯(second best)" ¥Þ¥Ã¥Á¤¹¤ë¥ë¡¼¥ë
-¤Ë¿Ê¤à¤è¤¦¤Ë¥¹¥¥ã¥Ê¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-"ÆþÎϤΥޥåÁÊýË¡" ¤Ç¼¨¤·¤¿¤è¤¦¤Ë¥ë¡¼¥ë¤ÏÁªÂò¤µ¤ì¡¢
+入力(もしくは入力の頭)に "2 番目によく(second best)" マッチするルール
+に進むようにスキャナに指示します。
+"入力のマッチ方法" で示したようにルールは選択され、
.B yytext
-¤È
+と
.B yyleng
-¤ÏŬÀÚ¤ËÀßÄꤵ¤ì¤Þ¤¹¡£
-ÁªÂò¤µ¤ì¤ë¥ë¡¼¥ë¤Ï¡¢ºÇ½é¤ËÁªÂò¤µ¤ì¤¿¥ë¡¼¥ë¤ÈƱ¤¸Ä¹¤µ¤Ç¤¢¤ë¤¬
+は適切に設定されます。
+選択されるルールは、最初に選択されたルールと同じ長さであるが
.I flex
-¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë¤Æ¸å¤Ç½Ð¤ÆÍè¤ë¤â¤Î¡¢¤â¤·¤¯¤Ï¾¯¤Ê¤¤Ê¸»ú¿ô¤Ë¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤Ç¤¹¡£
-Î㤨¤Ð¼¡¤ÎÎã¤Ç¤ÏÆþÎÏÃæ¤Î¸ì¤ò¿ô¤¨¡¢
-"frob" ¤¬¸«ÉÕ¤«¤ë¤¿¤Ó¤Ë¥ë¡¼¥Á¥ó special() ¤ò¸Æ¤Ó¤Þ¤¹:
+の入力ファイルにて後で出て来るもの、もしくは少ない文字数にマッチするものです。
+例えば次の例では入力中の語を数え、
+"frob" が見付かるたびにルーチン special() を呼びます:
.nf
int word_count = 0;
.fi
.B REJECT
-¤¬Ìµ¤¤¾ì¹ç¡¢
-ÆþÎÏÃæ¤Î "frob" ¤Ï¸ì¤È¤·¤Æ¿ô¤¨¤é¤ì¤º¡¢
-¥¹¥¥ã¥Ê¤ÏÄ̾ïÄ̤ê¥È¡¼¥¯¥óËè¤Ë 1 ¤Ä¤Î¥¢¥¯¥·¥ç¥ó¤À¤±¤ò¹Ô¤¤¤Þ¤¹¡£
-Ê£¿ô¤Î
+が無い場合、
+入力中の "frob" は語として数えられず、
+スキャナは通常通りトークン毎に 1 つのアクションだけを行います。
+複数の
.B REJECT
-¤ò»ÈÍѲÄǽ¤Ç¤¢¤ê¡¢¤½¤ì¤¾¤ì¸½ºß͸ú¤Ê¥ë¡¼¥ë¤Î¼¡¤ËÎɤ¤ÁªÂò¤ò¸«ÉÕ¤±¤Þ¤¹¡£
-Î㤨¤Ð¼¡¤Î¥¹¥¥ã¥Ê¤Ï¡¢"abcd" ¤È¤¤¤¦¥È¡¼¥¯¥ó¤ò¥¹¥¥ã¥ó¤·¡¢
-½ÐÎÏ¤Ë "abcdabcaba" ¤ò½ñ¤¤Þ¤¹:
+を使用可能であり、それぞれ現在有効なルールの次に良い選択を見付けます。
+例えば次のスキャナは、"abcd" というトークンをスキャンし、
+出力に "abcdabcaba" を書きます:
.nf
%%
.|\\n /* eat up any unmatched character */
.fi
-(Á°¤Î 3 ¤Ä¤Î¥ë¡¼¥ë¤Ï 4 ÈÖÌܤΥ롼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤ò¶¦Í¤·¤Þ¤¹¡£
-¤Ê¤¼¤Ê¤éÆÃÊÌ¤Ê '|' ¥¢¥¯¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£)
+(前の 3 つのルールは 4 番目のルールのアクションを共有します。
+なぜなら特別な '|' アクションが使用されているからです。)
.B REJECT
-¤Ï¥¹¥¥ã¥Ê¤ÎÀǽ¤È¤¤¤¦ÅÀ¤ÇÆä˥³¥¹¥È¤Î¤«¤«¤ëµ¡Ç½¤Ç¤¹;
-¤â¤·¥¹¥¥ã¥Ê¤Î¥¢¥¯¥·¥ç¥ó¤Î
-.I ¤¤¤º¤ì¤«
-¤Ë¤Ç¤â REJECT ¤¬»È¤ï¤ì¤¿¤Ê¤é¡¢¥¹¥¥ã¥Ê¤Î
-.I Á´¤Æ¤Î
-¥Þ¥Ã¥Á¥ó¥°Â®ÅÙ¤òÄã²¼¤µ¤»¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
-¤µ¤é¤Ë
+はスキャナの性能という点で特にコストのかかる機能です;
+もしスキャナのアクションの
+.I いずれか
+にでも REJECT が使われたなら、スキャナの
+.I 全ての
+マッチング速度を低下させるということです。
+さらに
.B REJECT
-¤ò¥ª¥×¥·¥ç¥ó
+をオプション
.I -Cf
-¤ä
+や
.I -CF
-¤È¶¦¤ËÍѤ¤¤ë¤³¤È¤Ï½ÐÍè¤Þ¤»¤ó¡£
+と共に用いることは出来ません。
.IP
-¤Þ¤¿¡¢Â¾¤ÎÆÃÊÌ¥¢¥¯¥·¥ç¥ó¤È°ã¤¤
+また、他の特別アクションと違い
.B REJECT
-¤Ï
-.I ʬ´ô(branch)
-¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤; ¤¹¤Ê¤ï¤Á REJECT ľ¸å¤Î¥¢¥¯¥·¥ç¥ó¤Ï
-¼Â¹Ô
-.I ¤µ¤ì¤Þ¤»¤ó¡£
+は
+.I 分岐(branch)
+であることに注意してください; すなわち REJECT 直後のアクションは
+実行
+.I されません。
.IP -
.B yymore()
-¼¡¤Ë¥ë¡¼¥ë¤È¥Þ¥Ã¥Á¤·¤¿¤È¤¤Ë¤Ï¡¢Âбþ¤¹¤ë¥È¡¼¥¯¥ó¤Ï¡¢
-¸½ºß¤Î
+次にルールとマッチしたときには、対応するトークンは、
+現在の
.B yytext
-¤ÎÆâÍƤÈÆþ¤ì´¹¤¨¤ë¤Î¤Ç¤Ï¤Ê¤¯
+の内容と入れ換えるのではなく
.B yytext
-¤Ë
-.I ÄɲÃ
-¤¹¤ë¤è¤¦¥¹¥¥ã¥Ê¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-Î㤨¤Ð¡¢ÆþÎÏ "mega-kludge" ¤¬Í¿¤¨¤é¤ì¤ë¤È¡¢°Ê²¼¤Ï
-"mega-mega-kludge" ¤ò½ÐÎϤ˽ñ¤¤Þ¤¹:
+に
+.I 追加
+するようスキャナに指示します。
+例えば、入力 "mega-kludge" が与えられると、以下は
+"mega-mega-kludge" を出力に書きます:
.nf
%%
kludge ECHO;
.fi
-ºÇ½é¤Î "mega-" ¤Ï¥Þ¥Ã¥Á¤·½ÐÎϤ˥¨¥³¡¼¤µ¤ì¤Þ¤¹¡£
-¼¡¤Ë "kludge" ¤¬¥Þ¥Ã¥Á¤·¤Þ¤¹¤¬¡¢Ä¾Á°¤Î "mega-" ¤¬¤Þ¤À
+最初の "mega-" はマッチし出力にエコーされます。
+次に "kludge" がマッチしますが、直前の "mega-" がまだ
.B yytext
-¤ÎÀèƬ¤Ë»Ä¤Ã¤Æ¤ª¤ê¡¢"kludge" ¤Î
+の先頭に残っており、"kludge" の
.B ECHO
-¥ë¡¼¥ë¤Ï¼ÂºÝ¤Ë¤Ï "mage-kludge" ¤ò½ñ¤¤Þ¤¹¡£
+ルールは実際には "mage-kludge" を書きます。
.PP
.B yymore()
-¤Î»ÈÍѤ˴ؤ· 2 ¤Ä¤ÎÃí°ÕÅÀ¤¬¤¢¤ê¤Þ¤¹¡£
-¤Þ¤º¡¢
+の使用に関し 2 つの注意点があります。
+まず、
.B yymore()
-¤Ï¸½ºß¤Î¥È¡¼¥¯¥ó¤ÎÂ礤µ¤òÈ¿±Ç¤¹¤ë
+は現在のトークンの大きさを反映する
.I yyleng
-¤ÎÃͤÎÀµ³Î¤µ¤Ë°Í¸¤¹¤ë¤³¤È¤Ç¤¢¤ê¡¢
+の値の正確さに依存することであり、
.B yymore()
-»ÈÍÑ»þ¤Ë¤Ï
+使用時には
.I yyleng
-¤òÊѹ¹¤·¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£
-¼¡¤Ë¡¢
-¥¹¥¥ã¥Ê¤Î¥¢¥¯¥·¥ç¥ó¤Ë
+を変更してはなりません。
+次に、
+スキャナのアクションに
.B yymore()
-¤¬¤¢¤ë¤È¡¢¥¹¥¥ã¥Ê¤Î¥Þ¥Ã¥Á®Å٤˼㴳°±Æ¶Á¤¬¤¢¤ê¤Þ¤¹¡£
+があると、スキャナのマッチ速度に若干悪影響があります。
.IP -
.B yyless(n)
-¸½ºß¤Î¥È¡¼¥¯¥ó¤«¤éºÇ½é¤Î
+現在のトークンから最初の
.I n
-ʸ»ú¤ò½ü¤¤¤¿¤â¤Î¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤ËÌᤷ¤Þ¤¹¡£
-Ìᤷ¤¿Ê¸»úÎó¤Ï¥¹¥¥ã¥Ê¤¬¼¡¤Î¥Þ¥Ã¥Á¥ó¥°¤ò¤È¤ë¤È¤¤ËºÆÅÙ¥¹¥¥ã¥ó¤µ¤ì¤Þ¤¹¡£
+文字を除いたものを入力ストリームに戻します。
+戻した文字列はスキャナが次のマッチングをとるときに再度スキャンされます。
.B yytext
-¤È
+と
.B yyleng
-¤ÏŬÀÚ¤ËÄ´À°¤µ¤ì¤Þ¤¹(Î㤨¤Ð
+は適切に調整されます(例えば
.B yyleng
-¤Ï
+は
.I n
-¤È¤Ê¤ê¤Þ¤¹)¡£
-Î㤨¤Ð¡¢ÆþÎÏ "foobar" ¤¬Í¿¤¨¤é¤ì¤ë¤È¡¢°Ê²¼¤Ï
-"foobarbar" ¤ò½ñ¤¤Þ¤¹:
+となります)。
+例えば、入力 "foobar" が与えられると、以下は
+"foobarbar" を書きます:
.nf
%%
[a-z]+ ECHO;
.fi
-°ú¿ô 0 ¤ò
+引数 0 を
.B yyless
-¤ËÍ¿¤¨¤ë¤È¡¢¸½ºß¤ÎÆþÎÏʸ»úÎóÁ´ÂΤ¬ºÆÅÙ¥¹¥¥ã¥ó¤µ¤ì¤Þ¤¹¡£
-(Î㤨¤Ð
+に与えると、現在の入力文字列全体が再度スキャンされます。
+(例えば
.B BEGIN
-¤ò»ÈÍѤ·¤Æ)¼¡¤Ë¥¹¥¥ã¥Ê¤¬ÆþÎϤ¹¤ëÊýË¡¤òÊѹ¹¤·¤Æ¤¤¤Ê¤¤¤È¡¢Ìµ¸Â¥ë¡¼¥×¤È¤Ê¤ê¤Þ¤¹¡£
+を使用して)次にスキャナが入力する方法を変更していないと、無限ループとなります。
.PP
.B yyless
-¤Ï¥Þ¥¯¥í¤Ç¤¢¤ê¡¢flex ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¢¤ê¡¢
-Ê̤Υ½¡¼¥¹¥Õ¥¡¥¤¥ë¤«¤é¤Ï»ÈÍÑÉÔǽ¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
+はマクロであり、flex 入力ファイルでのみ使用可能であり、
+別のソースファイルからは使用不能であることに注意して下さい。
.IP -
.B unput(c)
-ʸ»ú
+文字
.I c
-¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤ØÌᤷ¤Þ¤¹¡£Ìᤷ¤¿Ê¸»ú¤Ï¼¡¤Ë¥¹¥¥ã¥ó¤µ¤ì¤ëʸ»ú¤Ë¤Ê¤ê¤Þ¤¹¡£
-¼¡¤Î¥¢¥¯¥·¥ç¥ó¤Ï¸½ºß¤Î¥È¡¼¥¯¥ó¤ò¼è¤ê¾å¤²¡¢
-³ç¸ÌÆâ¤ËÆþ¤ì¤ÆºÆ¥¹¥¥ã¥ó¤·¤Þ¤¹¡£
+を入力ストリームへ戻します。戻した文字は次にスキャンされる文字になります。
+次のアクションは現在のトークンを取り上げ、
+括弧内に入れて再スキャンします。
.nf
{
.fi
.B unput()
-¤Ïʸ»ú¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤Î
-.I ÀèƬ
-¤ËÌ᤹¤Î¤Ç¡¢Ê¸»úÎó¤òÌ᤹¾ì¹ç¤Ë¤Ï¸å¤í¤«¤éÁ°¤Ë¸þ¤«¤Ã¤ÆÌ᤹ɬÍפ¬¤¢¤ê¤Þ¤¹¡£
+は文字を入力ストリームの
+.I 先頭
+に戻すので、文字列を戻す場合には後ろから前に向かって戻す必要があります。
.PP
.B unput()
-»ÈÍÑ»þ¤Î½ÅÍפÊÀøºßŪ¤ÊÌäÂê¤Ï¡¢
+使用時の重要な潜在的な問題は、
.B %pointer
-»ÈÍÑ»þ(¥Ç¥Õ¥©¥ë¥È)¤Ë
+使用時(デフォルト)に
.B unput()
-¤ò¸Æ¤Ó½Ð¤¹¤È¡¢
-±¦Ã¼¤Îʸ»ú¤«¤é³«»Ï¤· 1 ʸ»ú¤º¤Äº¸¤Ë¸þ¤«¤Ã¤Æ¾ÃÈñ¤µ¤ì¡¢
+を呼び出すと、
+右端の文字から開始し 1 文字ずつ左に向かって消費され、
.I yytext
-¤ÎÆâÍƤ¬
-.I Ç˲õ
-¤µ¤ì¤ë¤³¤È¤Ç¤¹¡£
-(¾åµÎã¤Î¤è¤¦¤Ë)
+の内容が
+.I 破壊
+されることです。
+(上記例のように)
.B unput()
-¸Æ¤Ó½Ð¤·¸å¤â
+呼び出し後も
.I yytext
-¤ÎÆâÍƤòÊݸ¤¹¤ë¤¿¤á¤Ë¤Ï¡¢»Ï¤á¤ËÊ̤ξì½ê¤Ë¥³¥Ô¡¼¤¹¤ë¤«¡¢
-¥¹¥¥ã¥Ê¤ò
+の内容を保存するためには、始めに別の場所にコピーするか、
+スキャナを
.B %array
-¤ò»È¤¦¤è¤¦¤Ë¹½ÃÛ¤¹¤ë¤³¤È¤Ç¤¹(ÆþÎϤΥޥåÁÊýË¡»²¾È)¡£
+を使うように構築することです(入力のマッチ方法参照)。
.PP
-ºÇ¸å¤Ë¡¢
+最後に、
.B EOF
-¤òÌᤷ¤ÆÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ë¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤ò¥Þ¡¼¥¯¤¹¤ë¤È¤Ï
-½ÐÍè¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
+を戻して入力ストリームにファイルの終りをマークするとは
+出来ないことに注意して下さい。
.IP -
.B input()
-¼¡¤Îʸ»ú¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤«¤éÆɤߤޤ¹¡£
-¼¡¤ÎÎã¤Ï C ¥³¥á¥ó¥È¤ò¿©¤Ù¤Þ¤¹:
+次の文字を入力ストリームから読みます。
+次の例は C コメントを食べます:
.nf
%%
}
.fi
-(¥¹¥¥ã¥Ê¤¬
+(スキャナが
.B C++
-¤Ç¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤È¤¤Ï¡¢¤³¤Î¥ë¡¼¥Á¥ó¤Ï
+でコンパイルされたときは、このルーチンは
.B yyinput()
-¤È¤¤¤¦Ì¾¾Î¤Ë¤Ê¤ê¡¢
+という名称になり、
.B C++
-¥¹¥È¥ê¡¼¥à¤Î
+ストリームの
.I input
-¤È̾Á°¤¬¾×Æͤ¹¤ë¤³¤È¤òÈò¤±¤Þ¤¹¡£)
+と名前が衝突することを避けます。)
.IP -
.B YY_FLUSH_BUFFER
-¥¹¥¥ã¥Ê¤ÎÆâÉô¥Ð¥Ã¥Õ¥¡¤ò¥Õ¥é¥Ã¥·¥å¤·¡¢
-¼¡¤Ë¥¹¥¥ã¥Ê¤¬¥È¡¼¥¯¥ó¤ò¥Þ¥Ã¥Á¤·¤è¤¦¤È¤·¤¿»þ
-¥Ð¥Ã¥Õ¥¡¤ò
+スキャナの内部バッファをフラッシュし、
+次にスキャナがトークンをマッチしようとした時
+バッファを
.B YY_INPUT
-¤Ë¤Æ¥ê¥Õ¥£¥ë¤·¤Þ¤¹(À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ç¸å½Ò)¡£
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢
-Ê£¿ô¤ÎÆþÎϥХåե¡¤Ë¤ª¤¤¤Æ¸å½Ò¤¹¤ë
-¤è¤ê°ìÈÌŪ¤Ê
+にてリフィルします(生成されたスキャナで後述)。
+このアクションは、
+複数の入力バッファにおいて後述する
+より一般的な
.B yy_flush_buffer()
-´Ø¿ô¤ÎÆÃÊ̤ʥ±¡¼¥¹¤Ç¤¹¡£
+関数の特別なケースです。
.IP -
.B yyterminate()
-¥¢¥¯¥·¥ç¥ó¤Î return ʸ¤ÎÂå¤ï¤ê¤Ë»È¤¦¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
+アクションの return 文の代わりに使うことが出来ます。
.B yyterminate()
-¤Ï¥¹¥¥ã¥Ê¤ò½ªÎ»¤·¡¢"Á´¤Æ½ªÎ»" ¤ò°ÕÌ£¤¹¤ë 0 ¤ò¸Æ¤Ó½Ð¤·¸µ´Ø¿ô¤ËÊÖ¤·¤Þ¤¹¡£
-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï
+はスキャナを終了し、"全て終了" を意味する 0 を呼び出し元関数に返します。
+デフォルトでは
.B yyterminate()
-¤Ï¥Õ¥¡¥¤¥ë¤Î½ª¤ï¤ê¤Ë㤷¤¿¤È¤¤Ë¤â¸Æ¤Ð¤ì¤Þ¤¹¡£
+はファイルの終わりに達したときにも呼ばれます。
.B yyterminate()
-¤Ï¥Þ¥¯¥í¤Ç¤¢¤ê¡¢ÄêµÁ¤·¤Ê¤ª¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
-.SH À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê
+はマクロであり、定義しなおすことができます。
+.SH 生成されたスキャナ
.I flex
-¤Î½ÐÎϤÏ
+の出力は
.B lex.yy.c
-¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó
+というファイルであり、スキャンルーチン
.B yylex()
-¤È¡¢¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á¥ó¥°¤Ë»ÈÍѤ¹¤ëÊ£¿ô¤Î¥Æ¡¼¥Ö¥ë¤È¡¢
-Ê£¿ô¤ÎÉÕ°¥ë¡¼¥Á¥ó¤È¥Þ¥¯¥í¤«¤é¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢
+と、トークンのマッチングに使用する複数のテーブルと、
+複数の付属ルーチンとマクロからなります。デフォルトでは、
.B yylex()
-¤Ï¼¡¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹:
+は次のように宣言されます:
.nf
int yylex()
}
.fi
-(´Ä¶¤¬´Ø¿ô¥×¥í¥È¥¿¥¤¥×¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¾ì¹ç¡¢
-"int yylex( void )" ¤È¤Ê¤ê¤Þ¤¹¡£)
-¤³¤ÎÄêµÁ¤Ï "YY_DECL" ¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤êÊѹ¹¤Ç¤¤Þ¤¹¡£
-Î㤨¤Ð¼¡¤Î¤è¤¦¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹:
+(環境が関数プロトタイプをサポートしている場合、
+"int yylex( void )" となります。)
+この定義は "YY_DECL" マクロを定義することにより変更できます。
+例えば次のように使用することが出来ます:
.nf
#define YY_DECL float lexscan( a, b ) float a, b;
.fi
-¤³¤ì¤Ï¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó¤Î̾Á°¤ò
+これはスキャンルーチンの名前を
.I lexscan
-¤È¤·¡¢ÉâÆ°¾®¿ôÅÀ¿ô¤òÊÖ¤¹¤è¤¦¤Ë¤·¡¢2 ¤Ä¤ÎÉâÆ°¾®¿ôÅÀ¿ô¤ò°ú¿ô¤È¤·¤Þ¤¹¡£
-K&R ¤ÎÈó¥×¥í¥È¥¿¥¤¥×¤Î´Ø¿ôÀë¸À¤ò»ÈÍѤ·¤Æ¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó¤ËÂФ·¤Æ°ú¿ô¤ò
-Í¿¤¨¤ë¾ì¹ç¡¢ÄêµÁ¤ò¥»¥ß¥³¥í¥ó(;)¤Ç½ªÎ»¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
+とし、浮動小数点数を返すようにし、2 つの浮動小数点数を引数とします。
+K&R の非プロトタイプの関数宣言を使用してスキャンルーチンに対して引数を
+与える場合、定義をセミコロン(;)で終了する必要があります。
.PP
.B yylex()
-¤Ï¸Æ¤Ð¤ì¤ë¤¿¤Ó¡¢¥°¥í¡¼¥Ð¥ëÆþÎÏ¥Õ¥¡¥¤¥ë
+は呼ばれるたび、グローバル入力ファイル
.I yyin
-(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ïɸ½àÆþÎÏ)¤«¤é¥È¡¼¥¯¥ó¤ò¥¹¥¥ã¥ó¤·¤Þ¤¹¡£
-¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Ë¤Ê¤ë(¤³¤Î¾ì¹ç 0 ¤òÊÖ¤·¤Þ¤¹)¤«¡¢
-¥¢¥¯¥·¥ç¥ó¤¬
+(デフォルトでは標準入力)からトークンをスキャンします。
+ファイルの終りになる(この場合 0 を返します)か、
+アクションが
.I return
-ʸ¤ò¼Â¹Ô¤¹¤ë¤Þ¤Ç¡¢¼Â¹Ô¤ò³¤±¤Þ¤¹¡£
+文を実行するまで、実行を続けます。
.PP
-¥¹¥¥ã¥Ê¤¬¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤ËÅþ㤹¤ë¤È¡¢
+スキャナがファイルの終りに到達すると、
.I yyin
-¤¬¿·¤¿¤Ê¥Õ¥¡¥¤¥ë¤ò»Ø¤µ¤Ê¤¤¤«
-(¿·¤¿¤Ê¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¾ì¹ç¤Ï¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥¹¥¥ã¥ó¤ò³¤±¤Þ¤¹)¡¢
+が新たなファイルを指さないか
+(新たなファイルを指す場合はこのファイルのスキャンを続けます)、
.B yyrestart()
-¤¬¸Æ¤Ð¤ì¤Ê¤¤¸Â¤ê¡¢
-¸å³¤¹¤ë¸Æ¤Ó½Ð¤·¤Ï̤ÄêµÁ¤Ç¤¹¡£
+が呼ばれない限り、
+後続する呼び出しは未定義です。
.B yyrestart()
-¤Ï
+は
.B FILE *
-¥Ý¥¤¥ó¥¿(
+ã\83\9dã\82¤ã\83³ã\82¿(
.B YY_INPUT
-¤òÀßÄꤷ¤Æ
+を設定して
.I yyin
-°Ê³°¤Î¥½¡¼¥¹¤ò¥¹¥¥ã¥ó¤¹¤ë¤è¤¦¤Ë¤·¤¿¾ì¹ç¤Ë¤Ï nil ¤â²Ä¤Ç¤¹)
-¤Ç¤¢¤ë°ú¿ô¤ò 1 ¤Ä¤È¤ê¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤«¤é¤Î¥¹¥¥ã¥ó¤Î¤¿¤á¤Ë
+以外のソースをスキャンするようにした場合には nil も可です)
+である引数を 1 つとり、そのファイルからのスキャンのために
.I yyin
-¤ò½é´ü²½¤·¤Þ¤¹¡£
-ËܼÁŪ¤Ë¡¢
+を初期化します。
+本質的に、
.I yyin
-¤ò¿·¤·¤¤ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë³ä¤êÅö¤Æ¤ë¤³¤È¤È
+を新しい入力ファイルに割り当てることと
.B yyrestar()
-¤ò»ÈÍѤ¹¤ë¤³¤È¤È¤ÏƱ¤¸¤Ç¤¹;
-¸å¼Ô¤ÏÁ°¤Î¥Ð¡¼¥¸¥ç¥ó¤Î
+を使用することとは同じです;
+後者は前のバージョンの
.I flex
-¤È¤Î¸ß´¹À¤Î¤¿¤á¤Ë»ÈÍѲÄǽ¤Ç¤¢¤ê¡¢
-¤Þ¤¿¥¹¥¥ã¥ó¤ÎÅÓÃæ¤ÇÆþÎÏ¥Õ¥¡¥¤¥ë¤òÊѤ¨¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£
-°ú¿ô¤ò
+との互換性のために使用可能であり、
+またスキャンの途中で入力ファイルを変えることが可能です。
+引数を
.I yyin
-¤È¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤ê¡¢¸½ºß¤ÎÆþÎϥХåե¡¤ò¼Î¤Æ¤ë¤³¤È¤â½ÐÍè¤Þ¤¹;
-¤¿¤À¤·¡¢
+として呼び出すことにより、現在の入力バッファを捨てることも出来ます;
+ただし、
.B YY_FLUSH_BUFFER
-(¾å½Ò)¤ò»ÈÍѤ¹¤ëÊý¤¬Îɤ¤¤Ç¤¹¡£
+(上述)を使用する方が良いです。
.B yyrestart()
-¤Ï
+は
.B INITIAL
-¤Î³«»Ï¾ò·ï¤òÊѹ¹¤·
-.I ¤Ê¤¤
-¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤
-(¸å½Ò¤Î³«»Ï¾ò·ï»²¾È)¡£
+の開始条件を変更し
+.I ない
+ことに注意して下さい
+(後述の開始条件参照)。
.PP
-¤¢¤ë¥¢¥¯¥·¥ç¥óÃæ¤Ç
+あるアクション中で
.I return
-ʸ¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê
+文を実行することにより
.B yylex()
-¤¬¥¹¥¥ã¥ó¤ò»ß¤á¤¿¾ì¹ç¡¢¥¹¥¥ã¥Ê¤ÏºÆÅٸƤӽФ·²Äǽ¤Ç¤¢¤ê¡¢
-¤³¤Î¾ì¹ç¥¹¥¥ã¥ó¤Î»Ä¤ê¤ÎÉôʬ¤«¤éºÆ³«¤·¤Þ¤¹¡£
+がスキャンを止めた場合、スキャナは再度呼び出し可能であり、
+この場合スキャンの残りの部分から再開します。
.PP
-¥Ç¥Õ¥©¥ë¥È¤Ç(¸úΨ¤Î¤¿¤á)¡¢¥¹¥¥ã¥Ê¤Ïñ½ã¤Ê
+デフォルトで(効率のため)、スキャナは単純な
.I getc()
-¥³¡¼¥ë¤Ç¤Ï¤Ê¤¯¥Ö¥í¥Ã¥¯¥ê¡¼¥É¤ò¹Ô¤¤¡¢
+コールではなくブロックリードを行い、
.I yyin
-¤«¤éʸ»ú¤òÆɤߤޤ¹¡£
-ÆþÎϼèÆÀÊýË¡¤Ï
+から文字を読みます。
+入力取得方法は
.B YY_INPUT
-¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤êÀ©¸æ¤Ç¤¤Þ¤¹¡£
-YY_INPUT ¸Æ¤Ó½Ð¤·¼ê½ç¤Ï "YY_INPUT(buf,result,max_size)" ¤Ç¤¹¡£
-¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢
+マクロを定義することにより制御できます。
+YY_INPUT 呼び出し手順は "YY_INPUT(buf,result,max_size)" です。
+このアクションは、
.I buf
-ʸ»úÇÛÎóÃæ¤ËºÇÂç
+文字配列中に最大
.I max_size
-ʸ»ú¤òÍÑ°Õ¤·¡¢À°¿ôÊÑ¿ô
+文字を用意し、整数変数
.I result
-Ãæ¤ËÆɤ᤿ʸ»ú¿ô¤â¤·¤¯¤ÏÄê¿ô YY_NULL (Unix ¥·¥¹¥Æ¥à¤Ç¤Ï 0)¤òÆþ¤ì¤ÆÊÖ¤·¤Þ¤¹¡£
-¥Ç¥Õ¥©¥ë¥È¤Î YY_INPUT ¤Ï¥°¥í¡¼¥Ð¥ë¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿ "yyin" ¤«¤éÆɤߤޤ¹¡£
+中に読めた文字数もしくは定数 YY_NULL (Unix システムでは 0)を入れて返します。
+デフォルトの YY_INPUT はグローバルファイルポインタ "yyin" から読みます。
.PP
-YY_INPUT ¤Î¥µ¥ó¥×¥ëÄêµÁ¤Ç¤¹(ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÄêµÁÉô¤Ë³ÊǼ):
+YY_INPUT のサンプル定義です(入力ファイルの定義部に格納):
.nf
%{
%}
.fi
-¤³¤ÎÄêµÁ¤Ë¤è¤ê¡¢ÆþÎϽèÍý¤Ï 1 ÅÙ¤Ë 1 ʸ»ú¤º¤Ä¹Ô¤¦¤è¤¦¤ËÊѹ¹¤µ¤ì¤Þ¤¹¡£
+この定義により、入力処理は 1 度に 1 文字ずつ行うように変更されます。
.PP
-¥¹¥¥ã¥Ê¤¬ YY_INPUT ¤«¤é¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤òÄÌÃΤµ¤ì¤¿¾ì¹ç¡¢
-¥¹¥¥ã¥Ê¤Ï
+スキャナが YY_INPUT からファイルの終りを通知された場合、
+スキャナは
.B yywrap()
-´Ø¿ô¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£
+関数をチェックします。
.B yywrap()
-´Ø¿ô¤¬µ¶(¥¼¥í)¤òÊÖ¤¹¾ì¹ç¡¢´Ø¿ô¤Ï³¹ÔÃæ¤Ç¤¢¤ë¤È¤µ¤ì¡¢
+関数が偽(ゼロ)を返す場合、関数は続行中であるとされ、
.I yyin
-¤òÊ̤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦¤ËÀßÄꤷ¡¢¥¹¥¥ã¥ó¤ò³¹Ô¤·¤Þ¤¹¡£
-´Ø¿ô¤¬¿¿(Èó¥¼¥í)¤òÊÖ¤¹¾ì¹ç¡¢¥¹¥¥ã¥Ê¤Ï½ªÎ»¤·¡¢¸Æ¤Ó½Ð¤·¸µ¤Ë 0 ¤òÊÖ¤·¤Þ¤¹¡£
-¤É¤Á¤é¤Î¾ì¹ç¤â³«»Ï¾ò·ï¤ÏÊѲ½¤·¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤;
-¤Ä¤Þ¤ê
+を別の入力ファイルを指すように設定し、スキャンを続行します。
+関数が真(非ゼロ)を返す場合、スキャナは終了し、呼び出し元に 0 を返します。
+どちらの場合も開始条件は変化しないことに注意して下さい;
+つまり
.B INITIAL
-¤Ë¤ÏÌá¤ê
-.I ¤Þ¤»¤ó¡£
+には戻り
+.I ません。
.PP
-Æȼ«¤Î
+独自の
.B yywrap()
-¤òÀßÄꤷ¤Ê¤¤¾ì¹ç¡¢
+を設定しない場合、
.B %option noyywrap
-(¤³¤Î¾ì¹ç¥¹¥¥ã¥Ê¤Ï
+(この場合スキャナは
.B yywrap()
-¤¬ 1 ¤òÊÖ¤·¤¿¤«¤Î¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹)¤ò»ÈÍѤ¹¤ë¤«¡¢¥Õ¥é¥°
+ã\81\8c 1 ã\82\92è¿\94ã\81\97ã\81\9fã\81\8bã\81®ã\82\88ã\81\86ã\81«å\8b\95ä½\9cã\81\97ã\81¾ã\81\99)ã\82\92使ç\94¨ã\81\99ã\82\8bã\81\8bã\80\81ã\83\95ã\83©ã\82°
.B \-ll
-¤ò»ØÄꤷ¤Æ¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥Á¥ó(¾ï¤Ë 1 ¤òÊÖ¤·¤Þ¤¹)¤ò»ÈÍѤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
+を指定してデフォルトのルーチン(常に 1 を返します)を使用しなければなりません。
.PP
-¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥á¥â¥êÃæ¤Î¥Ð¥Ã¥Õ¥¡¤«¤é¥¹¥¥ã¥ó¤¹¤ë¤¿¤á¤Î 3 ¤Ä¤Î¥ë¡¼¥Á¥ó¤ò
-»ÈÍѲÄǽ¤Ç¤¹:
+ファイルではなくメモリ中のバッファからスキャンするための 3 つのルーチンを
+使用可能です:
.B yy_scan_string(), yy_scan_bytes(), yy_scan_buffer()
-¡£
-¤³¤ì¤é¤Ë´Ø¤¹¤ëµÄÏÀ¤ÏÊ£¿ô¤ÎÆþÎϥХåե¡¤ÎÀá¤ò»²¾È¤·¤Æ²¼¤µ¤¤¡£
+。
+これらに関する議論は複数の入力バッファの節を参照して下さい。
.PP
-¥¹¥¥ã¥Ê¤Ï¡¢¼«¸Ê¤Î
+スキャナは、自己の
.B ECHO
-½ÐÎϤò
+出力を
.I yyout
-¥°¥í¡¼¥Ð¥ë(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ïɸ½à½ÐÎϤǤ¢¤ê¡¢
-Ê̤Î
+グローバル(デフォルトでは標準出力であり、
+別の
.B FILE
-¥Ý¥¤¥ó¥¿¤Ë³ä¤êÅö¤Æ¤ë¤³¤È¤ÇºÆÄêµÁ¤Ç¤¤Þ¤¹)¤Ë½ñ¤¤Þ¤¹¡£
-.SH ³«»Ï¾ò·ï
+ポインタに割り当てることで再定義できます)に書きます。
+.SH 開始条件
.I flex
-¤Ï¡¢¾ò·ïŪ¤Ë͸ú¤È¤Ê¤ë¥ë¡¼¥ë¤Î¤¿¤á¤Îµ¡¹½¤òÄ󶡤·¤Þ¤¹¡£
-¥Ñ¥¿¡¼¥ó¤Î¥×¥ì¥Õ¥£¥Ã¥¯¥¹¤¬ "<sc>" ¤È¤Ê¤Ã¤Æ¤¤¤ë¥ë¡¼¥ë¤Ï¡¢
-¥¹¥¥ã¥Ê¤¬ "sc" ¤È¤¤¤¦Ì¾Á°¤Î³«»Ï¾ò·ï¤Ë¤¤¤ë¾ì¹ç¤Î¤ß͸ú¤Ç¤¹¡£
-Î㤨¤Ð¡¢
+は、条件的に有効となるルールのための機構を提供します。
+パターンのプレフィックスが "<sc>" となっているルールは、
+スキャナが "sc" という名前の開始条件にいる場合のみ有効です。
+例えば、
.nf
<STRING>[^"]* { /* eat up the string body ... */
}
.fi
-¤Ï¥¹¥¥ã¥Ê¤¬ "STRING" ³«»Ï¾ò·ï¤Ë¤¤¤ë»þ¤Î¤ß͸ú¤Ç¤¢¤ê¡¢
+はスキャナが "STRING" 開始条件にいる時のみ有効であり、
.nf
<INITIAL,STRING,QUOTE>\\. { /* handle an escape ... */
}
.fi
-¤Ï¸½ºß¤Î³«»Ï¾ò·ï¤¬¡¢
-"INITIAL", "STRING", "QUOTE" ¤Î¤¤¤º¤ì¤«¤Î¾ì¹ç¤Î¤ß͸ú¤Ç¤¹¡£
+は現在の開始条件が、
+"INITIAL", "STRING", "QUOTE" のいずれかの場合のみ有効です。
.PP
-³«»Ï¾ò·ï¤Ï¡¢ÆþÎϤÎÄêµÁ(ÀèƬ)Éô¤Ë¤ª¤¤¤Æ¡¢¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Ê¤¤¹Ô¤Ç
+開始条件は、入力の定義(先頭)部において、インデントされない行で
.B %s
-¤â¤·¤¯¤Ï
+もしくは
.B %x
-¤«¤é»Ï¤Þ¤ê̾Á°¤¬Â³¤¯¹Ô¤Ë¤ª¤¤¤ÆÀë¸À¤µ¤ì¤Þ¤¹¡£
-Á°¼Ô¤Ï
-.I ÆâÊñŪ
-³«»Ï¾ò·ï¤ò¡¢
-¸å¼Ô¤Ï
-.I ÇÓ¾Ū
-³«»Ï¾ò·ï¤ò¡¢¤½¤ì¤¾¤ìÀë¸À¤·¤Þ¤¹¡£
-³«»Ï¾ò·ï¤ò͸ú¤Ë¤¹¤ë¤Î¤Ï
+から始まり名前が続く行において宣言されます。
+前者は
+.I 内包的
+開始条件を、
+後者は
+.I 排他的
+開始条件を、それぞれ宣言します。
+開始条件を有効にするのは
.B BEGIN
-¥¢¥¯¥·¥ç¥ó¤Ç¤¹¡£
-¼¡¤Î
+アクションです。
+次の
.B BEGIN
-¥¢¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤ë¤Þ¤Ç¡¢Í¿¤¨¤é¤ì¤¿³«»Ï¾ò·ï¤Î¥ë¡¼¥ë¤Ï͸ú¤Ç¤¢¤ê¡¢
-¾¤Î³«»Ï¾ò·ï¤Î¥ë¡¼¥ë¤Ï̵¸ú¤Ç¤¹¡£
-³«»Ï¾ò·ï¤¬
-.I ÆâÊñŪ
-¤Ê¾ì¹ç¡¢³«»Ï¾ò·ï¤ò»ý¤¿¤Ê¤¤¥ë¡¼¥ë¤â¤Þ¤¿Í¸ú¤Ç¤¹¡£
-³«»Ï¾ò·ï¤¬
-.I ÇÓ¾Ū
-¤Ê¾ì¹ç¡¢
-³«»Ï¾ò·ï¤òËþ¤¿¤¹¥ë¡¼¥ë
-.I ¤À¤±
-¤¬Í¸ú¤Ç¤¹¡£
-Ʊ¤¸ÇÓ¾³«»Ï¾ò·ï¤Ë°Í¸¤¹¤ë¥ë¡¼¥ë¤ÎÁȤϡ¢
-.I flex
-ÆþÎÏÃæ¤ÎÊ̤Υ롼¥ë¤È¤ÏÆÈΩ¤Ê¥¹¥¥ã¥Ê¤òµ½Ò¤·¤Þ¤¹¡£
-¤½¤Î¤¿¤á¡¢ÇÓ¾³«»Ï¾ò·ï¤ò»ÈÍѤ¹¤ì¤Ð¡¢"¥ß¥Ë¥¹¥¥ã¥Ê"
-(ÊÌÉôʬ¤È¤ÏʸˡŪ¤Ë°Û¤Ê¤ëÉôʬ(Î㤨¤Ð¥³¥á¥ó¥È)¤ËÂФ¹¤ë¥¹¥¥ã¥Ê)
-¤ò´Êñ¤Ë»ØÄê¤Ç¤¤Þ¤¹¡£
-.PP
-ÆâÊñŪ³«»Ï¾ò·ï¤ÈÇÓ¾Ū³«»Ï¾ò·ï¤È¤¬¤Þ¤À¾¯¤·Û£Ëæ¤Ç¤¢¤ë¤Ê¤é¡¢
-ξ¼Ô¤Î´Ø·¸¤òɽ¤¹Îã¤ò¼¨¤·¤ÆÀâÌÀ¤·¤Þ¤¹¡£°Ê²¼¤Î¥ë¡¼¥ë¤ÎÁÈ:
+アクションが実行されるまで、与えられた開始条件のルールは有効であり、
+他の開始条件のルールは無効です。
+開始条件が
+.I 内包的
+な場合、開始条件を持たないルールもまた有効です。
+開始条件が
+.I 排他的
+な場合、
+開始条件を満たすルール
+.I だけ
+が有効です。
+同じ排他開始条件に依存するルールの組は、
+.I flex
+入力中の別のルールとは独立なスキャナを記述します。
+そのため、排他開始条件を使用すれば、"ミニスキャナ"
+(別部分とは文法的に異なる部分(例えばコメント)に対するスキャナ)
+を簡単に指定できます。
+.PP
+内包的開始条件と排他的開始条件とがまだ少し曖昧であるなら、
+両者の関係を表す例を示して説明します。以下のルールの組:
.nf
%s example
bar something_else();
.fi
-¤Ï
+は
.nf
%x example
<INITIAL,example>bar something_else();
.fi
-¤ÈÅù²Á¤Ç¤¹¡£
+と等価です。
.B <INITIAL,example>
-¤¬Ìµ¤¤¤È¡¢2 ÈÖÌܤÎÎã¤Ë¤ª¤±¤ë
+が無いと、2 番目の例における
.I bar
-¥Ñ¥¿¡¼¥ó¤Ï¡¢³«»Ï¾ò·ï¤¬
+パターンは、開始条件が
.B example
-¤Î¾ì¹ç¡¢Í¸ú¤È¤Ê¤ê¤Þ¤»¤ó(¤¹¤Ê¤ï¤Á¥Þ¥Ã¥Á¤·¤Þ¤»¤ó)¡£
+の場合、有効となりません(すなわちマッチしません)。
.B <example>
-¤À¤±¤ò
+だけを
.I bar
-¤Ë¤Ä¤±¤ë¤È¡¢
+につけると、
.B example
-¤À¤±¤Ë¤ª¤¤¤Æ͸ú¤È¤Ê¤ê¡¢
+だけにおいて有効となり、
.B INITIAL
-¤Ç¤Ï͸ú¤È¤Ê¤ê¤Þ¤»¤ó¡£°ìÊý¡¢ºÇ½é¤ÎÎã¤Ç¤Ï¤É¤Á¤é¤Î¾ì¹ç¤Ç¤â͸ú¤Ç¤¹¡£
-¤Ê¤¼¤Ê¤éºÇ½é¤ÎÎã¤Ç¤Ï
+では有効となりません。一方、最初の例ではどちらの場合でも有効です。
+なぜなら最初の例では
.B example
-³«»Ï¾ò·ï¤Ï
-.I ÆâÊñŪ
+開始条件は
+.I 内包的
.B (%s)
-³«»Ï¾ò·ï¤À¤«¤é¤Ç¤¹¡£
+開始条件だからです。
.PP
-Æüì¤Ê³«»Ï¾ò·ï»ØÄê»Ò
+特殊な開始条件指定子
.B <*>
-¤ÏÁ´¤Æ¤Î³«»Ï¾ò·ï¤Ë¥Þ¥Ã¥Á¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
-¤³¤Î¤¿¤á¡¢¾å¤ÎÎã¤Ï¼¡¤Î¤è¤¦¤Ë¤â½ñ¤±¤Þ¤¹;
+は全ての開始条件にマッチすることに注意して下さい。
+このため、上の例は次のようにも書けます;
.nf
%x example
.fi
.PP
-¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë(¥Þ¥Ã¥Á¤·¤Ê¤«¤Ã¤¿Ê¸»ú¤ËÂФ·¤Æ¤Ï
+デフォルトルール(マッチしなかった文字に対しては
.B ECHO
-¤Ç¤¹)¤Ï³«»Ï¾ò·ïÃæ¤Ç¤â͸ú¤Ç¤¹¡£
-¤³¤ì¤Ï¼¡¤Î¤â¤Î¤ÈÅù²Á¤Ç¤¹:
+です)は開始条件中でも有効です。
+これは次のものと等価です:
.nf
<*>.|\\n ECHO;
.fi
.PP
.B BEGIN(0)
-¤Ï¡¢³«»Ï¾ò·ï¤Î̵¤¤¥ë¡¼¥ë¤À¤±¤¬Í¸ú¤Ç¤¢¤ë¡¢ºÇ½é¤Î¾õÂÖ¤ËÌá¤ê¤Þ¤¹¡£
-¤³¤Î¾õÂ֤ϳ«»Ï¾ò·ï "INITIAL" ¤È¤·¤Æ»²¾È¤Ç¤¤ë¤¿¤á¡¢
+は、開始条件の無いルールだけが有効である、最初の状態に戻ります。
+この状態は開始条件 "INITIAL" として参照できるため、
.B BEGIN(INITIAL)
-¤Ï
+は
.B BEGIN(0)
-¤ÈÅù²Á¤Ç¤¹¡£
-(³«»Ï¾ò·ï̾¤ò³ç¤ë³ç¸Ì¤ÏÉÔÍפǤ¹¤¬¡¢Îɤ¤¥¹¥¿¥¤¥ë¤Ç¤¢¤ë¤È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£)
+と等価です。
+(開始条件名を括る括弧は不要ですが、良いスタイルであるとされています。)
.PP
.B BEGIN
-¥¢¥¯¥·¥ç¥ó¤Ï¡¢¥ë¡¼¥ëÉô¤ÎÀèƬ¤Î¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿¥³¡¼¥ÉÃæ¤Ë¸½¤ì¤Æ¤âÎɤ¤¤Ç¤¹¡£
-Î㤨¤Ð°Ê²¼¤ÎÎã¤Ç¤Ï¡¢
+アクションは、ルール部の先頭のインデントされたコード中に現れても良いです。
+例えば以下の例では、
.B yylex()
-¤¬¸Æ¤Ð¤ì¥°¥í¡¼¥Ð¥ëÊÑ¿ô
+が呼ばれグローバル変数
.I enter_special
-¤¬¿¿¤Î¾ì¹ç¤Ë¤Ï¡¢¥¹¥¥ã¥Ê¤Ï "SPECIAL" ³«»Ï¾ò·ï¤ËÆþ¤ê¤Þ¤¹:
+が真の場合には、スキャナは "SPECIAL" 開始条件に入ります:
.nf
int enter_special;
.fi
.PP
-³«»Ï¾ò·ï¤òÀâÌÀ¤¹¤ë¤¿¤á¤Ë¡¢
-"123.456" ¤Î¤è¤¦¤Êʸ»úÎó¤ò 2 Ä̤ê¤Î°Û¤Ê¤Ã¤¿²ò¼á¤ò¤¹¤ë¥¹¥¥ã¥Ê¤ò¼¨¤·¤Þ¤¹¡£
-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤³¤ì¤Ï¡¢
-À°¿ô "123" ¤È¥É¥Ã¥È ('.') ¤ÈÀ°¿ô "456" ¤Î 3 ¥È¡¼¥¯¥ó¤Ë¿ô¤¨¤é¤ì¤Þ¤¹¡£
-¤·¤«¤·¡¢¤³¤Îʸ»úÎó¤ÎÁ°¤Ë "expect-floats" ¤Îʸ»úÎ󤬤¢¤ë¾ì¹ç¡¢
-¤³¤ì¤Ïñ°ì¤Î¥È¡¼¥¯¥ó¤Ç¤¢¤ë¤È¤µ¤ì¡¢ÉâÆ°¾®¿ôÅÀ¿ô 123.456 ¤È¤µ¤ì¤Þ¤¹:
+開始条件を説明するために、
+"123.456" のような文字列を 2 通りの異なった解釈をするスキャナを示します。
+デフォルトではこれは、
+整数 "123" とドット ('.') と整数 "456" の 3 トークンに数えられます。
+しかし、この文字列の前に "expect-floats" の文字列がある場合、
+これは単一のトークンであるとされ、浮動小数点数 123.456 とされます:
.nf
%{
"." printf( "found a dot\\n" );
.fi
-¼¡¤Ï¡¢C ¤Î¥³¥á¥ó¥È¤òÍý²ò(¤·¤Æ¼Î¤Æ¤ë)°ìÊý¤Ç¡¢
-¸½ºß¤ÎÆþÎϹԤò¿ô¤¨¤ë¥¹¥¥ã¥Ê¤Ç¤¹¡£
+次は、C のコメントを理解(して捨てる)一方で、
+現在の入力行を数えるスキャナです。
.nf
%x comment
<comment>"*"+"/" BEGIN(INITIAL);
.fi
-¤³¤Î¥¹¥¥ã¥Ê¤Ï³Æ¥ë¡¼¥ë¤Ç²Äǽ¤ÊºÇÂç¤Î¥Æ¥¥¹¥È¤Ë¥Þ¥Ã¥Á¤·¤è¤¦¤È¤¹¤ë¾ì¹ç¡¢
-¤Á¤ç¤Ã¤È¤·¤¿ÌäÂ꤬µ¯¤³¤ê¤Þ¤¹¡£
-°ìÈÌŪ¤Ë¤Ï¡¢¹â®¤Ê¥¹¥¥ã¥Ê¤òµ½Ò¤¹¤ë¾ì¹ç¡¢
-³Æ¥ë¡¼¥ë¤ÇºÇÂç¤Î¥Þ¥Ã¥Á¤òÆÀ¤è¤¦¤È¤¹¤ë¤³¤È¤¬ºÇ¤âÀ®¸ù¤·¤Þ¤¹¡£
+このスキャナは各ルールで可能な最大のテキストにマッチしようとする場合、
+ちょっとした問題が起こります。
+一般的には、高速なスキャナを記述する場合、
+各ルールで最大のマッチを得ようとすることが最も成功します。
.PP
-³«»Ï¾ò·ï̾¤Ï¼ÂºÝ¤Ë¤ÏÀ°¿ôÃͤǤ¢¤ê¡¢³ÊǼ¤¹¤ë¤³¤È¤¬½ÐÍè¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
-¤½¤Î¤¿¤á¡¢¾åµÎã¤Ï°Ê²¼¤Î¤è¤¦¤Ë³ÈÄ¥¤Ç¤¤Þ¤¹:
+開始条件名は実際には整数値であり、格納することが出来ることに注意して下さい。
+そのため、上記例は以下のように拡張できます:
.nf
%x comment foo
<comment>"*"+"/" BEGIN(comment_caller);
.fi
-¤µ¤é¤Ë¡¢¸½ºß¤Î³«»Ï¾ò·ï¤òÀ°¿ôÃͤǤ¢¤ë¥Þ¥¯¥í
+さらに、現在の開始条件を整数値であるマクロ
.B YY_START
-¤Ë¤Æ¥¢¥¯¥»¥¹¤Ç¤¤Þ¤¹¡£
-Î㤨¤Ð¡¢¾åµ¤Î
+にてアクセスできます。
+例えば、上記の
.I comment_caller
-¤Ø¤ÎÂåÆþ¤Ï¼¡¤Î¤è¤¦¤Ëµ½Ò¤Ç¤¤Þ¤¹¡£
+への代入は次のように記述できます。
.nf
comment_caller = YY_START;
.fi
-flex ¤Ï
+flex は
.B YYSTATE
-¤ò
+を
.B YY_START
-¤Î¥¨¥¤¥ê¥¢¥¹¤È¤·¤ÆÄ󶡤·¤Þ¤¹
-(AT&T ¤Î
+のエイリアスとして提供します
+(AT&T の
.I lex
-¤¬»ÈÍѤ·¤Æ¤¤¤Þ¤¹)¡£
+が使用しています)。
.PP
-³«»Ï¾ò·ï¤ÏÆȼ«¤Î̾Á°¶õ´Ö¤ò»ý¤¿¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤;
-%s ¤ä %x ¤ÎÀë¸À¤Ë¤ª¤±¤ë̾Á°Àë¸À¤Î°·¤¤¤Ï #define ¤ÈƱ¤¸¤Ç¤¹¡£
+開始条件は独自の名前空間を持たないことに注意して下さい;
+%s や %x の宣言における名前宣言の扱いは #define と同じです。
.PP
-ºÇ¸å¤Ë¡¢ÇÓ¾Ū³«»Ï¾ò·ï¤ò»ÈÍѤ¹¤ë¡¢
-Ÿ³«¤µ¤ì¤¿¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤ò´Þ¤à(Ť¹¤®¤ëʸ»úÎó¤Î¥Á¥§¥Ã¥¯¤Ï´Þ¤ß¤Þ¤»¤ó)
-C ¥¹¥¿¥¤¥ë¤Î¥¯¥ª¡¼¥Èʸ»úÎó¤Ø¤Î¥Þ¥Ã¥ÁÊýË¡¤ò¼¨¤·¤Þ¤¹:
+最後に、排他的開始条件を使用する、
+展開されたエスケープシーケンスを含む(長すぎる文字列のチェックは含みません)
+C スタイルのクオート文字列へのマッチ方法を示します:
.nf
%x str
.fi
.PP
-¾åµÎã¤Î¤è¤¦¤ËƱ°ì¤Î³«»Ï¾ò·ï¤ò»ý¤ÄÁ´¤Æ¤Î¥ë¡¼¥ë¤ÎÁ°¤Ë
-³«»Ï¾ò·ï¤ò½ñ¤«¤Í¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬Â¿¤¤¤Ç¤¹¡£
-flex ¤Ï¤³¤ì¤ò´Êñ¤«¤ÄåºÎï¤Ë¤¹¤ë¤¿¤á³«»Ï¾ò·ï
-.I ¥¹¥³¡¼¥×
-¤òƳÆþ¤·¤Þ¤·¤¿¡£
-³«»Ï¾ò·ï¥¹¥³¡¼¥×¤Ï¼¡¤Î¤è¤¦¤Ë»Ï¤Þ¤ê¤Þ¤¹:
+上記例のように同一の開始条件を持つ全てのルールの前に
+開始条件を書かねばならないことが多いです。
+flex はこれを簡単かつ綺麗にするため開始条件
+.I スコープ
+を導入しました。
+開始条件スコープは次のように始まります:
.nf
<SCs>{
.fi
-¤³¤³¤Ç
+ここで
.I SCs
-¤Ï 1 ¤Ä°Ê¾å¤Î³«»Ï¾ò·ï¤Î¥ê¥¹¥È¤Ç¤¹¡£
-³«»Ï¾ò·ï¥¹¥³¡¼¥×Æâ¤Ç¤Ï¡¢
-ºÇ½é¤Î
+は 1 つ以上の開始条件のリストです。
+開始条件スコープ内では、
+最初の
.I '{'
-¤Ë¥Þ¥Ã¥Á¤¹¤ë¤Þ¤Ç¤Î
+にマッチするまでの
.I '}'
-¤Ë¤ª¤¤¤Æ¡¢Á´¤Æ¤Î¥ë¡¼¥ë¤Ï¼«Æ°Åª¤Ë
+において、全てのルールは自動的に
.I <SCs>
-¤Î¥×¥ì¥Õ¥£¥Ã¥¯¥¹¤¬ÉÕ¤¤Þ¤¹¡£
-¤½¤Î¤¿¤á¡¢Î㤨¤Ð
+のプレフィックスが付きます。
+そのため、例えば
.nf
<ESC>{
}
.fi
-¤Ï¼¡¤Î¤â¤Î¤ÈÅù²Á¤Ç¤¹:
+は次のものと等価です:
.nf
<ESC>"\\\\n" return '\\n';
<ESC>"\\\\0" return '\\0';
.fi
-³«»Ï¾ò·ï¥¹¥³¡¼¥×¤Ï¥Í¥¹¥È¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
+開始条件スコープはネストすることが出来ます。
.PP
-³«»Ï¾ò·ï¤Î¥¹¥¿¥Ã¥¯¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë 3 ¤Ä¤Î¥ë¡¼¥Á¥ó¤ò»ÈÍѲÄǽ¤Ç¤¹:
+開始条件のスタックを制御するために 3 つのルーチンを使用可能です:
.TP
.B void yy_push_state(int new_state)
-¸½ºß¤Î³«»Ï¾ò·ï¤ò³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯¤ÎÀèƬ¤Ë¥×¥Ã¥·¥å¤·¡¢
+現在の開始条件を開始条件スタックの先頭にプッシュし、
.B BEGIN new_state
-¤ò»ÈÍѤ·¤¿¤«¤Î¤è¤¦¤Ë
+を使用したかのように
.I new_state
-¤ËÀÚ¤êÂؤ¨¤Þ¤¹
-(³«»Ï¾ò·ï̾¤ÏÀ°¿ôÃͤǤ⤢¤ë¤³¤È¤ò»×¤¤½Ð¤·¤Æ²¼¤µ¤¤)¡£
+に切り替えます
+(開始条件名は整数値でもあることを思い出して下さい)。
.TP
.B void yy_pop_state()
-¥¹¥¿¥Ã¥¯¤ÎÀèƬ¤ò¥Ý¥Ã¥×¤·¡¢
+スタックの先頭をポップし、
.B BEGIN
-¤ò»ÈÍѤ·¤Æ¤½¤Î³«»Ï¾ò·ï¤ËÀÚ¤êÂؤ¨¤Þ¤¹¡£
+を使用してその開始条件に切り替えます。
.TP
.B int yy_top_state()
-¥¹¥¿¥Ã¥¯¤ÎÆâÍƤòÊѹ¹¤»¤º¤Ë¡¢¥¹¥¿¥Ã¥¯¤ÎÀèƬ¤òÊÖ¤·¤Þ¤¹¡£
+スタックの内容を変更せずに、スタックの先頭を返します。
.PP
-³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯¤ÏưŪ¤ËÂ礤¯¤Ê¤ê¡¢
-¤Þ¤¿ÁȤ߹þ¤ß»þ¤Î¥µ¥¤¥ºÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£
-¥á¥â¥ê¤ò»È¤¤ÀÚ¤ë¤È¡¢¥×¥í¥°¥é¥à¼Â¹Ô¤ÏÃæ»ß¤µ¤ì¤Þ¤¹¡£
+開始条件スタックは動的に大きくなり、
+また組み込み時のサイズ制限はありません。
+メモリを使い切ると、プログラム実行は中止されます。
.PP
-³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¹¥¥ã¥Ê¤Ï
+開始条件スタックを使用するためには、スキャナは
.B %option stack
-¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹
-(²¼µ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ²¼¤µ¤¤)¡£
-.SH Ê£¿ô¤ÎÆþÎϥХåե¡
-¥¹¥¥ã¥Ê¤Ë¤è¤Ã¤Æ¤Ï(¥Õ¥¡¥¤¥ë¤Î "include" ¤ò¥µ¥Ý¡¼¥È¤¹¤ëÅù)
-Ê£¿ô¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò°·¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£
-.I flex
-¥¹¥¥ã¥Ê¤Ç¤ÏÂ礤ʥХåե¡¥ê¥ó¥°¤ò¹Ô¤¦¤¿¤á¡¢
-¥¹¥¥ã¥ó¥³¥ó¥Æ¥¥¹¥È¤Ë±Æ¶Á¤µ¤ì¤ë
+ディレクティブをインクルードする必要があります
+(下記オプションを参照して下さい)。
+.SH è¤\87æ\95°ã\81®å\85¥å\8a\9bã\83\90ã\83\83ã\83\95ã\82¡
+スキャナによっては(ファイルの "include" をサポートする等)
+複数の入力ストリームを扱う必要があります。
+.I flex
+スキャナでは大きなバッファリングを行うため、
+スキャンコンテキストに影響される
.B YY_INPUT
-¤òñ½ã¤Ë½ñ¤´¹¤¨¤ë¤À¤±¤Ç¤Ï¼¡¤ÎÆþÎϤ¬¤É¤³¤«¤éÆɤޤì¤ë¤Î¤«¤òÀ©¸æ¤Ç¤¤Þ¤»¤ó¡£
+を単純に書き換えるだけでは次の入力がどこから読まれるのかを制御できません。
.B YY_INPUT
-¤¬¸Æ¤Ð¤ì¤ë¤Î¤Ï¥¹¥¥ã¥Ê¤¬¥Ð¥Ã¥Õ¥¡¤Î½ª¤ê¤ËÅþ㤹¤ë»þ¤À¤±¤Ç¤¹¤Î¤Ç¡¢
-Î㤨¤Ð "include" ¤Î¤è¤¦¤ËÆþÎϸµ¤òÀÚ¤êÂؤ¨¤ëɬÍפΤ¢¤ëʸ¤ò¥¹¥¥ã¥ó¤·¤¿¸å¤Ç¤â
-Ĺ»þ´Ö¤òÈñ¤¹¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£
+が呼ばれるのはスキャナがバッファの終りに到達する時だけですので、
+例えば "include" のように入力元を切り替える必要のある文をスキャンした後でも
+長時間を費す場合があります。
.PP
-¤³¤ÎÍͤÊÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¡¢
+この様な問題を解決するため、
.I flex
-¤ÏÊ£¿ô¤ÎÆþÎϥХåե¡¤òÀ¸À®¤·¤ÆÀÚ¤êÂؤ¨¤ëµ¡¹½¤òÄ󶡤·¤Þ¤¹¡£
-ÆþÎϥХåե¡¤Ï¼¡¤Î¤è¤¦¤ËÀ¸À®¤µ¤ì¤Þ¤¹:
+は複数の入力バッファを生成して切り替える機構を提供します。
+入力バッファは次のように生成されます:
.nf
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
.fi
-¤³¤ì¤Ï
+これは
.I FILE
-¥Ý¥¤¥ó¥¿¤È size ¤ò¼è¤ê¡¢Í¿¤¨¤é¤ì¤ë file ¤Ë´ØÏ¢¤·
+ポインタと size を取り、与えられる file に関連し
.I size
-ʸ»ú¤òÊÝ»ý¤¹¤ë¤Ë½½Ê¬¤Ê¥Ð¥Ã¥Õ¥¡¤òÀ¸À®¤·¤Þ¤¹
-(µ¿¤ï¤·¤¤¾ì¹ç¤Ë¤Ï size ¤Ë¤Ï
+文字を保持するに十分なバッファを生成します
+(疑わしい場合には size には
.B YY_BUF_SIZE
-¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤)¡£
-¤³¤ì¤Ï¡¢Ê̤Υ롼¥Á¥ó(²¼µ»²¾È)¤ËÅϤ¹¤¿¤á¤Î
+を使用して下さい)。
+これは、別のルーチン(下記参照)に渡すための
.B YY_BUFFER_STATE
-¥Ï¥ó¥É¥ë¤òÊÖ¤·¤Þ¤¹¡£
+ハンドルを返します。
.B YY_BUFFER_STATE
-¤Î¥¿¥¤¥×¤Ï
+のタイプは
.B struct yy_buffer_state
-¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¢¤ë¤¿¤á¡¢
-°ÂÁ´¤Î¤¿¤á YY_BUFFER_STATE ÊÑ¿ô¤ò
+構造体へのポインタであるため、
+安全のため YY_BUFFER_STATE 変数を
.B ((YY_BUFFER_STATE) 0)
-¤È½é´ü²½¤¹¤ë¤³¤È¤¬½ÐÍè¡¢
-¥¹¥¥ã¥Ê¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Ë¤ª¤¤¤Æ
-ÆþÎϥХåե¡¤òÀµ¤·¤¯Àë¸À¤¹¤ë¤¿¤á¤Ë¤³¤Î¹½Â¤ÂΤò»²¾È¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
+と初期化することが出来、
+スキャナではなくソースファイルにおいて
+入力バッファを正しく宣言するためにこの構造体を参照することが出来ます。
.B yy_create_buffer
-¸Æ¤Ó½Ð¤·¤Ë¤ª¤±¤ë
+呼び出しにおける
.I FILE
-¥Ý¥¤¥ó¥¿¤Ï
+ポインタは
.B YY_INPUT
-¤«¤é¸«¤¨¤ë
+から見える
.I yyin
-¤ÎÃͤÈƱ¤¸¤è¤¦¤Ë¤À¤±»ÈÍѤµ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤;
+の値と同じようにだけ使用されることに注意して下さい;
.B YY_INPUT
-¤òºÆÄêµÁ¤·¤Æ
+を再定義して
.I yyin
-¤ò»È¤ï¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢
+を使わないようにすることにより、
.B yy_create_buffer
-¤ËÂФ·¤Æ°ÂÁ´¤Ë¥Ë¥ë
+に対して安全にニル
.I FILE
-¥Ý¥¤¥ó¥¿¤òÅϤ»¤Þ¤¹¡£
-¥¹¥¥ã¥ó¤¹¤ë¥Ð¥Ã¥Õ¥¡¤òÁªÂò¤¹¤ë¤¿¤á¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹:
+ポインタを渡せます。
+スキャンするバッファを選択するためには次のようにします:
.nf
void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
.fi
-¤³¤ì¤Ï¥¹¥¥ã¥Ê¤ÎÆþÎϥХåե¡¤òÀÚ¤êÂؤ¨¡¢
-¥È¡¼¥¯¥ó¤¬
+これはスキャナの入力バッファを切り替え、
+トークンが
.I new_buffer
-¤«¤éÍè¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
-¿·¤¿¤Ê¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤·¤Æ
+から来るようになります。
+新たなファイルをオープンして
.I yyin
-¤ò»Ø¤¹¤Î¤Ç¤Ï¤Ê¤¯¡¢¥¹¥¥ã¥ó¤ò·Ñ³¤¹¤ë¤¿¤á¤Ë yywrap() ¤«¤é
+を指すのではなく、スキャンを継続するために yywrap() から
.B yy_switch_to_buffer()
-¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
-¤Þ¤¿¡¢
+を使用することがあることに注意して下さい。
+また、
.B yy_switch_to_buffer()
-¤Þ¤¿¤Ï
+または
.B yywrap()
-¤Ë¤è¤ëÆþÎϸµ¤ÎÀÚ¤êÂؤ¨¤Ï³«»Ï¾ò·ï¤òÊѹ¹¤·
-.I ¤Ê¤¤
-¤³¤È¤Ë¤âÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
+による入力元の切り替えは開始条件を変更し
+.I ない
+ことにも注意して下さい。
.nf
void yy_delete_buffer( YY_BUFFER_STATE buffer )
.fi
-¤Ï¥Ð¥Ã¥Õ¥¡¤Ë´ØÏ¢¤Å¤±¤é¤ì¤¿¥¹¥È¥ì¡¼¥¸¤ÎÊÖ´ÔÍ×µá¤Ë»ÈÍѤ·¤Þ¤¹¡£(
+はバッファに関連づけられたストレージの返還要求に使用します。(
.B buffer
-¤Ï¥Ë¥ë¤Ç¤â¹½¤¤¤Þ¤»¤ó¤¬¤³¤Î¾ì¹ç¤³¤Î¥ë¡¼¥Á¥ó¤Ï²¿¤â¤·¤Þ¤»¤ó¡£)
-¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤ÎÆâÍƤò¥¯¥ê¥¢¤¹¤ë¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹:
+はニルでも構いませんがこの場合このルーチンは何もしません。)
+現在のバッファの内容をクリアするには次のようにします:
.nf
void yy_flush_buffer( YY_BUFFER_STATE buffer )
.fi
-¤³¤Î´Ø¿ô¤Ï¥Ð¥Ã¥Õ¥¡¤ÎÆâÍƤò¼Î¤Æ¤ë¤¿¤á¡¢
-¼¡¤Ë¥¹¥¥ã¥Ê¤¬¤³¤Î¥Ð¥Ã¥Õ¥¡¤È¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á¤ò¹Ô¤¦¾ì¹ç¡¢
-¥¹¥¥ã¥Ê¤Ï¤Þ¤º
+この関数はバッファの内容を捨てるため、
+次にスキャナがこのバッファとトークンのマッチを行う場合、
+スキャナはまず
.B YY_INPUT
-¤ò»ÈÍѤ·¤Æ¤³¤Î¥Ð¥Ã¥Õ¥¡¤ò¥Õ¥£¥ë¤·¤Þ¤¹¡£
+を使用してこのバッファをフィルします。
.PP
.B yy_new_buffer()
-¤Ï
+は
.B yy_create_buffer()
-¤Î¥¨¥¤¥ê¥¢¥¹¤Ç¤¢¤ê¡¢Æ°Åª¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ÈÇ˲õ¤Î¤¿¤á¤Ë»ÈÍѤ¹¤ë C++ ¤Î
+のエイリアスであり、動的オブジェクトの生成と破壊のために使用する C++ の
.I new
-¤È
+と
.I delete
-¤È¤Î¸ß´¹À¤Î¤¿¤á¤ËÄ󶡤·¤Æ¤¤¤Þ¤¹¡£
+との互換性のために提供しています。
.PP
-ºÇ¸å¤Ë
+最後に
.B YY_CURRENT_BUFFER
-¥Þ¥¯¥í¤Ï¡¢¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤ËÂФ¹¤ë
+マクロは、現在のバッファに対する
.B YY_BUFFER_STATE
-¥Ï¥ó¥É¥ë¤òÊÖ¤·¤Þ¤¹¡£
+ハンドルを返します。
.PP
-¤³¤Îµ¡Ç½¤ò»ÈÍѤ·¤Æ¥¤¥ó¥¯¥ë¡¼¥É¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë¥¹¥¥ã¥Ê¤Îµ½ÒÎã¤Ç¤¹(
+この機能を使用してインクルードファイルを展開するスキャナの記述例です(
.B <<EOF>>
-µ¡Ç½¤Ï¸å½Ò¤·¤Þ¤¹):
+機能は後述します):
.nf
/* the "incl" state is used for picking up the name
}
.fi
-¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥á¥â¥ê¾å¤Îʸ»úÎó¤ò¥¹¥¥ã¥ó¤¹¤ë¤¿¤á¤Î
-ÆþÎϥХåե¡¤òÀßÄꤹ¤ë¤¿¤á¤Î 3 ¤Ä¤Î¥ë¡¼¥Á¥ó¤ò»ÈÍѲÄǽ¤Ç¤¹¡£
-¤¤¤º¤ì¤âʸ»úÎó¤ò¥¹¥¥ã¥ó¤¹¤ë¿·¤·¤¤ÆþÎϥХåե¡¤òÀ¸À®¤·¡¢Âбþ¤¹¤ë
+ファイルではなくメモリ上の文字列をスキャンするための
+入力バッファを設定するための 3 つのルーチンを使用可能です。
+いずれも文字列をスキャンする新しい入力バッファを生成し、対応する
.B YY_BUFFER_STATE
-¥Ï¥ó¥É¥ë(½ªÎ»»þ¤Ë¤Ï
+ハンドル(終了時には
.B yy_delete_buffer()
-¤Ë¤Æ¾Ãµî¤·¤Þ¤¹)¤òÊÖ¤·¤Þ¤¹¡£¿·¤·¤¤¥Ð¥Ã¥Õ¥¡¤ËÀÚ¤êÂؤ¨¤ë»þ¤Ë¤Ï
+にて消去します)を返します。新しいバッファに切り替える時には
.B yy_switch_to_buffer()
-¤ò»ÈÍѤ·¡¢¼¡¤Î
+を使用し、次の
.B yylex()
-¤Î¸Æ¤Ó½Ð¤·»þ¤Ë¤Ï¤³¤Îʸ»úÎó¤ò¥¹¥¥ã¥ó³«»Ï¤·¤Þ¤¹¡£
+の呼び出し時にはこの文字列をスキャン開始します。
.TP
.B yy_scan_string(const char *str)
-NUL ¥¿¡¼¥ß¥Í¡¼¥È¤µ¤ì¤¿Ê¸»úÎó¤ò¥¹¥¥ã¥ó¤·¤Þ¤¹¡£
+NUL ターミネートされた文字列をスキャンします。
.TP
.B yy_scan_bytes(const char *bytes, int len)
.I len
-¥Ð¥¤¥È (NUL ¤¬´Þ¤Þ¤ì¤ë¤«¤âÃΤì¤Þ¤»¤ó)¤ò°ÌÃÖ
+バイト (NUL が含まれるかも知れません)を位置
.I bytes
-¤«¤é¥¹¥¥ã¥ó¤·¤Þ¤¹¡£
+からスキャンします。
.PP
-¤É¤Á¤é¤Î´Ø¿ô¤âʸ»úÎó¤â¤·¤¯¤Ï¥Ð¥¤¥ÈÎó¤Î
-.I ¥³¥Ô¡¼
-¤òÀ¸À®¤·¤Æ¤«¤é¥¹¥¥ã¥ó¤·¤Þ¤¹¡£(
+どちらの関数も文字列もしくはバイト列の
+.I ã\82³ã\83\94ã\83¼
+を生成してからスキャンします。(
.B yylex()
-¤Ï¥¹¥¥ã¥ó¤¹¤ë¥Ð¥Ã¥Õ¥¡¤ÎÆâÍƤòÊѹ¹¤¹¤ë¤¿¤á¡¢¤³¤ì¤¬Ë¾¤Þ¤·¤¤¤Î¤Ç¤¹¡£)
-¥³¥Ô¡¼¤òÈò¤±¤ë¤¿¤á¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹:
+はスキャンするバッファの内容を変更するため、これが望ましいのです。)
+コピーを避けるためには次のようにします:
.TP
.B yy_scan_buffer(char *base, yy_size_t size)
-¥Ð¥Ã¥Õ¥¡Æâ¤Ç
+バッファ内で
.I base
-¤«¤é
+から
.I size
-¥Ð¥¤¥È¤ÎŤµ¤ò¥¹¥¥ã¥ó¤·¤Þ¤¹¡£ºÇ¸å¤Î 2 ¥Ð¥¤¥È¤Ï
+バイトの長さをスキャンします。最後の 2 バイトは
.B YY_END_OF_BUFFER_CHAR
(ASCII NUL)
-¤Ç¤¢¤ë
-.I ɬÍפ¬¤¢¤ê¤Þ¤¹¡£
-¤³¤ì¤é¤ÎºÇ¸å¤Î 2 ¥Ð¥¤¥È¤Ï¥¹¥¥ã¥ó¤µ¤ì¤Þ¤»¤ó;
-¤½¤Î¤¿¤á¥¹¥¥ã¥ó¤ÎÆâÍƤÏ
+である
+.I 必要があります。
+これらの最後の 2 バイトはスキャンされません;
+そのためスキャンの内容は
.B base[0]
-¤«¤é
+から
.B base[size-2]
-¤Þ¤Ç¤Çξü¤ò´Þ¤ß¤Þ¤¹¡£
+までで両端を含みます。
.IP
-¤³¤ÎÍͤˤʤë¤è¤¦¤Ë
+この様になるように
.I base
-¤òÀßÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç(¤Ä¤Þ¤êºÇ¸å¤Î 2 ¤Ä¤Î
+を設定しなかった場合(つまり最後の 2 つの
.B YY_END_OF_BUFFER_CHAR
-¥Ð¥¤¥È¤ò˺¤ì¤¿¾ì¹ç)¡¢
+バイトを忘れた場合)、
.B yy_scan_buffer()
-¤Ï¿·¤·¤¤¥Ð¥Ã¥Õ¥¡¤òÀ¸À®¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¥Ë¥ë¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£
+は新しいバッファを生成するのではなくニルポインタを返します。
.IP
-·¿
+型
.B yy_size_t
-¤ÏÀ°¿ô·¿¤Ç¤¢¤ê¡¢
-¥Ð¥Ã¥Õ¥¡¤ÎÂ礤µ¤òÈ¿±Ç¤¹¤ëÀ°¿ô¼°¤ò¤³¤Î·¿¤Ë¥¥ã¥¹¥È¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
-.SH ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Î¥ë¡¼¥ë
-ÆÃÊ̥롼¥ë "<<EOF>>" ¤Ï¡¢
-¥Õ¥¡¥¤¥ë¤Î½ªÎ»»þ¤â¤·¤¯¤Ï
-yywrap() ¤¬Èó¥¼¥í(¤¹¤Ê¤ï¤Á½èÍý¤¹¤ë¥Õ¥¡¥¤¥ë¤¬Ìµ¤¤¤³¤È¤òɽ¤¹)¤Î»þ¤Ë
-¹Ô¤ï¤ì¤ë¤Ù¤¥¢¥¯¥·¥ç¥ó¤òɽ¤·¤Þ¤¹¡£
-¥¢¥¯¥·¥ç¥ó¤Ï°Ê²¼¤Î 4 ¤Ä¤Î¤¦¤Á¤Î¤¤¤º¤ì¤«¤Ç½ª¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
+は整数型であり、
+バッファの大きさを反映する整数式をこの型にキャストすることが出来ます。
+.SH ファイルの終りのルール
+特別ルール "<<EOF>>" は、
+ファイルの終了時もしくは
+yywrap() が非ゼロ(すなわち処理するファイルが無いことを表す)の時に
+行われるべきアクションを表します。
+アクションは以下の 4 つのうちのいずれかで終る必要があります。
.IP -
.I yyin
-¤Ë¿·¤·¤¤¥Õ¥¡¥¤¥ë¤ò³ä¤êÅö¤Æ¤ë(Á°¤Î¥Ð¡¼¥¸¥ç¥ó¤Î flex ¤Ç¤Ï¡¢
-³ä¤êÅö¤Æ¸å¤ËÆÃÊ̤ʥ¢¥¯¥·¥ç¥ó
+に新しいファイルを割り当てる(前のバージョンの flex では、
+割り当て後に特別なアクション
.B YY_NEW_FILE
-¤ò¸Æ¤Ó½Ð¤¹É¬Íפ¬¤¢¤ê¤Þ¤·¤¿;
-º£¤Ç¤ÏÉÔÍפǤ¹¡£);
+を呼び出す必要がありました;
+今では不要です。);
.IP -
.I return
-ʸ¤ò¼Â¹Ô¤¹¤ë;
+文を実行する;
.IP -
-ÆÃÊ̤Ê
+特別な
.B yyterminate()
-¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë;
+アクションを実行する;
.IP -
.B yy_switch_to_buffer()
-¤ò»ÈÍѤ·¤Æ¿·¤¿¤Ê¥Ð¥Ã¥Õ¥¡¤ËÀÚ¤êÂؤ¨¤ë
-(¾åµÎã¤Ç¼¨¤·¤¿Ä̤ê)¡£
+を使用して新たなバッファに切り替える
+(上記例で示した通り)。
.PP
-<<EOF>> ¥ë¡¼¥ë¤ò¾¤Î¥Ñ¥¿¡¼¥ó¤È¶¦¤Ë»ÈÍѤ·¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó;
-¾¤Î¥Ñ¥¿¡¼¥ó¤Ï³«»Ï¾ò·ï¤Î¥ê¥¹¥È¤È¤â¤Ë¤À¤±Ëþ¤¿¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£
-Ëþ¤¿¤µ¤ì¤Ê¤¤ <<EOF>> ¥ë¡¼¥ë¤¬Í¿¤¨¤é¤ì¤¿¾ì¹ç¡¢
-<<EOF>> ¥¢¥¯¥·¥ç¥ó¤ò¤Þ¤À»ý¤Ã¤Æ¤¤¤Ê¤¤
-.I Á´¤Æ¤Î
-³«»Ï¾ò·ï¤ËŬÍѤµ¤ì¤Þ¤¹¡£
-<<EOF>> ¥ë¡¼¥ë¤òºÇ½é¤Î³«»Ï¾ò·ï¤À¤±¤Ë»ØÄꤹ¤ë¤¿¤á¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£
+<<EOF>> ルールを他のパターンと共に使用してはなりません;
+他のパターンは開始条件のリストともにだけ満たされるからです。
+満たされない <<EOF>> ルールが与えられた場合、
+<<EOF>> アクションをまだ持っていない
+.I 全ての
+開始条件に適用されます。
+<<EOF>> ルールを最初の開始条件だけに指定するためには次のようにして下さい。
.nf
<INITIAL><<EOF>>
.fi
.PP
-¤³¤ì¤é¤Î¥ë¡¼¥ë¤ÏÊĤ¸¤Æ¤¤¤Ê¤¤¥³¥á¥ó¥È¤òÊá¤Þ¤¨¤ë¾ì¹çÅù¤ËÊØÍø¤Ç¤¹¡£
-Î㤨¤Ð:
+これらのルールは閉じていないコメントを捕まえる場合等に便利です。
+例えば:
.nf
%x quote
}
.fi
-.SH »¨Â¿¤Ê¥Þ¥¯¥í
-¥Þ¥¯¥í
+.SH 雑多なマクロ
+マクロ
.B YY_USER_ACTION
-¤Ë¤Ï¥Þ¥Ã¥Á¥ë¡¼¥ë¥¢¥¯¥·¥ç¥ó¤ËÀè¤À¤Ã¤Æ¾ï¤Ë¹Ô¤¦¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤Ç¤¤Þ¤¹¡£
-Î㤨¤Ð¡¢yytext ¤ò¾®Ê¸»ú¤ËÊÑ´¹¤¹¤ë¥ë¡¼¥Á¥ó¤ò¸Æ¤Ö¤è¤¦¤Ë #define ½ÐÍè¤Þ¤¹¡£
+にはマッチルールアクションに先だって常に行うアクションを定義できます。
+例えば、yytext を小文字に変換するルーチンを呼ぶように #define 出来ます。
.B YY_USER_ACTION
-µ¯Æ°»þ¤Ë¤Ï¡¢ÊÑ¿ô
+起動時には、変数
.I yy_act
-¤Ï¥Þ¥Ã¥Á¤·¤¿¥ë¡¼¥ë¤ÎÈÖ¹æ¤òÍ¿¤¨¤Þ¤¹(¥ë¡¼¥ë¤Ï 1 ÈÖ¤«¤é¿ô¤¨¤Þ¤¹)¡£
-³Æ¥ë¡¼¥ë¤¬¥Þ¥Ã¥Á¤¹¤ëÉÑÅÙ¤òÃΤꤿ¤¤¾ì¹ç¤òÁÛÁü¤·¤Æ²¼¤µ¤¤¡£
-°Ê²¼¤Ë»Å³Ý¤±¤ò¼¨¤·¤Þ¤¹:
+はマッチしたルールの番号を与えます(ルールは 1 番から数えます)。
+各ルールがマッチする頻度を知りたい場合を想像して下さい。
+以下に仕掛けを示します:
.nf
#define YY_USER_ACTION ++ctr[yy_act]
.fi
-¤³¤³¤Ç
+ここで
.I ctr
-¤ÏÇÛÎó¤Ç¤¢¤ê¡¢¤½¤ì¤¾¤ì¤Î¥ë¡¼¥ë¤¬¥Þ¥Ã¥Á¤·¤¿²ó¿ô¤ò·×¿ô¤·¤Þ¤¹¡£
-¥Þ¥¯¥í
+は配列であり、それぞれのルールがマッチした回数を計数します。
+マクロ
.B YY_NUM_RULES
-¤Ï¥ë¡¼¥ë¤ÎÁí¿ô¤òɽ¤¹¤¿¤á(
+はルールの総数を表すため(
.B \-s
-¤ò»È¤Ã¤¿»þ¤Ç¤µ¤¨¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë¤ò´Þ¤ß¤Þ¤¹)¡¢
-Àµ¤·¤¤
+を使った時でさえデフォルトルールを含みます)、
+正しい
.I ctr
-¤ÎÀë¸À¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹:
+の宣言は次のようになります:
.nf
int ctr[YY_NUM_RULES];
.fi
.PP
-¥Þ¥¯¥í
+マクロ
.B YY_USER_INIT
-¤Ë¤ÏºÇ½é¤Î¥¹¥¥ã¥ó¤ÎÁ°¤Ë¾ï¤Ë¹Ô¤¦¥¢¥¯¥·¥ç¥ó¤òºÆÄêµÁ¤Ç¤¤Þ¤¹
-(¥¹¥¥ã¥Ê¤ÎÆâÉô½é´ü²½¤ÎÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹)¡£
-Î㤨¤Ð¥Ç¡¼¥¿É½¤òÆɤ߹þ¤ó¤À¤ê¡¢¥í¥°¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤¹¤ë¤¿¤á¤Ë»ÈÍѤǤ¤Þ¤¹¡£
+には最初のスキャンの前に常に行うアクションを再定義できます
+(スキャナの内部初期化の前に行われます)。
+例えばデータ表を読み込んだり、ログファイルをオープンするために使用できます。
.PP
-¥Þ¥¯¥í
+マクロ
.B yy_set_interactive(is_interactive)
-¤Ï¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤¬
-.I ÂÐÏÃŪ
-¤È¸«Ê蘆¤ì¤Æ¤¤¤ë¤«Èݤ«¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë»ÈÍѤ·¤Þ¤¹¡£
-ÂÐÏÃŪ¤Ê¥Ð¥Ã¥Õ¥¡¤Î½èÍý¤ÏÃÙ¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢
-¥¹¥¥ã¥Ê¤ÎÆþÎϸµ¤¬ÂÐÏÃŪ¤Ç¤¢¤ê¥Ð¥Ã¥Õ¥¡¤ò¥Õ¥£¥ë¤¹¤ë¤Î¤òÂԤĤ³¤È¤Ëµ¯°ø¤¹¤ë
-ÌäÂê¤òÈò¤±¤ë¤¿¤á¤Ë¤Ï»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó(°Ê²¼¤Î
+は現在のバッファが
+.I 対話的
+と見倣されているか否かを制御するために使用します。
+対話的なバッファの処理は遅くなりますが、
+スキャナの入力元が対話的でありバッファをフィルするのを待つことに起因する
+問題を避けるためには指定しなければなりません(以下の
.B \-I
.B %option interactive
-¥Õ¥é¥°¤Ë´Ø¤¹¤ëµÄÏÀ¤ò»²¾È¤·¤Æ²¼¤µ¤¤)¡£
-¥Þ¥¯¥íµ¯Æ°»þ¤ËÈó¥¼¥í¤ò»ØÄꤹ¤ë¤È¥Ð¥Ã¥Õ¥¡¤ÏÂÐÏÃŪ¤Ë¤Ê¤ê¡¢
-¥¼¥í¤ò»ØÄꤹ¤ë¤ÈÈóÂÐÏÃŪ¤Ë¤Ê¤ê¤Þ¤¹¡£
-¤³¤Î¥Þ¥¯¥í¤Î»ÈÍѤÏ
+フラグに関する議論を参照して下さい)。
+マクロ起動時に非ゼロを指定するとバッファは対話的になり、
+ゼロを指定すると非対話的になります。
+このマクロの使用は
.B %option interactive ,
.B %option always-interactive ,
.B %option never-interactive
-¤ËÍ¥À褷¤Þ¤¹(²¼µ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ²¼¤µ¤¤)¡£
-¥Ð¥Ã¥Õ¥¡¤ò¥¹¥¥ã¥ó¤·¤ÆÂÐÏÃŪ¤Ç¤¢¤ë(¤â¤·¤¯¤Ï¤Ç¤Ê¤¤)¤ÈȽÃǤµ¤ì¤ëÁ°¤Ë¡¢
+に優先します(下記オプションを参照して下さい)。
+バッファをスキャンして対話的である(もしくはでない)と判断される前に、
.B yy_set_interactive()
-¤òµ¯Æ°¤·¤Æ²¼¤µ¤¤¡£
+を起動して下さい。
.PP
-¥Þ¥¯¥í
+マクロ
.B yy_set_bol(at_bol)
-¤Ï¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤Ë¤ª¤±¤ë¼¡¤Î¥È¡¼¥¯¥ó¤ËÂФ¹¤ë¥Þ¥Ã¥Á¤Î¤¿¤á¤Î¥¹¥¥ã¥ó¤¬
-¹ÔƬ¤«¤é»Ï¤Þ¤ë¤«Èݤ«¤òÀ©¸æ¤·¤Þ¤¹¡£
-Èó¥¼¥í¤Î¥Þ¥¯¥í°ú¿ô¤Ï¡¢'^' ¤¬ÉÕ¤¤¤¿¥ë¡¼¥ë¤ò͸ú¤Ë¤·¤Þ¤¹¤¬¡¢
-¥¼¥í¤Î¥Þ¥¯¥í°ú¿ô¤Ï '^' ¤¬ÉÕ¤¤¤¿¥ë¡¼¥ë¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£
+は現在のバッファにおける次のトークンに対するマッチのためのスキャンが
+行頭から始まるか否かを制御します。
+非ゼロのマクロ引数は、'^' が付いたルールを有効にしますが、
+ゼロのマクロ引数は '^' が付いたルールを無効にします。
.PP
-¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤«¤é¥¹¥¥ã¥ó¤µ¤ì¤¿¼¡¤Î¥È¡¼¥¯¥ó¤¬Í¸ú¤Ê '^' ¥ë¡¼¥ë¤ò»ý¤Ä»þ¡¢
-¥Þ¥¯¥í
+現在のバッファからスキャンされた次のトークンが有効な '^' ルールを持つ時、
+マクロ
.B YY_AT_BOL()
-¤Ï¿¿¤òÊÖ¤·¤Þ¤¹¡£
-¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ïµ¶¤òÊÖ¤·¤Þ¤¹¡£
+は真を返します。
+そうでない場合は偽を返します。
.PP
-À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ç¤Ï¡¢Á´¤Æ¤Î¥¢¥¯¥·¥ç¥ó¤ÏÂ礤ʰì¤Ä¤Î switch ʸ¤Ë
-½¸¤á¤é¤ì¡¢
+生成されたスキャナでは、全てのアクションは大きな一つの switch 文に
+集められ、
.B YY_BREAK
-¤Çʬ¤±¤é¤ì¤Æ¤¤¤Þ¤¹¡£
+で分けられています。
.B YY_BREAK
-¤ÏºÆÄêµÁ²Äǽ¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤½¤ì¤¾¤ì¤Î¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤ò
-ʬ¤±¤ë¤¿¤á¤Îñ¤Ê¤ë "break" ¤Ç¤¹¡£
+は再定義可能です。デフォルトではそれぞれのルールのアクションを
+分けるための単なる "break" です。
.B YY_BREAK
-¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢Î㤨¤Ð C++ ¥æ¡¼¥¶¤¬
-#define YY_BREAK ¤ò²¿¤â¤·¤Ê¤¤¤è¤¦¤ËÄêµÁ¤·
-(¤¿¤À¤·Á´¤Æ¤Î¥ë¡¼¥ë¤¬ "break" ¤« "return" ¤Ç½ª¤ë¤è¤¦¤Ë
-Ãí°Õ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó!)¡¢
-¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤¬ "return" ¤Ç½ª¤ë¤³¤È¤Ë¤è¤ê
+を再定義することにより、例えば C++ ユーザが
+#define YY_BREAK を何もしないように定義し
+(ただし全てのルールが "break" か "return" で終るように
+注意しなければなりません!)、
+ルールのアクションが "return" で終ることにより
.B YY_BREAK
-¤¬¥¢¥¯¥»¥¹¤Ç¤¤Ê¤¤¤³¤È¤Ëµ¯°ø¤¹¤ë¡¢
-Åþã¤Ç¤¤Ê¤¤Ê¸¤¬¤¢¤ë¤È¤¤¤¦·Ù¹ð¤òÈò¤±¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
-.SH ¥æ¡¼¥¶¤¬»ÈÍѲÄǽ¤ÊÃÍ
-¤³¤ÎÀá¤Ç¤Ï¥æ¡¼¥¶¤¬¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥óÉôʬ¤Ç»ÈÍѲÄǽ¤ÊÃͤò¤Þ¤È¤á¤Þ¤¹¡£
+がアクセスできないことに起因する、
+到達できない文があるという警告を避けることが出来ます。
+.SH ユーザが使用可能な値
+この節ではユーザがルールのアクション部分で使用可能な値をまとめます。
.IP -
.B char *yytext
-¸½¥È¡¼¥¯¥ó¤Î¥Æ¥¥¹¥È¤òÊÝ»ý¤·¤Æ¤¤¤Þ¤¹¡£ÆâÍƤòÊѹ¹¤·¤Æ¤â¹½¤¤¤Þ¤»¤ó¤¬¡¢
-¤½¤ÎŤµ¤ò¿¤Ð¤·¤Æ¤Ï¤¤¤±¤Þ¤»¤ó(½ª¤ê¤Ëʸ»ú¤òÄɲ䷤ƤϤ¤¤±¤Ê¤¤)¡£
+現トークンのテキストを保持しています。内容を変更しても構いませんが、
+その長さを伸ばしてはいけません(終りに文字を追加してはいけない)。
.IP
-¥¹¥¥ã¥Ê¤Îµ½Ò¤ÎºÇ½é¤ÎÉôʬ¤ËÆÃÊ̤ʻؼ¨¤Ç¤¢¤ë
+スキャナの記述の最初の部分に特別な指示である
.B %array
-¤¬½ñ¤«¤ì¤Æ¤¤¤ë¤È¤¡¢
+が書かれているとき、
.B yytext
-¤Ï
+は
.B char yytext[YYLMAX]
-¤ÈÄêµÁ¤µ¤ì¤Þ¤¹¡£
+と定義されます。
.B YYLMAX
-¤Ï¥Þ¥¯¥í¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎÃÍ (¿¤¯¤Î¾ì¹ç8KB) ¤òÊѹ¹¤·¤¿¤¤¾ì¹ç¤Ë¤Ï
-ºÇ½é¤ÎÉôʬ¤ÇºÆÄêµÁ²Äǽ¤Ç¤¹¡£
+はマクロで、デフォルトの値 (多くの場合8KB) を変更したい場合には
+最初の部分で再定義可能です。
.B %array
-¤ò»È¤¦¤È¤¤¤¯¤é¤«ÃÙ¤¤¥¹¥¥ã¥Ê¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢
+を使うといくらか遅いスキャナになりますが、
.B yytext
-¤ÎÃͤÏ
+の値は
.I input()
-¤È
+と
.I unput()
-¤Î¸Æ¤Ó½Ð¤·¤Ç¤âÇ˲õ¤µ¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
+の呼び出しでも破壊されなくなります。
.B yytext
-¤¬Ê¸»ú¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¾ì¹ç¡¢
-¤³¤ì¤é¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤Ï
+が文字ポインタである場合、
+これらの関数呼び出しは
.B yytext
-¤òÇ˲õ¤¹¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
+を破壊する可能性があります。
.B %array
-¤ÈÂоΤʻØÄê
+と対称な指定
.B %pointer
-¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£
+がデフォルトです。
.IP
-C++ ¤Î¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÀ¸À®¤¹¤ë (¥ª¥×¥·¥ç¥ó
+C++ のスキャナクラスを生成する (オプション
.B \-+
-) ¤È¤¤Ë¤Ï
+) ときには
.B %array
-¤Ï»È¤¨¤Þ¤»¤ó¡£
+は使えません。
.IP -
.B int yyleng
-¸½¥È¡¼¥¯¥ó¤ÎŤµ¤òÊÝ»ý¤·¤Æ¤¤¤Þ¤¹¡£
+現トークンの長さを保持しています。
.IP -
.B FILE *yyin
-¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç
+はデフォルトで
.I flex
-¤¬Æɤà¥Õ¥¡¥¤¥ë¤Ç¤¹¡£ºÆÄêµÁ¤¹¤ë¤³¤È¤Ï²Äǽ¤Ç¤¹¤¬¡¢¥¹¥¥ã¥ó¤ò
-»Ï¤á¤ëÁ°¤« EOF ¤ËÅþ㤷¤¿¸å¤Ç¤Î¤ßºÆÄêµÁ¤Ï°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£
-¥¹¥¥ã¥ó¤ÎÅÓÃæ¤ÇÊѹ¹¤¹¤ë¤ÈͽÁÛ³°¤Î·ë²Ì¤ò¤â¤¿¤é¤·¤Þ¤¹¡£
-¤È¤¤¤¦¤Î¤â
+が読むファイルです。再定義することは可能ですが、スキャンを
+始める前か EOF に到達した後でのみ再定義は意味を持ちます。
+スキャンの途中で変更すると予想外の結果をもたらします。
+というのも
.I flex
-¤ÏÆþÎϤò¥Ð¥Ã¥Õ¥¡¥ê¥ó¥°¤·¤Æ¤¤¤ë¤«¤é¤Ç¤¹;
-¤½¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¢Ä¾ÀܺÆÄêµÁ¤»¤º
+は入力をバッファリングしているからです;
+そのような場合には、直接再定義せず
.B yyrestart()
-¤ò»È¤Ã¤Æ²¼¤µ¤¤¡£
-¥Õ¥¡¥¤¥ë¤Î½ª¤ï¤ê¤Ç¥¹¥¥ã¥ó¤¬½ªÎ»¤·¤¿¾ì¹ç¤Ë¤Ï
+を使って下さい。
+ファイルの終わりでスキャンが終了した場合には
.I yyin
-¤ò¿·¤·¤¤ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë³ä¤êÅö¤Æ¡¢
-ºÆ¤Ó¥¹¥¥ã¥Ê¤ò¸Æ¤Ó½Ð¤·¤Æ¥¹¥¥ã¥ó¤ò³¤±¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
+を新しい入力ファイルに割り当て、
+再びスキャナを呼び出してスキャンを続けることが出来ます。
.IP -
.B void yyrestart( FILE *new_file )
-¤ò¸Æ¤Ö¤³¤È¤Ç
+を呼ぶことで
.I yyin
-¤¬¿·¤·¤¤ÆþÎÏ¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦¤Ë½ÐÍè¤Þ¤¹¡£¿·¤·¤¤¥Õ¥¡¥¤¥ë¤Ø¤ÎÊѹ¹¤Ï
-¤¹¤°¤Ë¹Ô¤ï¤ì¤Þ¤¹ (¤½¤ì¤Þ¤Ç¤Ë¥Ð¥Ã¥Õ¥¡¤ËÆɤ߹þ¤Þ¤ì¤Æ¤¤¤¿ÆþÎϤϼº¤ï¤ì¤Þ¤¹)¡£
+が新しい入力ファイルを指すように出来ます。新しいファイルへの変更は
+すぐに行われます (それまでにバッファに読み込まれていた入力は失われます)。
.I yyin
-¤ò°ú¿ô¤È¤·¤Æ
+を引数として
.B yyrestart()
-¤ò¸Æ¤Ö¤È¡¢¸½ºß¤ÎÆþÎϥХåե¡¤ò¼Î¤Æ¤ÆƱ¤¸ÆþÎÏ¥Õ¥¡¥¤¥ë¤ò
-¥¹¥¥ã¥ó¤·Â³¤±¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
+を呼ぶと、現在の入力バッファを捨てて同じ入力ファイルを
+スキャンし続けることに注意して下さい。
.IP -
.B FILE *yyout
-¤Ï
+は
.B ECHO
-¥¢¥¯¥·¥ç¥ó¤¬¹Ô¤ï¤ì¤ëÂоݤΥե¡¥¤¥ë¤Ç¤¹¡£
-¥æ¡¼¥¶¤¬ºÆ³äÅö¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
+アクションが行われる対象のファイルです。
+ユーザが再割当することが出来ます。
.IP -
.B YY_CURRENT_BUFFER
-¥«¥ì¥ó¥È¥Ð¥Ã¥Õ¥¡¤Î
+カレントバッファの
.B YY_BUFFER_STATE
-¥Ï¥ó¥É¥ë¤òÊÖ¤·¤Þ¤¹¡£
+ハンドルを返します。
.IP -
.B YY_START
-¸½ºß¤Î³«»Ï¾ò·ï¤ËÂбþ¤¹¤ëÀ°¿ôÃͤòÊÖ¤·¤Þ¤¹¡£
-³¤¤¤Æ¤³¤ÎÃͤò
+現在の開始条件に対応する整数値を返します。
+続いてこの値を
.B BEGIN
-¤È¶¦¤Ë»È¤¦¤³¤È¤Ç¡¢¥¹¥¥ã¥Ê¤ò¤½¤Î³«»Ï¾ò·ï¤ØÌ᤹¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
-.SH YACC ¤È¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹
+と共に使うことで、スキャナをその開始条件へ戻すことが出来ます。
+.SH YACC ã\81¨ã\81®ã\82¤ã\83³ã\82¿ã\83\95ã\82§ã\83¼ã\82¹
.I flex
-¤Î¼ç¤Ê»ÈÍÑÊýË¡¤Î°ì¤Ä¤Ï¡¢
+の主な使用方法の一つは、
.I yacc
-¥Ñ¡¼¥µ¥¸¥§¥Í¥ì¡¼¥¿¤È¶¦¤Ë»ÈÍѤ¹¤ë¤³¤È¤Ç¤¹¡£
+パーサジェネレータと共に使用することです。
.I yacc
-¥Ñ¡¼¥µ¤Ï
+パーサは
.B yylex()
-¤È¸À¤¦Ì¾Á°¤Î¥ë¡¼¥Á¥ó¤ò¸Æ¤Ó¡¢¼¡¤ÎÆþÎϥȡ¼¥¯¥ó¤ò¸«ÉÕ¤±¤ë¤â¤Î¤È¤·¤Æ¤¤¤Þ¤¹¡£
-¤³¤Î¥ë¡¼¥Á¥ó¤Ï¡¢¼¡¤Î¥È¡¼¥¯¥ó¤Î·¿¤òÊÖ¤·¡¢
-´ØÏ¢¤¹¤ëÃͤò¥°¥í¡¼¥Ð¥ë¤Î
+と言う名前のルーチンを呼び、次の入力トークンを見付けるものとしています。
+このルーチンは、次のトークンの型を返し、
+関連する値をグローバルの
.B yylval
-¤Ë³ÊǼ¤¹¤ë¤â¤Î¤È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
+に格納するものとされています。
.I flex
-¤ò
+を
.I yacc
-¤È¶¦¤Ë»È¤¦¤Ë¤Ï¡¢
+と共に使うには、
.I yacc
-¤Ë
+に
.B \-d
-¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¡¢
+オプションを指定して、
.I yacc
-¤ÎÆþÎϤ˸½¤ì¤ëÁ´¤Æ¤Î
+の入力に現れる全ての
.B %tokens
-¤ÎÄêµÁ¤ò´Þ¤à
+の定義を含む
.B y.tab.h
-¥Õ¥¡¥¤¥ë¤òÀ¸À®¤µ¤»¤Þ¤¹¡£
-¤³¤Î¥Õ¥¡¥¤¥ë¤Ï
+ファイルを生成させます。
+このファイルは
.I flex
-¥¹¥¥ã¥Ê¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Þ¤¹¡£
-Î㤨¤Ð¥È¡¼¥¯¥ó¤Î°ì¤Ä¤¬ "TOK_NUMBER" ¤Ç¤¢¤ë¾ì¹ç¡¢
-¥¹¥¥ã¥Ê¤Î°ìÉôʬ¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹:
+スキャナにインクルードされます。
+例えばトークンの一つが "TOK_NUMBER" である場合、
+スキャナの一部分は次のようになっています:
.nf
%{
[0-9]+ yylval = atoi( yytext ); return TOK_NUMBER;
.fi
-.SH ¥ª¥×¥·¥ç¥ó
+.SH オプション
.I flex
-¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ê¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹:
+には以下のようなオプションがあります:
.TP
.B \-b
-¥Ð¥Ã¥¯¥¢¥Ã¥×¾ðÊó¤ò
+バックアップ情報を
.I lex.backup
-¤Ë½ÐÎϤ·¤Þ¤¹¡£
-¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥¹¥¥ã¥Ê¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×(backing-up)¤òɬÍפȤ¹¤ë¾õÂÖ¤È
-¤½¤ì¤ËÂбþ¤¹¤ëÆþÎÏʸ»ú¤Î°ìÍ÷¤¬¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£
-¥ë¡¼¥ë¤òÄɲ乤뤳¤È¤Ç¥Ð¥Ã¥¯¥¢¥Ã¥×¾õÂÖ¤ò¼è¤ê½ü¤¯¤³¤È
-¤¬¤Ç¤¤Þ¤¹¡£¥Ð¥Ã¥¯¥¢¥Ã¥×¾õÂÖ¤¬
-.I Á´¤Æ
-¼è¤ê½ü¤«¤ì¡¢
+に出力します。
+このファイルには、スキャナのバックアップ(backing-up)を必要とする状態と
+それに対応する入力文字の一覧がリストされます。
+ルールを追加することでバックアップ状態を取り除くこと
+ができます。バックアップ状態が
+.I 全て
+取り除かれ、
.B \-Cf
-¤Þ¤¿¤Ï
+または
.B \-CF
-¤ò»ØÄꤹ¤ë¤È¡¢À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Î¼Â¹Ô®ÅÙ¤¬¸þ¾å¤·¤Þ¤¹(
+を指定すると、生成されたスキャナの実行速度が向上します(
.B \-p
-¥Õ¥é¥°¤ò¸«¤Æ²¼¤µ¤¤)¡£
-¥¹¥¥ã¥Ê¤ò¤®¤ê¤®¤ê¤Þ¤ÇºÇŬ²½¤·¤è¤¦¤È¤·¤Æ¤ë¥æ¡¼¥¶¤Î¤ß¤¬
-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë´Ø·¸¤¢¤ê¤Þ¤¹¡£
-(¸å½Ò¤ÎÀǽ´ØÏ¢¤ÎÀá¤ò¸«¤Æ²¼¤µ¤¤¡£)
+フラグを見て下さい)。
+スキャナをぎりぎりまで最適化しようとしてるユーザのみが
+このオプションに関係あります。
+(後述の性能関連の節を見て下さい。)
.TP
.B \-c
-²¿¤â¤·¤Þ¤»¤ó¡£POSIX ¸ß´¹¤Î¤¿¤á¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
+何もしません。POSIX 互換のために用意されています。
.TP
.B \-d
-À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤¬
-.I ¥Ç¥Ð¥Ã¥°
-¥â¡¼¥É¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
+生成されたスキャナが
+.I ã\83\87ã\83\90ã\83\83ã\82°
+モードで実行されます。
.B yy_flex_debug
-¤¬Èó¥¼¥í¤Î¾ì¹ç(¥Ç¥Õ¥©¥ë¥È)¡¢
-¥Ñ¥¿¡¼¥ó¤¬Ç§¼±¤µ¤ì¤ë¤¿¤Ó¤Ë¡¢¥¹¥¥ã¥Ê¤Ï¼¡¤Î¤è¤¦¤Ê¥á¥Ã¥»¡¼¥¸¤ò
-.I ɸ½à¥¨¥é¡¼½ÐÎÏ
-¤Ø½ÐÎϤ·¤Þ¤¹¡£
+が非ゼロの場合(デフォルト)、
+パターンが認識されるたびに、スキャナは次のようなメッセージを
+.I 標準エラー出力
+へ出力します。
.nf
--accepting rule at line 53 ("the matched text")
.fi
-¹ÔÈÖ¹æ¤Ï¥¹¥¥ã¥Ê¤òÄêµÁ¤·¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë (flex¤ËÍ¿¤¨¤é¤ì¤¿¥Õ¥¡¥¤¥ë)
-¤Ç¤Î¥ë¡¼¥ë¤Î°ÌÃ֤Ǥ¹¡£
-¥¹¥¥ã¥Ê¤¬¥Ð¥Ã¥¯¥¢¥Ã¥×¤·¤¿¤È¤¡¢¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë¤ò¼õ¤±Æþ¤ì¤¿¤È¤¡¢
-ÆþÎϥХåե¡¤ÎºÇ¸å¤ËÅþ㤷¤¿¤È¤ (¤¢¤ë¤¤¤Ï¡¢NUL¤ËÅþ㤷¤¿¤È¤;
-¥¹¥¥ã¥Ê¤Ë¤Ï¡¢¤³¤ÎÆó¤Ä¤Î¶èÊ̤ϤĤ¤Þ¤»¤ó) ¡¢¥Õ¥¡¥¤¥ë¤ÎºÇ¸å¤ËÅþ㤷¤¿
-¤È¤¤Ë¤â¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£
+行番号はスキャナを定義しているファイル (flexに与えられたファイル)
+でのルールの位置です。
+スキャナがバックアップしたとき、デフォルトルールを受け入れたとき、
+入力バッファの最後に到達したとき (あるいは、NULに到達したとき;
+スキャナには、この二つの区別はつきません) 、ファイルの最後に到達した
+ときにもメッセージが出力されます。
.TP
.B \-f
-.I ¹â®¤Ê¥¹¥¥ã¥Ê
-¤ò»ØÄꤷ¤Þ¤¹¡£
-¥Æ¡¼¥Ö¥ë°µ½Ì¤Ï¹Ô¤ï¤ì¤º¡¢É¸½àÆþ½ÐÎϤò¥Ð¥¤¥Ñ¥¹¤·¤Þ¤¹¡£
-¤½¤Î·ë²ÌÀ¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÏÂ礤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¹â®¤Ê¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£
-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï
+.I 高速なスキャナ
+を指定します。
+テーブル圧縮は行われず、標準入出力をバイパスします。
+その結果生成されるスキャナは大きくなりますが、高速なものになります。
+このオプションは
.B \-Cfr
-¤ÈƱÅù¤Ç¤¹ (°Ê²¼¤ò»²¾È)¡£
+と同等です (以下を参照)。
.TP
.B \-h
.I flex
-¤Î¥ª¥×¥·¥ç¥ó¤ÎÍ×Ì󤫤é¤Ê¤ë "¥Ø¥ë¥×" ¤ò
-.I ɸ½à½ÐÎÏ
-¤Ë½ñ¤½Ð¤·½ªÎ»¤·¤Þ¤¹¡£
+のオプションの要約からなる "ヘルプ" を
+.I 標準出力
+に書き出し終了します。
.B \-?
-¤È
+と
.B \-\-help
-¤È¤Ï
+とは
.B \-h
-¤ÈƱ¤¸¤Ç¤¹¡£
+と同じです。
.TP
.B \-i
-.I Âçʸ»ú¾®Ê¸»ú¤ò¶èÊ̤·¤Ê¤¤
-¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£
+.I 大文字小文字を区別しない
+スキャナを生成します。
.I flex
-¤ÎÆþÎϥѥ¿¡¼¥ó¤ËÍ¿¤¨¤é¤ì¤ëʸ»ú¤¬Âçʸ»ú¤Ç¤¢¤ë¤«¾®Ê¸»ú¤Ç¤¢¤ë¤«¤Ï¶èÊ̤µ¤ì¤º¡¢
-¥¹¥¥ã¥Ê¤ËÆþÎϤµ¤ì¤ëʸ»úÎó¤ÏÂçʸ»ú¾®Ê¸»ú¤Ë´Ø·¸¤Ê¤¯¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
-¥Þ¥Ã¥Á¤·¤¿¥Æ¥¥¹¥È
+の入力パターンに与えられる文字が大文字であるか小文字であるかは区別されず、
+スキャナに入力される文字列は大文字小文字に関係なくマッチします。
+マッチしたテキスト
.I yytext
-¤Ç¤ÏÆþÎÏ»þ¤ÎÂçʸ»ú¾®Ê¸»ú¤¬Êݸ¤µ¤ì¤Þ¤¹ (Âçʸ»ú¤ò¾®Ê¸»ú¤ËÊÑ´¹¤·¤¿¤ê¤·¤Þ¤»¤ó)¡£
+では入力時の大文字小文字が保存されます (大文字を小文字に変換したりしません)。
.TP
.B \-l
-AT&T ¤Î
+AT&T の
.I lex
-¤Î¼ÂÁõ¤ËÂФ·¤ÆºÇÂç¸Â¤Î¸ß´¹À¤ò»ý¤¿¤»¤Þ¤¹¡£¤³¤ì¤Ï
-.I ´°Á´¤Ê
-¸ß´¹À¤ò°ÕÌ£¤·¤Þ¤»¤ó¡£
-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤ÈÀǽ¤ËÂ礤ʱƶÁ¤¬¤¢¤ê¤Þ¤¹¡£
-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢
+の実装に対して最大限の互換性を持たせます。これは
+.I 完全な
+互換性を意味しません。
+このオプションを使用すると性能に大きな影響があります。
+このオプションは、
.B \-+, \-f, \-F, \-Cf, \-CF
-¤ÈƱ»þ¤Ë»ÈÍѤǤ¤Þ¤»¤ó¡£¾Ü¤·¤¯¤Ï¡¢
-¸å½Ò¤Î "Lex ¤ª¤è¤Ó POSIX ¤È¤ÎÈó¸ß´¹À" ¤ÎÀá¤ò¸æÍ÷²¼¤µ¤¤¡£
-¤Þ¤¿¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢
+と同時に使用できません。詳しくは、
+後述の "Lex および POSIX との非互換性" の節を御覧下さい。
+またこのオプションを使用すると、
.B YY_FLEX_LEX_COMPAT
-¤¬À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Î̾Á°¤Ë #define ¤µ¤ì¤Þ¤¹¡£
+が生成されたスキャナの名前に #define されます。
.TP
.B \-n
-²¿¤â¤·¤Þ¤»¤ó¡£POSIX ¸ß´¹¤Î¤¿¤á¤Ë¤À¤±ÍÑ°Õ¤µ¤ì¤¿¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£
+何もしません。POSIX 互換のためにだけ用意されたオプションです。
.TP
.B \-p
-Àǽ¾ðÊó¤òɸ½à¥¨¥é¡¼½ÐÎϤ˽ÐÎϤ·¤Þ¤¹¡£
+性能情報を標準エラー出力に出力します。
.I flex
-ÆþÎÏ¥Õ¥¡¥¤¥ë¤Îµ½Ò¤Î¤¦¤Á¡¢
-À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÀǽÄã²¼¤Î¿¼¹ï¤Ê¸¶°ø¤È¤Ê¤ëÉôʬ¤Ë¤Ä¤¤¤Æ¡¢
-¥³¥á¥ó¥È¤µ¤ì¤Þ¤¹¡£
-¥ª¥×¥·¥ç¥ó¤ò2²ó»ØÄꤹ¤ë¤È¡¢¤è¤êºÙ¤«¤ÊÀǽÄã²¼¤Ë¤Ä¤¤¤Æ¤â
-¥³¥á¥ó¥È¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£
+入力ファイルの記述のうち、
+生成されるスキャナの性能低下の深刻な原因となる部分について、
+コメントされます。
+オプションを2回指定すると、より細かな性能低下についても
+コメントが出力されます。
.IP
.B REJECT
-¡¦
+・
.B %option yylineno
-¡¦²ÄÊÑű¦Ê¸Ì®(·ç´Ù/¥Ð¥°¤ÎÀá¤Ç¸å½Ò)¤Ï¿Âç¤Ê¤ëÀǽ¤Ø¤Î°±Æ¶Á¤¬¤¢¤ê¤Þ¤¹;
+・可変長右文脈(欠陥/バグの節で後述)は多大なる性能への悪影響があります;
.I yymore()
-¤Î»ÈÍÑ¡¦
+の使用・
.B ^
-¥ª¥Ú¥ì¡¼¥¿¡¦
+オペレータ・
.B \-I
-¥Õ¥é¥°¤Ï¾®¤µ¤ÊÀǽ¤Î°±Æ¶Á¤¬¤¢¤ê¤Þ¤¹¡£
+フラグは小さな性能の悪影響があります。
.TP
.B \-s
-.I ¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë
-(¥Þ¥Ã¥Á¤·¤Ê¤¤¥¹¥¥ã¥Ê¤ÎÆþÎϤò
-.I ɸ½à½ÐÎÏ
-¤Ë½ÐÎϤ¹¤ë)
-¤¬ÍÞÀ©¤µ¤ì¤Þ¤¹¡£¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤·¤Ê¤¤ÆþÎϤ¬É½¤ì¤¿¤È¤¡¢¥¹¥¥ã¥Ê¤Ï
-¥¨¥é¡¼¤Ç°Û¾ï½ªÎ»¤·¤Þ¤¹¡£
-¥¹¥¥ã¥Ê¤Î¥ë¡¼¥ë¤ÎÁȤËÈ´¤±¤¬Ìµ¤¤¤«¤ò³Îǧ¤¹¤ë¾ì¹ç¤Ë͸ú¤Ç¤¹¡£
+.I デフォルトルール
+(マッチしないスキャナの入力を
+.I 標準出力
+に出力する)
+が抑制されます。ルールにマッチしない入力が表れたとき、スキャナは
+エラーで異常終了します。
+スキャナのルールの組に抜けが無いかを確認する場合に有効です。
.TP
.B \-t
.B lex.yy.c
-¤Ç¤Ï¤Ê¤¯¡¢É¸½à½ÐÎϤ˥¹¥¥ã¥Ê¤ò½ñ¤½Ð¤·¤Þ¤¹¡£
+ではなく、標準出力にスキャナを書き出します。
.TP
.B \-v
-À¸À®¤¹¤ë¥¹¥¥ã¥Ê¤ÎÆÃħ¤ÎÍ×Ìó¤ò
-.I ɸ½à¥¨¥é¡¼½ÐÎÏ
-¤Ë½ÐÎϤ¹¤ë¤è¤¦¤Ë
+生成するスキャナの特徴の要約を
+.I 標準エラー出力
+に出力するように
.I flex
-¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-¤Û¤È¤ó¤É¤ÎÆÃħ¤ÏÄ̾ï¤Î
+に指示します。
+ほとんどの特徴は通常の
.I flex
-¥æ¡¼¥¶¤Ë¤Ï°ÕÌ£¤¬¤¢¤ê¤Þ¤»¤ó¤¬¡¢ºÇ½é¤Î¹Ô¤Ï
+ユーザには意味がありませんが、最初の行は
.I flex
-¤Î¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨¤·(
+のバージョンを表示し(
.B \-V
-¤Çɽ¼¨¤µ¤ì¤ë¤â¤ÈƱ¤¸¤Ç¤¹)¡¢¼¡¤Î¹Ô¤Ï¥Ç¥Õ¥©¥ë¥È¤ò´Þ¤à¥¹¥¥ã¥ÊÀ¸À®»þ¤Î¥Õ¥é¥°¤Ç¤¹¡£
+で表示されるもと同じです)、次の行はデフォルトを含むスキャナ生成時のフラグです。
.TP
.B \-w
-·Ù¹ð¥á¥Ã¥»¡¼¥¸¤òÍÞÀ©¤·¤Þ¤¹¡£
+警告メッセージを抑制します。
.TP
.B \-B
-.I ÂÐÏÃŪ
-¤Ê¥¹¥¥ã¥Ê (°Ê²¼¤Î
+.I 対話的
+なスキャナ (以下の
.B \-I
-¤Î¹à¤ò»²¾È) ¤Ç¤Ï¤Ê¤¯
-.I ¥Ð¥Ã¥ÁŪ
-¤Ê¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦
+の項を参照) ではなく
+.I バッチ的
+なスキャナを生成するよう
.I flex
-¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-Ä̾ï
+に指示します。
+通常
.B \-B
-¤ò»ÈÍѤ¹¤ë¤Î¤Ï¡¢¥¹¥¥ã¥Ê¤òÂÐÏÃŪ¤Ë»ÈÍѤ·¤Ê¤¤¤³¤È¤¬
-.I ʬ¤«¤Ã¤Æ¤¤¤ë
-»þ¤Ç¤¢¤ê¡¢
-.I ¾¯¤·¤Ç¤â
-Àǽ¤òÄɵᤷ¤¿¤¤»þ¤Ç¤¹¡£
-¤è¤êÂ礤¤Àǽ¤òÄɵ᤹¤ë¾ì¹ç¤Ë¤Ï¡¢
+を使用するのは、スキャナを対話的に使用しないことが
+.I 分かっている
+時であり、
+.I 少しでも
+性能を追求したい時です。
+より大きい性能を追求する場合には、
.B \-Cf
-¤â¤·¤¯¤Ï
+もしくは
.B \-CF
-¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤Ù¤¤Ç¤¹(¸å½Ò)¡£
+オプションを使用すべきです(後述)。
.B \-B
-¤ò¼«Æ°Åª¤ËÀßÄꤷ¤Þ¤¹¡£
+を自動的に設定します。
.TP
.B \-F
.ul
-¹â®¤Ê
-¥¹¥¥ã¥Ê¥Æ¡¼¥Ö¥ë¤Îɽ¸½¤ò»È¤¦(ɸ½àÆþ½ÐÎϤϥХ¤¥Ñ¥¹¤¹¤ë)¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£
-¤³¤Îɽ¸½¤Ï¡¢´°Á´¥Æ¡¼¥Ö¥ëɽ¸½
+高速な
+スキャナテーブルの表現を使う(標準入出力はバイパスする)ことを指定します。
+この表現は、完全テーブル表現
.B (-f)
-¤È¤Û¤ÜƱ¤¸¤°¤é¤¤¹â®¤Ç¡¢
-¤¢¤ë¼ï¤Î¥Ñ¥¿¡¼¥ó¤ËÂФ·¤Æ¤Ï¤«¤Ê¤ê¾®¤µ¤¯ (¤¢¤ë¼ï¤ËÂФ·¤Æ¤ÏÂ礤¯)
-¤Ê¤ê¤Þ¤¹¡£
-Ä̾¼¡¤Î¤è¤¦¤Ë¡¢¥Ñ¥¿¡¼¥ó¤ÎÁȤ¬ "keywords" ¤È¤½¤ÎÂбþ
-¤ª¤è¤Ó "identifier" ¥ë¡¼¥ë¤«¤é¤Ê¤ë¾ì¹ç:
+とほぼ同じぐらい高速で、
+ある種のパターンに対してはかなり小さく (ある種に対しては大きく)
+なります。
+通常、次のように、パターンの組が "keywords" とその対応
+および "identifier" ルールからなる場合:
.nf
"case" return TOK_CASE;
[a-z]+ return TOK_ID;
.fi
-¤³¤Î¾ì¹ç¡¢´°Á´¥Æ¡¼¥Ö¥ëɽ¸½¤ò»ÈÍѤ¹¤ëÊý¤¬Îɤ¤¤Ç¤¹¡£
-¤â¤· "identifier" ¥ë¡¼¥ë¤«¤é¤Î¤ßɽ¸½¤µ¤ì¡¢
-¥¡¼¥ï¡¼¥É¤ò¸¡ÃΤ¹¤ë¤¿¤á¤Ë¥Ï¥Ã¥·¥åɽÅù¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢
+この場合、完全テーブル表現を使用する方が良いです。
+もし "identifier" ルールからのみ表現され、
+キーワードを検知するためにハッシュ表等を使用する場合は、
.B -F
-¤ò»ÈÍѤ¹¤ëÊý¤¬Îɤ¤¤Ç¤¹¡£
+を使用する方が良いです。
.IP
-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï
+このオプションは
.B \-CFr
-¤ÈÅù²Á¤Ç¤¹ (°Ê²¼¤ò»²¾È)¡£
-¤³¤ì¤Ï
+と等価です (以下を参照)。
+これは
.B \-+
-¥ª¥×¥·¥ç¥ó¤È¤ÏƱ»þ¤Ë»ØÄê¤Ç¤¤Þ¤»¤ó¡£
+オプションとは同時に指定できません。
.TP
.B \-I
.I flex
-¤Ë
-.I ÂÐÏÃŪ
-¤Ê¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-ÂÐÏÃŪ¤Ê¥¹¥¥ã¥Ê¤Ï¡¢
-ÀèÆɤߤ¹¤ë¤³¤È¤Ë¤è¤ê¥Þ¥Ã¥Á¤¹¤ë¥È¡¼¥¯¥ó¤¬´°Á´¤Ë·è¤Þ¤ë¾ì¹ç¤Î¤ßÀèÆɤߤ·¤Þ¤¹¡£
-¸½ºß¤Î¥È¡¼¥¯¥ó¤¬´û¤ËÌÀ¤é¤«¤Ê¾ì¹ç¤Ç¤â¾ï¤ËÀèÆɤߤ¹¤ëÊýË¡¤Ï¡¢
-ɬÍ×»þ¤Î¤ßÀèÆɤߤ¹¤ëÊýË¡¤è¤ê¾¯¤·Â®¤¤¤Ç¤¹¡£
-¤·¤«¤·¡¢¾ï¤ËÀèÆɤߤ¹¤ëÊýË¡¤Ç¤ÏÂÐÏÃÀǽ¤ËÃø¤·¤¯°±Æ¶Á¤¬¤¢¤ê¤Þ¤¹;
-Î㤨¤Ð¥æ¡¼¥¶¤¬²þ¹Ô¤òÆþÎϤ·¤¿¾ì¹ç¡¢
-.I Ê̤Î
-¥È¡¼¥¯¥ó¤òÆþÎϤ¹¤ë¤Þ¤Ç¤½¤ì¤Ï²þ¹Ô¤È¤·¤Æǧ¼±¤µ¤ì¤Þ¤»¤ó¡£
-Âç³µ¤Î¾ì¹ç¡¢¼¡¤Î¹ÔÁ´ÂΤòÆþÎϤ¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
+に
+.I 対話的
+なスキャナを生成するように指示します。
+対話的なスキャナは、
+先読みすることによりマッチするトークンが完全に決まる場合のみ先読みします。
+現在のトークンが既に明らかな場合でも常に先読みする方法は、
+必要時のみ先読みする方法より少し速いです。
+しかし、常に先読みする方法では対話性能に著しく悪影響があります;
+例えばユーザが改行を入力した場合、
+.I 別の
+トークンを入力するまでそれは改行として認識されません。
+大概の場合、次の行全体を入力することになります。
.IP
.I flex
-¤Î¥¹¥¥ã¥Ê¤Î¥Ç¥Õ¥©¥ë¥È¤Ï
-.I ÂÐÏÃŪ
-¤Ç¤¢¤ê¡¢Îã³°¤Ï
+のスキャナのデフォルトは
+.I 対話的
+であり、例外は
.B \-Cf
-¤ä
+や
.B \-CF
-¤È¤¤¤Ã¤¿¥Æ¡¼¥Ö¥ë°µ½Ì¥ª¥×¥·¥ç¥ó(¸å½Ò)»ÈÍÑ»þ¤Ç¤¹¡£
-¹âÀǽÄɵá»þ¤Ë¤Ï¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¤¤ë¤Ù¤¤Ç¤¹¤Î¤Ç¡¢
-¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢
+といったテーブル圧縮オプション(後述)使用時です。
+高性能追求時にはこれらのオプションを使用しているべきですので、
+これらのオプションを使用していない場合には、
.I flex
-¤Ï¼Â¹Ô»þÀǽ¤ò¾¯¤·µ¾À·¤Ë¤·¤Æľ´ÑŪ¤ÊÂÐÏÃŪ¤Ê¿¶Éñ¤¤¤ò¼è¤Ã¤Æ¤¤¤ë¤â¤Î¤È¤·¤Þ¤¹¡£
+は実行時性能を少し犠牲にして直観的な対話的な振舞いを取っているものとします。
.B \-I
-¥ª¥×¥·¥ç¥ó¤ò
+オプションを
.B \-Cf
-¤ä
+や
.B \-CF
-¤È¶¦¤Ë
-.I »ÈÍѤǤ¤Ê¤¤
-¤³¤È¤Ë¤âÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
-¼ÂºÝ¤Ï¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹;
-µö¤µ¤ì¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç͸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
+と共に
+.I 使用できない
+ことにも注意して下さい。
+実際はこのオプションは不要です;
+許される場合、デフォルトで有効になっています。
.IP
.B isatty()
-¤¬¥¹¥¥ã¥Ê¤ÎÆþÎϤËÂФ·¤Æµ¶¤òÊÖ¤¹¾ì¹ç¡¢
+がスキャナの入力に対して偽を返す場合、
.B \-I
-¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¤Ç¤â¡¢flex ¤Ï¥Ð¥Ã¥Á¥â¡¼¥É¤ØÌá¤ê¤Þ¤¹¡£
-¤Ê¤Ë¤¬¤¢¤Ã¤Æ¤âÂÐÏå⡼¥É¤ò¶¯À©¤¹¤ë¤Ë¤Ï¡¢
+が指定されていた場合でも、flex はバッチモードへ戻ります。
+なにがあっても対話モードを強制するには、
.B %option always-interactive
-(¸å½Ò¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È) ¤ò»ÈÍѤ·¤Þ¤¹¡£
+(後述のオプションを参照) を使用します。
.IP
-¥¹¥¥ã¥Ê¤òÂÐÏÃŪ¤Ç
-.I ̵¤¤
-¤è¤¦¤Ë¶¯À©¤¹¤ë¤Ë¤Ï
+スキャナを対話的で
+.I 無い
+ように強制するには
.B \-B
-(Àè½Ò)¤ò»ÈÍѤ·¤Þ¤¹¡£
+(先述)を使用します。
.TP
.B \-L
.I flex
-¤Ë
+に
.B #line
-¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò
+ディレクティブを
.B lex.yy.c
-Ãæ¤ËÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤³¤Î #line ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤òÀ¸À®¤¹¤ë¤Î¤Ç¡¢
-¥¢¥¯¥·¥ç¥ó¤Ë¤ª¤±¤ë¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ï¡¢¥ª¥ê¥¸¥Ê¥ë¤Î
+中に生成しないように指示します。
+デフォルトではこの #line ディレクティブを生成するので、
+アクションにおけるエラーメッセージは、オリジナルの
.I flex
-ÆþÎÏ¥Õ¥¡¥¤¥ë(
-¥¨¥é¡¼¤¬ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥³¡¼¥É¤Ëµ¯°ø¤¹¤ë¾ì¹ç)¤â¤·¤¯¤Ï
-¥Õ¥¡¥¤¥ë
+入力ファイル(
+エラーが入力ファイルのコードに起因する場合)もしくは
+ファイル
.B lex.yy.c
(
.I flex
-¤Î¸í¤ê -- °Ê²¼¤ÎÅŻҥ᡼¥ë¥¢¥É¥ì¥¹¤ËÊó¹ð¤·¤Æ²¼¤µ¤¤)
-¤Ë¤ª¤±¤ëÀµ¤·¤¤°ÌÃÖ¤òÍ¿¤¨¤Þ¤¹¡£
+の誤り -- 以下の電子メールアドレスに報告して下さい)
+における正しい位置を与えます。
.TP
.B \-T
.I flex
-¤ò
-.I ¥È¥ì¡¼¥¹
-¥â¡¼¥É¤Ç¼Â¹Ô¤·¤Þ¤¹¡£
-ÆþÎϤηÁ¼°¤È¤½¤Î·ë²Ì¤È¤·¤Æ½ÐÎϤµ¤ì¤ëÈó·èÄêÀ/·èÄêÀ͸Â
-¥ª¡¼¥È¥Þ¥È¥ó¤Ë´Ø¤·¤Æ
-.I ɸ½à¥¨¥é¡¼½ÐÎÏ
-¤Ë¿Î̤Υá¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£
-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¼ç¤Ë
+を
+.I ã\83\88ã\83¬ã\83¼ã\82¹
+モードで実行します。
+入力の形式とその結果として出力される非決定性/決定性有限
+オートマトンに関して
+.I 標準エラー出力
+に多量のメッセージを出力します。
+このオプションは主に
.I flex
-¤ò¥á¥ó¥Æ¥Ê¥ó¥¹¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤Þ¤¹¡£
+をメンテナンスするために使われます。
.TP
.B \-V
-¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤ò
-.I ɸ½à½ÐÎÏ
-¤Ë½ÐÎϤ·¤Æ½ªÎ»¤·¤Þ¤¹¡£
+バージョン番号を
+.I 標準出力
+に出力して終了します。
.B \-\-version
-¤Ï
+は
.B \-V
-¤ÈƱ¤¸¤Ç¤¹¡£
+と同じです。
.TP
.B \-7
-7 ¥Ó¥Ã¥È¤Î¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£
-¤¹¤Ê¤ï¤Á¡¢ÆþÎÏ¤Ë 7 ¥Ó¥Ã¥È¤Îʸ»ú¤Î¤ß¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£
+7 ビットのスキャナを生成します。
+すなわち、入力に 7 ビットの文字のみを使用することを意味します。
.B \-7
-¤ò»ØÄꤹ¤ëÍøÅÀ¤Ï¡¢
+を指定する利点は、
.B \-8
-¥ª¥×¥·¥ç¥ó(¸å½Ò)¤ò»ØÄꤷ¤ÆÀ¸À®¤¹¤ë¥Æ¡¼¥Ö¥ë¤ÎȾʬ¤Þ¤Ç¾®¤µ¤¯¤Ê¤ê¤¦¤ë¤³¤È¤Ç¤¹¡£
-·çÅÀ¤Ï¡¢ÆþÎÏ¤Ë 8 ¥Ó¥Ã¥Èʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë»þ¤Ë¡¢
-¥¹¥¥ã¥Ê¤¬¥Ï¥ó¥°¤â¤·¤¯¤Ï¥¯¥é¥Ã¥·¥å¤¹¤ë¤³¤È¤Ç¤¹¡£
+オプション(後述)を指定して生成するテーブルの半分まで小さくなりうることです。
+欠点は、入力に 8 ビット文字が含まれている時に、
+スキャナがハングもしくはクラッシュすることです。
.IP
-¤·¤«¤·¤Ê¤¬¤é¡¢
+しかしながら、
.B \-Cf
-¤ä
+や
.B \-CF
-¤È¤¤¤Ã¤¿¥Æ¡¼¥Ö¥ë°µ½Ì¥ª¥×¥·¥ç¥ó»ÈÍÑ»þ¤Ë¤Ï¥Æ¡¼¥Ö¥ë°µ½Ì¤Î¸ú²Ì¤Ï¾¯¤Ê¤¯¡¢
-°Ü¿¢À¤¬Ãø¤·¤¯Äã²¼¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
+といったテーブル圧縮オプション使用時にはテーブル圧縮の効果は少なく、
+移植性が著しく低下することに注意して下さい。
.I flex
-¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤Ï¡¢
+のデフォルトの動作では、
.B \-Cf
-¤ä
+や
.B \-CF,
-¤ò»ØÄꤷ¤Ê¤¤¸Â¤ê 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£
-»ØÄê»þ¤Ë¤Ï¡¢
-¤¢¤Ê¤¿¤Î¥µ¥¤¥È¤¬¾ï¤Ë 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë
-(USA °Ê³°¤Î¥µ¥¤¥È¤Ç¤ÏÎɤ¯¤¢¤ê¤Þ¤¹)¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢
-7 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£
-flex ¤¬ 7 ¥Ó¥Ã¥È¤â¤·¤¯¤Ï 8 ¥Ó¥Ã¥È¤Î¤¤¤º¤ì¤Î¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤Î¤«¤ò
-ÃΤꤿ¤¤¾ì¹ç¤Ë¤Ï¡¢¾å½Ò¤Î
+を指定しない限り 8 ビットスキャナを生成します。
+指定時には、
+あなたのサイトが常に 8 ビットスキャナを生成するように
+(USA 以外のサイトでは良くあります)していない場合には、
+7 ビットスキャナを生成します。
+flex が 7 ビットもしくは 8 ビットのいずれのスキャナを生成するのかを
+知りたい場合には、上述の
.B \-v
-¤Î½ÐÎϤΥե饰¤ÎÍ×Ìó¤òÄ´¤Ù¤Æ²¼¤µ¤¤¡£
+の出力のフラグの要約を調べて下さい。
.IP
.B \-Cfe
-¤â¤·¤¯¤Ï
+もしくは
.B \-CFe
-(¤³¤ì¤é¤Î¥Æ¡¼¥Ö¥ë°µ½Ì¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÅù²Á¥¯¥é¥¹¤Ï¸å½Ò)
-¤ò»ÈÍѤ·¤Æ¤â¡¢flex ¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤³¤È¤Ë
-Ãí°Õ¤·¤Æ²¼¤µ¤¤¡£
-¤Ê¤¼¤Ê¤é¡¢´°Á´¤Ê 8 ¥Ó¥Ã¥È¥Æ¡¼¥Ö¥ë¤Ï 7 ¥Ó¥Ã¥È¥Æ¡¼¥Ö¥ë¤ÈÈæ¤Ù¤Æ¤â
-¤¿¤¤¤·¤Æ¹â²Á¤Ë¤Ï¤Ê¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£
+(これらのテーブル圧縮オプションおよび等価クラスは後述)
+を使用しても、flex はデフォルトで 8 ビットスキャナを生成することに
+注意して下さい。
+なぜなら、完全な 8 ビットテーブルは 7 ビットテーブルと比べても
+たいして高価にはならないからです。
.TP
.B \-8
-8 ¥Ó¥Ã¥È¤Î¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë
+8 ビットのスキャナを生成するように
.I flex
-¤Ë»Ø¼¨¤·¤Þ¤¹¡£¤¹¤Ê¤ï¤Á 8 ¥Ó¥Ã¥Èʸ»ú¤ò²ò¼á¤·¤Þ¤¹¡£
-°µ½Ì¥ª¥×¥·¥ç¥ó
+に指示します。すなわち 8 ビット文字を解釈します。
+圧縮オプション
.B \-Cf
-¤È
+と
.B \-CF
-»ÈÍÑ»þ¤Ë¤Î¤ßɬÍפǤ¹¡£
-¤Ê¤¼¤Ê¤é flex ¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤«¤é¤Ç¤¹¡£
+使用時にのみ必要です。
+なぜなら flex はデフォルトでは 8 ビットスキャナを生成するからです。
.IP
-flex ¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤È 7 ¥Ó¥Ã¥È¤ª¤è¤Ó 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤Î
-¥È¥ì¡¼¥É¥ª¥Õ¤Ë´Ø¤·¤Æ¤Ï¡¢¾åµ
+flex のデフォルト動作と 7 ビットおよび 8 ビットスキャナの
+トレードオフに関しては、上記
.B \-7
-¤ÎµÄÏÀ¤ò¸«¤Æ²¼¤µ¤¤¡£
+の議論を見て下さい。
.TP
.B \-+
-C++ ¤Î¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£
-¾Ü¤·¤¯¤Ï C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®¤Ç¸å½Ò¤·¤Þ¤¹¡£
+C++ のスキャナクラスを生成します。
+詳しくは C++ スキャナの生成で後述します。
.TP
.B \-C[aefFmr]
-¥Æ¡¼¥Ö¥ë°µ½Ì¤ÎÄøÅ٤ȡ¢
-¤è¤ê°ìÈÌŪ¤Ë¤Ï¾®¤µ¤¤¥¹¥¥ã¥Ê¤È¹â®¤Ê¥¹¥¥ã¥Ê¤È¤Î¥È¥ì¡¼¥É¥ª¥Õ¤ò»ØÄꤷ¤Þ¤¹¡£
+テーブル圧縮の程度と、
+より一般的には小さいスキャナと高速なスキャナとのトレードオフを指定します。
.IP
.B \-Ca
-("¥¢¥é¥¤¥ó")
-À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤Î¥Æ¡¼¥Ö¥ë¤Ï¡¢
-¥á¥â¥ê¥¢¥¯¥»¥¹¤ª¤è¤Ó·×»»¤Î¤¿¤á¤Ë¥¢¥é¥¤¥ó¤µ¤ì¤ë¤¿¤á¡¢¤è¤êÂ礤ʤâ¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£
-RISC ¥¢¡¼¥¥Æ¥¯¥Á¥ã¤Ç¤Ï¥í¥ó¥°¥ï¡¼¥É¤Î¥Õ¥§¥Ã¥Á¤ª¤è¤ÓÁàºî¤Ï
-¥·¥ç¡¼¥È¥ï¡¼¥É¤È¤¤¤Ã¤¿¤è¤ê¾®¤µ¤ÊÂ礤µ¤Î¤â¤Î¤ËÂФ¹¤ë¤â¤Î¤è¤ê¸úΨŪ¤Ç¤¹¡£
-¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¥¹¥¥ã¥Ê¤Î¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤¬Ä̾ï¤Î 2Çܤˤʤ뤳¤È¤â¤¢¤ê¤Þ¤¹¡£
+("アライン")
+生成されるスキャナのテーブルは、
+メモリアクセスおよび計算のためにアラインされるため、より大きなものになります。
+RISC アーキテクチャではロングワードのフェッチおよび操作は
+ショートワードといったより小さな大きさのものに対するものより効率的です。
+場合によってはスキャナのテーブルサイズが通常の 2倍になることもあります。
.IP
.B \-Ce
-.I Åù²Á¥¯¥é¥¹
-(Ʊ°ì¤Î»ú¶ç°À¤ò»ý¤Äʸ»ú¥»¥Ã¥È)¤ò¹½ÃÛ¤·¤Þ¤¹
-(Î㤨¤Ð¡¢
-.I flex
-ÆþÎÏÃæ¤Ë¿ô»ú¤¬¸½¤ì¤ë¤Î¤¬Ê¸»ú¥¯¥é¥¹ "[0-9]" ¤Î¤ß¤Î¾ì¹ç¡¢
-¿ô»ú '0', '1', ..., '9' ¤ÏÁ´¤ÆƱ¤¸Åù²Á¥¯¥é¥¹¤Ë¤Ê¤ê¤Þ¤¹)¡£
-¿¤¯¤Î¾ì¹ç¡¢Åù²Á¥¯¥é¥¹¤òÍѤ¤¤ë¤³¤È¤ÇºÇ½ªÅª¤Ê¥Æ¡¼¥Ö¥ë/
-¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤Î¥µ¥¤¥º¤ò·àŪ(Ê¿¶Ñ¤·¤Æ 1/2-1/5)¤Ë¸º¤é¤¹¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
-¤Þ¤¿¡¢¤½¤ÎºÝ¤ÎÀǽ¥³¥¹¥È¤ÏÈó¾ï¤ËÄ㤯ÍÞ¤¨¤é¤ì¤Þ¤¹
-( 1ʸ»ú¥¹¥¥ã¥ó¤¹¤ë¤´¤È¤Ë 1²ó¤ÎÇÛÎ󸡺÷¤ò¹Ô¤¦¤À¤±¤Ç¤¹)¡£
+.I ç\89価ã\82¯ã\83©ã\82¹
+(同一の字句属性を持つ文字セット)を構築します
+(例えば、
+.I flex
+入力中に数字が現れるのが文字クラス "[0-9]" のみの場合、
+数字 '0', '1', ..., '9' は全て同じ等価クラスになります)。
+多くの場合、等価クラスを用いることで最終的なテーブル/
+オブジェクトファイルのサイズを劇的(平均して 1/2-1/5)に減らすことが出来ます。
+また、その際の性能コストは非常に低く抑えられます
+( 1文字スキャンするごとに 1回の配列検索を行うだけです)。
.IP
.B \-Cf
-.I ´°Á´(full)
-¥¹¥¥ã¥Ê¥Æ¡¼¥Ö¥ë¤òÀ¸À®¤¹¤ë¤³¤È¤ò»Ø¼¨¤·¤Þ¤¹ -
+.I 完全(full)
+スキャナテーブルを生成することを指示します -
.I flex
-¤Ï¡¢Ê̤ξõÂ֤˴ؤ¹¤ëÎà»÷¤·¤¿Á«°Ü´Ø¿ô¤ò¤¦¤Þ¤¯ÍøÍѤ¹¤ë¤È¤¤¤¦¡¢
-¥Æ¡¼¥Ö¥ë°µ½Ì¼êË¡¤òÍѤ¤¤Þ¤»¤ó¡£
+は、別の状態に関する類似した遷移関数をうまく利用するという、
+テーブル圧縮手法を用いません。
.IP
.B \-CF
-Ê̤ι⮥¹¥¥ã¥Êɽ¸½(
+別の高速スキャナ表現(
.B \-F
-¥Õ¥é¥°¤Ë¤Æµ½Ò)¤òÍѤ¤¤ë¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£
-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï
+フラグにて記述)を用いることを指定します。
+このオプションは
.B \-+
-¤ÈƱ»þ¤Ë»ÈÍѤǤ¤Þ¤»¤ó¡£
+と同時に使用できません。
.IP
.B \-Cm
.I flex
-¤Ë
-.I ¥á¥¿Åù²Á¥¯¥é¥¹
-¤ò¹½ÃÛ¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£
-¥á¥¿Åù²Á¥¯¥é¥¹¤Ï°ì½ï¤Ë»È¤ï¤ì¤ë¤³¤È¤Î¿¤¤Åù²Á¥¯¥é¥¹
-(Åù²Á¥¯¥é¥¹¤¬»È¤ï¤ì¤Æ¤¤¤Ê¤¤¤È¤¤Ë¤Ïʸ»ú·²) ¤Î½¸¹ç¤Ç¤¹¡£
-°µ½Ì¥Æ¡¼¥Ö¥ë¤ò»È¤Ã¤Æ¤¤¤ë¤È¤¡¢
-¥á¥¿Åù²Á¥¯¥é¥¹¤Ï¿¤¯¤Î¾ì¹ç¤Ë¤«¤Ê¤ê¤Î¸ú²ÌŪ¤ò¤â¤¿¤é¤·¤Þ¤¹¤¬¡¢
-¤ä¤äÀǽ¤Ë±Æ¶Á¤·¤Þ¤¹
-(1-2 ²ó¤Î¾ò·ï¥Æ¥¹¥È¤È 1 ²ó¤ÎÇÛÎ󸡺÷¤¬¥¹¥¥ã¥ó¤·¤¿Ê¸»ú¤´¤È¤Ë¹Ô¤ï¤ì¤Þ¤¹)¡£
+に
+.I ã\83¡ã\82¿ç\89価ã\82¯ã\83©ã\82¹
+を構築するよう指示します。
+ã\83¡ã\82¿ç\89価ã\82¯ã\83©ã\82¹ã\81¯ä¸\80ç·\92ã\81«ä½¿ã\82\8fã\82\8cã\82\8bã\81\93ã\81¨ã\81®å¤\9aã\81\84ç\89価ã\82¯ã\83©ã\82¹
+(等価クラスが使われていないときには文字群) の集合です。
+圧縮テーブルを使っているとき、
+メタ等価クラスは多くの場合にかなりの効果的をもたらしますが、
+やや性能に影響します
+(1-2 回の条件テストと 1 回の配列検索がスキャンした文字ごとに行われます)。
.IP
.B \-Cr
-À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ÏÆþÎϤËÂФ·¤Æ¤Ïɸ½àÆþ½ÐÎϥ饤¥Ö¥é¥ê(ɸ½àÆþ½ÐÎÏ)¤ò
-.I ¥Ð¥¤¥Ñ¥¹
-¤·¤Þ¤¹¡£
-¥¹¥¥ã¥Ê¤Ï¡¢
+生成されたスキャナは入力に対しては標準入出力ライブラリ(標準入出力)を
+.I ã\83\90ã\82¤ã\83\91ã\82¹
+します。
+スキャナは、
.B fread()
-¤ä
+や
.B getc()
-¤Ç¤Ï¤Ê¤¯¡¢
+ではなく、
.B read()
-¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£
-Àǽ²þÁ±·ë²Ì¤Ï¥·¥¹¥Æ¥à¤Ë°Í¸¤·¤Þ¤¹¡£
-¥ª¥×¥·¥ç¥ó
+システムコールを使用します。
+性能改善結果はシステムに依存します。
+オプション
.B \-Cf
-¤â¤·¤¯¤Ï
+もしくは
.B \-CF
-¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢
-°ìÈ̤ˤ³¤Î¥ª¥×¥·¥ç¥ó¤ÏÀǽ¤ò¤¢¤Þ¤ê²þÁ±¤·¤Þ¤»¤ó¡£
+を使用していない場合には、
+一般にこのオプションは性能をあまり改善しません。
.B \-Cr
-¤ò»ØÄꤹ¤ë¤È¡¢Î㤨¤Ð¥¹¥¥ã¥Ê¤òÀßÄꤹ¤ëÁ°¤Ëɸ½àÆþ½ÐÎϤò»ÈÍѤ·¤Æ
+を指定すると、例えばスキャナを設定する前に標準入出力を使用して
.I yyin
-¤òÆɤ߼è¤ëÅù¤·¤¿¾ì¹ç´ñ̯¤ÊÆ°ºî¤È¤Ê¤êÆÀ¤Þ¤¹
-(ɸ½àÆþ½ÐÎϤÎÆþÎϥХåե¡¤Ë°ÊÁ°Æɤ߹þ¤ó¤À¤â¤Î¤ò¡¢¥¹¥¥ã¥Ê¤ÏÆɤá¤Þ¤»¤ó)¡£
+を読み取る等した場合奇妙な動作となり得ます
+(標準入出力の入力バッファに以前読み込んだものを、スキャナは読めません)。
.IP
.B \-Cr
-¤Ï
+は
.B YY_INPUT
-¤òÄêµÁ¤·¤¿¾ì¹ç°ÕÌ£¤¬¤¢¤ê¤Þ¤»¤ó
-(Á°½Ò¤ÎÀ¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ò»²¾È)¡£
-¥¹¥¥ã¥Ê¤Î¸Æ½Ð¤ËÀè¤À¤Ã¤Æɸ½àÆþÎϤò»È¤Ã¤Æ
+を定義した場合意味がありません
+(前述の生成されたスキャナを参照)。
+スキャナの呼出に先だって標準入力を使って
.I yyin
-¤«¤éÆɤߤÀ¤·¤Æ¤¤¤ë¤È¤¤Ë¤Ï¡¢Í½ÁÛ³°¤Î¿¶¤ëÉñ¤¤¤ò¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
+から読みだしているときには、予想外の振る舞いをすることがあります。
.IP
.B \-C
-¤Î¤ß¤ò»ØÄꤷ¤¿¤È¤¤Ë¤Ï¡¢¥¹¥¥ã¥Ê¤Ï¥Æ¡¼¥Ö¥ë°µ½Ì¤Ï¹Ô¤¤¤Þ¤¹¤¬¡¢
-Åù²Á¥¯¥é¥¹¤â¥á¥¿Åù²Á¥¯¥é¥¹¤â»È¤¤¤Þ¤»¤ó¡£
+のみを指定したときには、スキャナはテーブル圧縮は行いますが、
+等価クラスもメタ等価クラスも使いません。
.IP
-¥ª¥×¥·¥ç¥ó
+オプション
.B \-Cf
-¤È
+と
.B \-CF
-¤Ï¥ª¥×¥·¥ç¥ó
+はオプション
.B \-Cm
-¤òƱ»þ¤Ë»ØÄꤷ¤Æ¤â°ÕÌ£¤ò¤Ê¤·¤Þ¤»¤ó -
-¤Ê¤¼¤Ê¤é¡¢¥Æ¡¼¥Ö¥ë°µ½Ì¤¬¹Ô¤ï¤ì¤Ê¤¤¤È¤¥á¥¿Åù²Á¥¯¥é¥¹
-¤Ï¸½¤ì¤Ê¤¤¤«¤é¤Ç¤¹¡£
-¤½¤ì°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤Ï¼«Í³¤ËÁȤ߹ç¤ï¤»¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
+を同時に指定しても意味をなしません -
+ã\81ªã\81\9cã\81ªã\82\89ã\80\81ã\83\86ã\83¼ã\83\96ã\83«å\9c§ç¸®ã\81\8cè¡\8cã\82\8fã\82\8cã\81ªã\81\84ã\81¨ã\81\8dã\83¡ã\82¿ç\89価ã\82¯ã\83©ã\82¹
+は現れないからです。
+それ以外のオプションは自由に組み合わせることが出来ます。
.IP
-¥Ç¥Õ¥©¥ë¥È¤ÎÀßÄê¤Ï
+デフォルトの設定は
.B \-Cem
-¤Ç¤¹¡£¤³¤Î¤È¤
+です。このとき
.I flex
-¤ÏÅù²Á¥¯¥é¥¹¤È¥á¥¿Åù²Á¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£
-¤³¤ÎÀßÄê¤ÏºÇ¤â¹â¤¤¥Æ¡¼¥Ö¥ë°µ½Ì¤ò¹Ô¤¤¤Þ¤¹¡£
-¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤ÎÂ礤µ¤È¼Â¹Ô¤Î¹â®À¤Ï¥È¥ì¡¼¥É¥ª¥Õ¤Î´Ø·¸¤Ë¤¢¤ê¡¢
-°ìÈ̤Ë
+は等価クラスとメタ等価クラスを生成します。
+この設定は最も高いテーブル圧縮を行います。
+テーブルサイズの大きさと実行の高速性はトレードオフの関係にあり、
+一般に
.nf
- ÃÙ¤¤¤¬ ¾®¤µ¤¤
+ 遅いが 小さい
-Cem
-Cm
-Ce
-C{f,F}e
-C{f,F}
-C{f,F}a
- ®¤¤¤¬ Â礤¤
+ 速いが 大きい
.fi
-¤È¤Ê¤ê¤Þ¤¹¡£
-¾®¤µ¤¤¥Æ¡¼¥Ö¥ë¤Î¥¹¥¥ã¥Ê¤ÏÄ̾ïÀ¸À®¤â¥³¥ó¥Ñ¥¤¥ë¤â¹â®¤Ç¤¢¤ë¤¿¤á¡¢
-Ä̾ï¤Î³«È¯»þ¤ÏºÇÂç¤Î°µ½Ì¤ò¹Ô¤¦¤Ç¤·¤ç¤¦¡£
+となります。
+小さいテーブルのスキャナは通常生成もコンパイルも高速であるため、
+通常の開発時は最大の圧縮を行うでしょう。
.IP
-À½ÉʤΥ¹¥¥ã¥Ê¤Ç¤Ï¡¢
+製品のスキャナでは、
.B \-Cfe
-¤¬Â®ÅÙ¤ÈÂ礤µ¤ÎÎɤ¤¥Ð¥é¥ó¥¹¤Ç¤¹¡£
+が速度と大きさの良いバランスです。
.TP
.B \-ooutput
.B lex.yy.c
-¤Ç¤Ï¤Ê¤¯¥Õ¥¡¥¤¥ë
+ではなくファイル
.B output
-¤Ë¥¹¥¥ã¥Ê¤ò½ñ¤¯¤è¤¦¤Ë flex ¤Ë»Ø¼¨¤·¤Þ¤¹¡£
+にスキャナを書くように flex に指示します。
.B \-o
-¤È
+と
.B \-t
-¥ª¥×¥·¥ç¥ó¤òÁȤ߹ç¤ï¤»¤ë¤È¡¢
-¥¹¥¥ã¥Ê¤Ï
-.I ɸ½à½ÐÎÏ
-¤Ë½ñ¤«¤ì¤Þ¤¹¤¬¡¢
+オプションを組み合わせると、
+スキャナは
+.I 標準出力
+に書かれますが、
.B #line
-¥Ç¥£¥ì¥¯¥Æ¥£¥Ö(
+ディレクティブ(
.B \\-L
-¤Ë¤Æ¾å½Ò)¤Ï¥Õ¥¡¥¤¥ë
+にて上述)はファイル
.B output
-¤ò»²¾È¤·¤Þ¤¹¡£
+を参照します。
.TP
.B \-Pprefix
.I flex
-¤Î»È¤¦¥Ç¥Õ¥©¥ë¥È¤Î¥×¥ì¥Õ¥£¥Ã¥¯¥¹
+ã\81®ä½¿ã\81\86ã\83\87ã\83\95ã\82©ã\83«ã\83\88ã\81®ã\83\97ã\83¬ã\83\95ã\82£ã\83\83ã\82¯ã\82¹
.I "yy"
-¤ÎÂå¤ï¤ê¤Ë
+の代わりに
.I prefix
-¤ò»È¤¤¤Þ¤¹¡£¤³¤ì¤Ï¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤È¥Õ¥¡¥¤¥ë̾¤Ë±Æ¶Á¤·¤Þ¤¹¡£
-Î㤨¤Ð
+を使います。これはグローバル変数とファイル名に影響します。
+例えば
.B \-Pfoo
-¤È¤¹¤ë¤È¡¢
+とすると、
.B yytext
-¤Î̾Á°¤Ï
+の名前は
.B footext
-¤È¤Ê¤ê¤Þ¤¹¡£
-¤Þ¤¿¥Ç¥Õ¥©¥ë¥È¤Î½ÐÎÏ¥Õ¥¡¥¤¥ë̾¤ò
+となります。
+またデフォルトの出力ファイル名を
.B lex.yy.c
-¤«¤é
+から
.B lex.foo.c
-¤ËÊѤ¨¤Þ¤¹¡£
-±Æ¶Á¤ò¼õ¤±¤ë̾Á°¤Î°ìÍ÷¤Ç¤¹:
+に変えます。
+影響を受ける名前の一覧です:
.nf
yy_create_buffer
yywrap
.fi
-(C++ ¥¹¥¥ã¥Ê»ÈÍÑ»þ¤Ë¤Ï
+(C++ スキャナ使用時には
.B yywrap
-¤È
+と
.B yyFlexLexer
-¤À¤±¤¬±Æ¶Á¤ò¼õ¤±¤Þ¤¹¡£)
-¥¹¥¥ã¥Ê¤ÎÃæ¤Ç¤Ï¡¢¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤ª¤è¤Ó´Ø¿ô¤ò
-¤É¤Á¤é¤Î̾Á°¤Ç¤Ç¤â»²¾È¤Ç¤¤Þ¤¹;
-³°ÉôŪ¤Ë¤Ï½¤Àµ¤·¤¿Ì¾Á°¤Î¤ß»ý¤Á¤Þ¤¹¡£
+だけが影響を受けます。)
+スキャナの中では、グローバル変数および関数を
+どちらの名前ででも参照できます;
+外部的には修正した名前のみ持ちます。
.IP
-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤ê¡¢Ê£¿ô¤Î
+このオプションを使用することにより、複数の
.I flex
-¥×¥í¥°¥é¥à¤òƱ°ì¤Î¼Â¹Ô·Á¼°¤ËÍưפ˥ê¥ó¥¯¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
-¤·¤«¤·¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï
+プログラムを同一の実行形式に容易にリンクすることが出来ます。
+しかし、このオプションは
.B yywrap()
-¤Î̾Á°¤ò¤âÊѤ¨¤Þ¤¹¤Î¤Ç¡¢
-Æȼ«¤Î(ŬÀÚ¤Ë̾Á°¤òÉÕ¤±¤¿)¥ë¡¼¥Á¥ó¤ò¥¹¥¥ã¥Ê¤Î¤¿¤á¤ËÍÑ°Õ¤¹¤ë¤«¡¢
+の名前をも変えますので、
+独自の(適切に名前を付けた)ルーチンをスキャナのために用意するか、
.B %option noyywrap
-¤ò»ÈÍѤ·¤Æ
+を使用して
.B \-ll
-¤È¥ê¥ó¥¯¤¹¤ë
-.I ɬÍפ¬¤¢¤ê¤Þ¤¹¡£
-¤É¤ì¤â¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏÄ󶡤µ¤ì¤Þ¤»¤ó¡£
+とリンクする
+.I 必要があります。
+どれもデフォルトでは提供されません。
.TP
.B \-Sskeleton_file
.I flex
-¤¬¥¹¥¥ã¥Ê¤ò¹½ÃÛ¤¹¤ë¤Î¤Ë»È¤¦¥Ç¥Õ¥©¥ë¥È¤Î
-¥¹¥±¥ë¥È¥ó¥Õ¥¡¥¤¥ë¤ËÍ¥À褷¤Þ¤¹¡£
+がスキャナを構築するのに使うデフォルトの
+スケルトンファイルに優先します。
.I flex
-¤Î¥á¥ó¥Æ¥Ê¥ó¥¹¤ä³«È¯¤ò¤¹¤ë¾ì¹ç°Ê³°¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£
+のメンテナンスや開発をする場合以外、このオプションは必要ありません。
.PP
.I flex
-¤Ï¡¢flex ¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¤Ï¤Ê¤¯¡¢
-¥¹¥¥ã¥Ê»ÅÍ͵½ÒÃ椫¤é¥ª¥×¥·¥ç¥ó¤òÀ©¸æ¤¹¤ëµ¡¹½¤òÄ󶡤·¤Þ¤¹¡£
-¤³¤ì¤Ï¥¹¥¥ã¥Ê¤ÎºÇ½é¤ÎÉôʬ¤Ë
+は、flex のコマンドラインではなく、
+スキャナ仕様記述中からオプションを制御する機構を提供します。
+これはスキャナの最初の部分に
.B %option
-¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò´Þ¤á¤ë¤³¤È¤Ç¼Â¸½¤Ç¤¤Þ¤¹¡£
-ñ°ì¤Î
+ディレクティブを含めることで実現できます。
+単一の
.B %option
-¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ë¤ª¤¤¤ÆÊ£¿ô¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤¡¢
-¤Þ¤¿Ê£¿ô¤Î¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò flex ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤ÎÉôʬ¤ËÃÖ¤¯¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
-.PP
-¤Û¤È¤ó¤É¤Î¥ª¥×¥·¥ç¥ó¤¬Ã±½ã¤Ê̾Á°¤Ç¤¢¤ê¡¢
-¥ª¥×¥·¥ç¥ó¤È¤·¤ÆÁ°¤Ë "no" ¤È¤¤¤¦¸ì(¶õÇò¤ò¤Ï¤µ¤ß¤Þ¤»¤ó)¤òÉÕ¤±¤Æ
-°ÕÌ£¤òȿž¤Ç¤¤Þ¤¹¡£
-¿ôÃÍ¤Ï flex ¤Î¥Õ¥é¥°¤ä¤½¤Îȿž¤ÈÅù²Á¤Ç¤¹¡£
-.nf
-
- 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" ¤ÈÅù²Á(¥Ç¥Õ¥©¥ë¥È)
+ディレクティブにおいて複数のオプションを指定でき、
+また複数のディレクティブを flex 入力ファイルの最初の部分に置くことが出来ます。
+.PP
+ほとんどのオプションが単純な名前であり、
+オプションとして前に "no" という語(空白をはさみません)を付けて
+意味を反転できます。
+数値は flex のフラグやその反転と等価です。
+.nf
+
+ 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" と等価(デフォルト)
.fi
.B %option
-¤Ë¤Ï¡¢Â¾¤Ç¤ÏÍøÍѤǤ¤Ê¤¤µ¡Ç½¤òÄ󶡤¹¤ë¤â¤Î¤â¤¢¤ê¤Þ¤¹:
+には、他では利用できない機能を提供するものもあります:
.TP
.B always-interactive
-ÆþÎϤò¾ï¤Ë "ÂÐÏÃŪ" ¤Ë°·¤¦¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë flex ¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-Ä̾¿·¤¿¤ÊÆþÎÏ¥Õ¥¡¥¤¥ëËè¤Ë¥¹¥¥ã¥Ê¤Ï
+入力を常に "対話的" に扱うスキャナを生成するように flex に指示します。
+通常、新たな入力ファイル毎にスキャナは
.B isatty()
-¤ò¸Æ¤Ó½Ð¤·¡¢¥¹¥¥ã¥Ê¤ÎÆþÎϸµ¤¬ÂÐÏÃŪ¤Ç¤¢¤ê 1 ÅÙ¤Ë 1 ʸ»ú¤º¤ÄÆɤà¤Ù¤¤«
-¤É¤¦¤«È½Äꤷ¤è¤¦¤È¤·¤Þ¤¹¡£
-°ìÊý¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤³¤ÎÍͤʸƤӽФ·¤Ï¹Ô¤¤¤Þ¤»¤ó¡£
+を呼び出し、スキャナの入力元が対話的であり 1 度に 1 文字ずつ読むべきか
+どうか判定しようとします。
+一方このオプションを使用するとこの様な呼び出しは行いません。
.TP
.B main
-¥¹¥¥ã¥Ê¤ËÂФ·¡¢
+スキャナに対し、
.B yylex()
-¤ò¸Æ¤Ó½Ð¤¹¤À¤±¤Î¥Ç¥Õ¥©¥ë¥È¤Î
+を呼び出すだけのデフォルトの
.B main()
-¥×¥í¥°¥é¥à¤òÄ󶡤¹¤ë¤è¤¦¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï
+プログラムを提供するように指示します。
+このオプションは
.B noyywrap
-(¸å½Ò)¤â°ÅÌÛŪ¤Ë»Ø¼¨¤·¤Þ¤¹¡£
+(後述)も暗黙的に指示します。
.TP
.B never-interactive
-ÆþÎϤò "ÂÐÏÃŪ" ¤È¤Ï¤·¤Ê¤¤¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë flex ¤Ë»Ø¼¨¤·¤Þ¤¹
-(¤³¤ì¤â¤Þ¤¿
+入力を "対話的" とはしないスキャナを生成するように flex に指示します
+(これもまた
.B isatty()
-¤ò¸Æ¤Ó½Ð¤·¤Þ¤»¤ó)¡£
-¤³¤ì¤Ï
+を呼び出しません)。
+これは
.B always-interactive
-¤ÎµÕ¤Ç¤¹¡£
+の逆です。
.TP
.B stack
-³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯¤Î»ÈÍѤò͸ú¤Ë¤·¤Þ¤¹(Á°½Ò¤Î³«»Ï¾ò·ï¤ò»²¾È)¡£
+開始条件スタックの使用を有効にします(前述の開始条件を参照)。
.TP
.B stdinit
-ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç (¤¹¤Ê¤ï¤Á
+設定されている場合 (すなわち
.B %option stdinit)
.I yyin
-¤ª¤è¤Ó
+および
.I yyout
-¤ò¡¢
-¥Ç¥Õ¥©¥ë¥È¤Î
+を、
+デフォルトの
.I nil
-¤Ç¤Ï¤Ê¤¯¡¢
-.I ɸ½àÆþÎÏ
-¤È
-.I ɸ½à½ÐÎÏ
-¤ËÀßÄꤷ¤Þ¤¹¡£
-´û¸¤Î
+ではなく、
+.I 標準入力
+と
+.I 標準出力
+に設定します。
+既存の
.I lex
-¥×¥í¥°¥é¥à¤Ë¤Ï¡¢
-ANSI C ¸ß´¹¤Ç¤Ï¤Ê¤¤¤â¤Î¤Î¡¢¤³¤ÎÆ°ºî¤Ë°Í¸¤·¤Æ¤¤¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£
-ANSI C ¤Ç¤Ï
-.I ɸ½àÆþÎÏ
-¤È
-.I ɸ½à½ÐÎÏ
-¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤ÎÄê¿ô¤Ç¤¢¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£
+プログラムには、
+ANSI C 互換ではないものの、この動作に依存しているものがあります。
+ANSI C では
+.I 標準入力
+と
+.I 標準出力
+がコンパイル時の定数である必要はありません。
.TP
.B yylineno
-ÆþÎϤ«¤éÆɤ߼è¤Ã¤¿¸½ºß¤Î¹ÔÈÖ¹æ¤ò¥°¥í¡¼¥Ð¥ëÊÑ¿ô
+入力から読み取った現在の行番号をグローバル変数
.B yylineno
-¤ËÊÝ»ý¤¹¤ë¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë¡¢
+に保持するスキャナを生成するように、
.I flex
-¤Ë»Ø¼¨¤·¤Þ¤¹¡£
-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï
+に指示します。
+このオプションは
.B %option lex-compat
-¤«¤é°ÅÌÛŪ¤Ë»ØÄꤵ¤ì¤Þ¤¹¡£
+から暗黙的に指定されます。
.TP
.B yywrap
-¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç (¤¹¤Ê¤ï¤Á
+セットされていない場合 (すなわち
.B %option noyywrap)
-¡¢¥¹¥¥ã¥Ê¤Ï¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤ËºÝ¤·
+、スキャナはファイルの終りに際し
.B yywrap()
-¤ò¸Æ¤Ð¤ºÃ±¤Ë¥¹¥¥ã¥ó¤¹¤Ù¤¥Õ¥¡¥¤¥ë¤¬¤â¤¦Ìµ¤¤¤â¤Î¤È¤¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹(
-¥æ¡¼¥¶¤¬
+を呼ばず単にスキャンすべきファイルがもう無いものとするようになります(
+ユーザが
.I yyin
-¤ò¿·¤·¤¤¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦¤Ë¤·¡¢ºÆÅÙ
+を新しいファイルを指すようにし、再度
.B yylex()
-¤ò¸Æ¤Ó½Ð¤¹¤Þ¤Ç¤Ç¤¹)¡£
+を呼び出すまでです)。
.PP
.I flex
-¤Ï¥ë¡¼¥ë¥¢¥¯¥·¥ç¥ó¤ò¥¹¥¥ã¥ó¤·¡¢
+はルールアクションをスキャンし、
.B REJECT
-¤È
+と
.B yymore()
-¤Îµ¡Ç½¤¬»È¤ï¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤òÄ´¤Ù¤Þ¤¹¡£
+の機能が使われているかどうかを調べます。
.B reject
-¤È
+と
.B yymore
-¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢
-¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿Ä̤ê¤Ë¤³¤ÎȽÄê¤ËÍ¥À褷¤Þ¤¹¡£
-¥ª¥×¥·¥ç¥ó¤Î»ØÄê¤Ï¡¢¥»¥Ã¥È¤·¤Æµ¡Ç½¤ò»ÈÍѤ·¤Æ¤¤¤ë¤³¤È¤ò¼¨¤¹(Î㤨¤Ð
+のオプションを使用すると、
+オプションで指定した通りにこの判定に優先します。
+オプションの指定は、セットして機能を使用していることを示す(例えば
.B %option reject)
-¡¢¤â¤·¤¯¤Ï¥¢¥ó¥»¥Ã¥È¤·¤Æµ¡Ç½¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¤³¤È¤ò¼¨¤¹(Î㤨¤Ð
+、もしくはアンセットして機能を使用していないことを示す(例えば
.B %option noyymore)
-¤â¤Î¤È¤·¤Þ¤¹¡£
+ものとします。
.PP
-¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ïʸ»úÎó¤ÎÃͤò¼è¤ê¡¢'=' ¤Ç¶èÀÚ¤ê¤Þ¤¹:
+次のオプションは文字列の値を取り、'=' で区切ります:
.nf
%option outfile="ABC"
.fi
-¤³¤ì¤Ï
+これは
.B -oABC
-¤ÈƱ¤¸¤Ç¤¢¤ê¡¢
+と同じであり、
.nf
%option prefix="XYZ"
.fi
-¤Ï
+は
.B -PXYZ
-¤ÈƱ¤¸¤Ç¤¹¡£
-ºÇ¸å¤Ë¡¢
+と同じです。
+最後に、
.nf
%option yyclass="foo"
.fi
-¤Ï C++ ¥¹¥¥ã¥ÊÀ¸À®»þ¤Î¤ß͸ú(
+は C++ スキャナ生成時のみ有効(
.B \-+
-¥ª¥×¥·¥ç¥ó)¤Ç¤¹¡£¤³¤ì¤Ï
+オプション)です。これは
.I flex
-¤ËÂФ·¤Æ¡¢
+に対して、
.B foo
-¤¬
+が
.B yyFlexLexer
-¤Î¥µ¥Ö¥¯¥é¥¹¤Ç¤¢¤ë¤³¤È¤òÃΤ餻¤Þ¤¹¤Î¤Ç¡¢
+のサブクラスであることを知らせますので、
.I flex
-¤Ï¥¢¥¯¥·¥ç¥ó¤ò
+はアクションを
.B yyFlexLexer::yylex()
-¤Ç¤Ï¤Ê¤¯
+ではなく
.B foo::yylex()
-¤Î¥á¥ó¥Ð´Ø¿ô¤È¤·¤Þ¤¹¡£
-¤Þ¤¿¡¢(
+のメンバ関数とします。
+また、(
.B yyFlexLexer::LexerError()
-¤òµ¯Æ°¤¹¤ë¤³¤È¤Ë¤è¤ê)¸Æ¤Ó½Ð¤¹¤È¼Â¹Ô»þ¥¨¥é¡¼¤ò½üµî¤¹¤ë
+を起動することにより)呼び出すと実行時エラーを除去する
.B yyFlexLexer::yylex()
-¥á¥ó¥Ð´Ø¿ô¤òÀ¸À®¤·¤Þ¤¹¡£
-¾ÜºÙ¤Ï¸å½Ò¤Î C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®¤ò¸«¤Æ²¼¤µ¤¤¡£
+メンバ関数を生成します。
+詳細は後述の C++ スキャナの生成を見て下さい。
.PP
-À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤«¤éÉÔÍפʥ롼¥Á¥ó¤ò½ü¤¤¿¤¤ lint ½ãÀµ¼çµÁ¼Ô¤Î¤¿¤á¤Ë
-¿¤¯¤Î¥ª¥×¥·¥ç¥ó¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
-°Ê²¼¤ò¥¢¥ó¥»¥Ã¥È¤¹¤ë¤È(Î㤨¤Ð
+生成されたスキャナから不要なルーチンを除きたい lint 純正主義者のために
+多くのオプションが用意されています。
+以下をアンセットすると(例えば
.B %option nounput
-)¡¢Âбþ¤¹¤ë¥ë¡¼¥Á¥ó¤ÏÀ¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤«¤é½ü¤«¤ì¤Þ¤¹:
+)、対応するルーチンは生成されるスキャナから除かれます:
.nf
input, unput
.fi
(
.B yy_push_state()
-Åù¤Ï
+等は
.B %option stack
-¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¤Ë¤Ï¸½¤ì¤Þ¤»¤ó)¡£
-.SH Àǽ´ØÏ¢
+を使用しない場合には現れません)。
+.SH 性能関連
.I flex
-¤Î¼ç¤Ê¥Ç¥¶¥¤¥ó¥´¡¼¥ë¤Ï¹âÀǽ¤Ê¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤³¤È¤Ç¤¹¡£
-¿¤¯¤Î¥ë¡¼¥ë¥»¥Ã¥È¤òÎɤ¯°·¤¦¤³¤È¤ÇºÇŬ²½¤µ¤ì¤Þ¤¹¡£
-´û¤Ë³µÀ⤷¤¿
+の主なデザインゴールは高性能なスキャナを生成することです。
+多くのルールセットを良く扱うことで最適化されます。
+既に概説した
.B \-C
-¥ª¥×¥·¥ç¥ó»ÈÍѤˤè¤ë¥Æ¡¼¥Ö¥ë°µ½Ì¤Ëµ¯°ø¤¹¤ë®Å٤ؤαƶÁ¤Î¾¤Ë¡¢
-Àǽ¤ò°²½¤µ¤»¤ë¿¤¯¤Î¥ª¥×¥·¥ç¥ó/¥¢¥¯¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£
-¤½¤ì¤é¤ò¹â²Á¤Ê¤â¤Î¤«¤é°Â²Á¤Ê¤â¤Î¤Ø¤Èʤ٤ޤ¹:
+オプション使用によるテーブル圧縮に起因する速度への影響の他に、
+性能を悪化させる多くのオプション/アクションがあります。
+それらを高価なものから安価なものへと並べます:
.nf
REJECT
%option yylineno
- ¼«Í³Ä¹¤Î±¦Ê¸Ì®(trailing context)
+ 自由長の右文脈(trailing context)
- ¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬É¬Íפʥѥ¿¡¼¥ó¤ÎÁÈ
+ バックアップが必要なパターンの組
%array
%option interactive
%option always-interactive
- '^' ¹ÔƬ¥ª¥Ú¥ì¡¼¥¿
+ '^' è¡\8cé ã\82ªã\83\9aã\83¬ã\83¼ã\82¿
yymore()
.fi
-ºÇ½é¤Î 3 ¤Ä¤ÏÈó¾ï¤Ë¹â²Á¤Ç¤¢¤ê¡¢ºÇ¸å¤Î 2 ¤Ä¤ÏÈó¾ï¤Ë°Â²Á¤Ç¤¹¡£
+最初の 3 つは非常に高価であり、最後の 2 つは非常に安価です。
.B unput()
-¤ÏÀøºßŪ¤ËÈó¾ï¤ËÂ礤ʻŻö¤ò¤¹¤ë¥ë¡¼¥Á¥ó¸Æ¤Ó½Ð¤·¤È¤·¤Æ¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¤Î¤ËÂФ·¡¢
+は潜在的に非常に大きな仕事をするルーチン呼び出しとして実装されているのに対し、
.B yyless()
-¤ÏÈó¾ï¤Ë°Â²Á¤Ê¥Þ¥¯¥í¤Ç¤¹;
-¤Ç¤¹¤«¤é¥¹¥¥ã¥ó¤·¤¿Í¾Ê¬¤Ê¥Æ¥¥¹¥È¤òÌ᤹¤À¤±¤Î¾ì¹ç¤Ë¤Ï
+は非常に安価なマクロです;
+ですからスキャンした余分なテキストを戻すだけの場合には
.B yyless()
-¤ò»È¤Ã¤Æ²¼¤µ¤¤¡£
+を使って下さい。
.PP
-Àǽ¤¬½ÅÍפʾì¹ç¤Ë¤Ï¡¢½ÐÍ褦¤ë¸Â¤ê¤ÎÅØÎϤǤâ¤Ã¤Æ
+性能が重要な場合には、出来うる限りの努力でもって
.B REJECT
-¤òÈò¤±¤Æ²¼¤µ¤¤¡£
-¤³¤ì¤ÏÆä˹â²Á¤Ê¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£
+を避けて下さい。
+これは特に高価なオプションです。
.PP
-¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ê½ü¤¯¤È¡¢Í𻨤ˤʤꡢ
-¤Ò¤É¤¯¶ìÏ«¤·¤ÆÊ£»¨¤Ê¥¹¥¥ã¥Ê¤òºî¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
-¼ÂºÝŪ¤Ë¤Ï
+バックアップを取り除くと、乱雑になり、
+ひどく苦労して複雑なスキャナを作ることになります。
+実際的には
.B \-b
-¥Õ¥é¥°¤ò»ØÄꤷ¤Æ
+フラグを指定して
.I lex.backup
-¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤³¤È¤«¤é»Ï¤á¤Þ¤¹¡£Î㤨¤Ð¡¢ÆþÎÏ
+ファイルを生成することから始めます。例えば、入力
.nf
%%
foobar return TOK_KEYWORD;
.fi
-¤ËÂФ·¤Æ¤Ï¡¢¥Õ¥¡¥¤¥ë¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹:
+に対しては、ファイルは次のようになります:
.nf
State #6 is non-accepting -
Compressed tables always back up.
.fi
-ºÇ½é¤Î¿ô¹Ô¤Ï¡¢
-\&'o' ¤ËÁ«°Ü¤Ç¤¤ë¤¬Â¾¤Îʸ»ú¤Ë¤ÏÁ«°Ü¤Ç¤¤Ê¤¤¾õÂÖ¤¬¤¢¤ê¡¢
-¤½¤Î¾õÂ֤Ǥϸ½ºß¥¹¥¥ã¥ó¤µ¤ì¤¿¥Æ¥¥¹¥È¤Ï¾¤Î¥ë¡¼¥ë¤Ë¤Ï¥Þ¥Ã¥Á¤·¤Ê¤¤¤³¤È¤ò
-ɽ¤·¤Þ¤¹¡£
-¤³¤Î¾õÂÖ¤¬È¯À¸¤·¤¿¤Î¤Ï¡¢
-ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¹Ô 2, 3 ¤Î¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤·¤è¤¦¤È¤·¤¿»þ¤Ç¤¹¡£
-¥¹¥¥ã¥Ê¤¬¤³¤ÎÍͤʾõÂ֤ˤ¢¤ê 'o' °Ê³°¤Îʸ»ú¤òÆɤó¤À¾ì¹ç¤Ë¤Ï¡¢
-¥Þ¥Ã¥Á¤¹¤ë¥ë¡¼¥ë¤òõ¤¹¤¿¤á¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬É¬ÍפȤʤê¤Þ¤¹¡£
-¾¯¤·¹Í¤¨¤ì¤Ð¡¢¤³¤ì¤Ï "fo" ¤ò¸«¤¿»þ¤Ë¤¢¤ë¾õÂ֤˰㤤¤Ê¤¤¤³¤È¤¬Ê¬¤«¤ë¤Ç¤·¤ç¤¦¡£
-¤³¤ÎÍͤʻþ¡¢'o' °Ê³°¤Î¤â¤Î¤¬¸½¤ì¤ë¤È¡¢
-¥¹¥¥ã¥Ê¤Ï¡¢Ã±¤Ë 'f' ¤Ë¥Þ¥Ã¥Á¤¹¤ë(¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë)¤È¤³¤í¤Þ¤Ç
-Ìá¤ê(¥Ð¥Ã¥¯¥¢¥Ã¥×¤·)¤Þ¤¹¡£
-.PP
-¾õÂÖ #8 ¤Ë´Ø·¸¤¹¤ë¥³¥á¥ó¥È¤Ï¡¢
-"foob" ¤¬¥¹¥¥ã¥ó¤µ¤ì¤¿»þ¤ËÌäÂ꤬¤¢¤ë¤³¤È¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£
-¼ÂºÝ¡¢'a' °Ê³°¤Îʸ»ú¤Ë½Ð²ñ¤¦¤È¡¢¥¹¥¥ã¥Ê¤Ï "foo" ¤ò¼õÍý¤¹¤ë¤È¤³¤í¤Þ¤ÇÌá¤ê¤Þ¤¹¡£
-ƱÍͤ˾õÂÖ #9 ¤Ë´Ø·¸¤¹¤ë¥³¥á¥ó¥È¤Ï¡¢
-"fooba" ¤¬¥¹¥¥ã¥ó¤µ¤ì 'r' ¤¬Â³¤«¤Ê¤¤¾ì¹ç¤Ë´Ø·¸¤·¤Þ¤¹¡£
-.PP
-ºÇ¸å¤Î¥³¥á¥ó¥È¤¬ÄÌÃΤ¹¤ë¤Î¤Ï¡¢
+最初の数行は、
+\&'o' に遷移できるが他の文字には遷移できない状態があり、
+その状態では現在スキャンされたテキストは他のルールにはマッチしないことを
+表します。
+この状態が発生したのは、
+入力ファイルの行 2, 3 のルールにマッチしようとした時です。
+スキャナがこの様な状態にあり 'o' 以外の文字を読んだ場合には、
+マッチするルールを探すためのバックアップが必要となります。
+少し考えれば、これは "fo" を見た時にある状態に違いないことが分かるでしょう。
+この様な時、'o' 以外のものが現れると、
+スキャナは、単に 'f' にマッチする(デフォルトルール)ところまで
+戻り(バックアップし)ます。
+.PP
+状態 #8 に関係するコメントは、
+"foob" がスキャンされた時に問題があることを表しています。
+実際、'a' 以外の文字に出会うと、スキャナは "foo" を受理するところまで戻ります。
+同様に状態 #9 に関係するコメントは、
+"fooba" がスキャンされ 'r' が続かない場合に関係します。
+.PP
+最後のコメントが通知するのは、
.B \-Cf
-¤ä
+や
.B \-CF
-¤ò»È¤Ã¤Æ¤¤¤ë¤Î¤Ç¤Ê¤±¤ì¤Ð
-¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ê½ü¤³¤¦¤ÈÅØÎϤ¹¤ë¤³¤È¤Ï̵°ÕÌ£¤Ç¤¢¤ë¤³¤È¤Ç¤¹¡£
-¤Ê¤¼¤Ê¤é¡¢°µ½Ì¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ËÂФ·¤Æ¤½¤Î¤è¤¦¤Ê¤³¤È¤ò¤·¤Æ¤â¡¢
-Àǽ¾å¤ÎÍø±×¤Ï̵¤¤¤«¤é¤Ç¤¹¡£
+を使っているのでなければ
+バックアップを取り除こうと努力することは無意味であることです。
+なぜなら、圧縮されたスキャナに対してそのようなことをしても、
+性能上の利益は無いからです。
.PP
-¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ê½ü¤¯¤¿¤á¤Ë¤Ï "¥¨¥é¡¼" ¥ë¡¼¥ë¤òÄɲä·¤Þ¤¹:
+バックアップを取り除くためには "エラー" ルールを追加します:
.nf
%%
.fi
.PP
-¥¡¼¥ï¡¼¥É¤Î¥ê¥¹¥È¤«¤é¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ê½ü¤¯¤Ë¤Ï¡¢"Á´¤Æ¤òÊá¤Þ¤¨¤ë"
-¥ë¡¼¥ë¤ò»ÈÍѤ¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹:
+キーワードのリストからバックアップを取り除くには、"全てを捕まえる"
+ルールを使用することが出来ます:
.nf
%%
[a-z]+ return TOK_ID;
.fi
-Ä̾ŬÀڤʻþ¤Ë¤Ï¤³¤ì¤Ï°ìÈÖÎɤ¤²ò·èºö¤Ç¤¹¡£
+通常、適切な時にはこれは一番良い解決策です。
.PP
-¥Ð¥Ã¥¯¥¢¥Ã¥×¥á¥Ã¥»¡¼¥¸¤Ï¥«¥¹¥±¡¼¥É¤¹¤ë¤³¤È¤¬Â¿¤¤¤Ç¤¹¡£
-Ê£»¨¤Ê¥ë¡¼¥ë¤ÎÁȤǤϡ¢¿ôÉ´¤â¤Î¥á¥Ã¥»¡¼¥¸¤òÆÀ¤ë¤Î¤ÏÉáÄ̤Τ³¤È¤Ç¤¹¡£
-¤·¤«¤·¡¢¤³¤ì¤ò²òÀϤ¹¤ì¤Ð¡¢¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½üµî¤¹¤ë¤¿¤á¤Ë¤Ï
-ÂçÄñ¤Î¾ì¹ç¿ô¥À¡¼¥¹¤Î¥ë¡¼¥ë¤Ë¤À¤±´Ø·¸¤¢¤ë¤³¤È¤¬Ê¬¤«¤ë¤Ç¤·¤ç¤¦
-(¤·¤«¤·¡¢´Ö°ã¤¨¤ë¤³¤È¤¬Â¿¤¯¡¢¸í¤Ã¤¿¥ë¡¼¥ë¤¬¶öÁ³Í¸ú¤Ê¥È¡¼¥¯¥ó¤Ë¥Þ¥Ã¥Á¤·ÆÀ¤Þ¤¹¡£
-¾Íè¤Î
+バックアップメッセージはカスケードすることが多いです。
+複雑なルールの組では、数百ものメッセージを得るのは普通のことです。
+しかし、これを解析すれば、バックアップを除去するためには
+大抵の場合数ダースのルールにだけ関係あることが分かるでしょう
+(しかし、間違えることが多く、誤ったルールが偶然有効なトークンにマッチし得ます。
+将来の
.I flex
-¤Îµ¡Ç½¤Ç¤Ï¡¢
-¼«Æ°Åª¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½üµî¤¹¤ë¥ë¡¼¥ë¤òÄɲ乤ë¤è¤¦¤Ë¤Ê¤ë¤«¤âÃΤì¤Þ¤»¤ó)¡£
+の機能では、
+自動的にバックアップを除去するルールを追加するようになるかも知れません)。
.PP
-¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½üµî¤¹¤ë¤³¤È¤Ë¤è¤êÍø±×¤¬¤¢¤ë¤Î¤Ï¡¢
-.I Á´¤Æ¤Î
-¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½üµî¤·¤¿»þ¤À¤±¤È¤¤¤¦¤³¤È¤ò³Ð¤¨¤Æ¤ª¤¯¤³¤È¤Ï½ÅÍפǤ¹¡£
-¤¿¤Ã¤¿°ì¤Ä¤ò»Ä¤·¤Æ¤â²¿¤âÆÀ¤ë¤³¤È¤¬½ÐÍè¤Þ¤»¤ó¡£
+バックアップを除去することにより利益があるのは、
+.I 全ての
+バックアップを除去した時だけということを覚えておくことは重要です。
+たった一つを残しても何も得ることが出来ません。
.PP
-.I ²ÄÊÑŤÎ
-±¦Ê¸Ì® (º¸Éôʬ¤È±¦Éôʬ¤Î¤¤¤º¤ì¤«¤â¤·¤¯¤ÏξÊý¤¬²ÄÊÑĹ)¤Ï
+.I 可変長の
+右文脈 (左部分と右部分のいずれかもしくは両方が可変長)は
.B REJECT
-¤È¤Û¤ÜƱ¤¸¤À¤±¤Î(¤¹¤Ê¤ï¤ÁÁêÅö¤Î)ÀǽÎô²½¤È¤Ê¤ê¤Þ¤¹¡£
-¤½¤Î¤¿¤á¼¡¤Î¤è¤¦¤Ê¥ë¡¼¥ë:
+とほぼ同じだけの(すなわち相当の)性能劣化となります。
+そのため次のようなルール:
.nf
%%
mouse|rat/(cat|dog) run();
.fi
-¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤«:
+は次のように書くか:
.nf
%%
rat/cat|dog run();
.fi
-¼¡¤Î¤è¤¦¤Ë½ñ¤¤¤¿Êý¤¬Îɤ¤¤Ç¤¹:
+次のように書いた方が良いです:
.nf
%%
mouse|rat/dog run();
.fi
-ÆÃÊÌ¤Ê '|' ¥¢¥¯¥·¥ç¥ó¤Ï½õ¤±¤Ë¤Ï¤Ê¤ê
-.I ¤Þ¤»¤ó
-¤·¡¢¤«¤¨¤Ã¤Æ¾õ¶·¤ò°¤¯¤·¤Þ¤¹
-(¸å½Ò¤Î·ç´Ù/¥Ð¥°¤ò»²¾È)¡£
+特別な '|' アクションは助けにはなり
+.I ません
+し、かえって状況を悪くします
+(後述の欠陥/バグを参照)。
.LP
-¥¹¥¥ã¥Ê¤ÎÀǽ¤ò¸þ¾å¤µ¤»¤ë¤¿¤á¤Î;ÃÏ(¼Â¸½¤ÏºÇ¤âÍÆ°×)¤Ï¡¢
-¥Þ¥Ã¥Á¤¹¤ë¥È¡¼¥¯¥ó¤¬Ä¹¤±¤ì¤Ð¥¹¥¥ã¥Ê¤¬¹â®¤Ë¤Ê¤ë¤³¤È¤Ë¤¢¤ê¤Þ¤¹¡£
-Ť¤¥È¡¼¥¯¥ó¤Ç¤Ï¤Û¤È¤ó¤É¤ÎÆþÎϽèÍý¤Ï(û¤¤)ÆâÉô¥ë¡¼¥×¤Ç½èÍý¤µ¤ì¡¢
-¥¢¥¯¥·¥ç¥ó¤Î¤¿¤á¤Ë¥¹¥¥ã¥Ê´Ä¶¤òÀßÄꤹ¤ëÄɲäλŻö(Î㤨¤Ð
+スキャナの性能を向上させるための余地(実現は最も容易)は、
+マッチするトークンが長ければスキャナが高速になることにあります。
+長いトークンではほとんどの入力処理は(短い)内部ループで処理され、
+アクションのためにスキャナ環境を設定する追加の仕事(例えば
.B yytext)
-¤ò¤Û¤È¤ó¤É¤·¤Ê¤¤¤«¤é¤Ç¤¹¡£
-C ¥³¥á¥ó¥È¤Î¥¹¥¥ã¥Ê¤ò»×¤¤½Ð¤·¤Þ¤·¤ç¤¦:
+をほとんどしないからです。
+C コメントのスキャナを思い出しましょう:
.nf
%x comment
<comment>"*"+"/" BEGIN(INITIAL);
.fi
-¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤È¹â®¤Ë¤Ê¤ê¤Þ¤¹:
+次のように書くと高速になります:
.nf
%x comment
<comment>"*"+"/" BEGIN(INITIAL);
.fi
-º£Å٤ϡ¢²þ¹ÔËè¤ËÊ̤Υ¢¥¯¥·¥ç¥ó¤Î½èÍý¤ò¹Ô¤¦¤Î¤Ç¤Ï¤Ê¤¯¡¢
-²þ¹Ôǧ¼±¤Ï¥ë¡¼¥ë´Ö¤Ç "ʬ»¶" ¤µ¤ì¡¢
-²Äǽ¤Ê¸Â¤êŤ¤¥Æ¥¥¹¥È¤Ë¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
-¥ë¡¼¥ë¤Î
-.I ÄɲÃ
-¤Ï¥¹¥¥ã¥Ê¤òÃÙ¤¯
-.I ¤·¤Þ¤»¤ó!
-¥¹¥¥ã¥Ê¤Î®Å٤ϡ¢¥ë¡¼¥ë¿ô¤È¤â¡¢
-¥ª¥Ú¥ì¡¼¥¿ '*' ¤ä '|' ¤È¤¤¤Ã¤¿¤â¤Î¤Ë´ð¤Å¤¯¥ë¡¼¥ë¤ÎÊ£»¨¤µ
-(¤³¤ÎÀá¤Î»Ï¤á¤Ç°·¤¤¤Þ¤·¤¿)¤È¤âÆÈΩ¤Ç¤¹¡£
-.\" ³ç¸ÌÆ⼫¿®Ìµ¤·¤Ç¤¹
+今度は、改行毎に別のアクションの処理を行うのではなく、
+改行認識はルール間で "分散" され、
+可能な限り長いテキストにマッチするようになっています。
+ルールの
+.I 追加
+はスキャナを遅く
+.I しません!
+スキャナの速度は、ルール数とも、
+オペレータ '*' や '|' といったものに基づくルールの複雑さ
+(この節の始めで扱いました)とも独立です。
+.\" 括弧内自信無しです
.\" Apr 29 1997, horikawa@jp.freebsd.org
.PP
-ºÇ¸å¤Î¹â®²½¤ÎÎã¤Ç¤¹:
-1 ¹Ô¤Ë 1 ¤Ä¤º¤Ä¤Ç¤¢¤êÊ̤Îʸ»ú¤ÏÉÕ¤«¤Ê¤¤¤è¤¦¤Ê¡¢
-¼±Ê̻Ҥȥ¡¼¥ï¡¼¥É¤òÁ´¤Æ¥Õ¥¡¥¤¥ë¤«¤é¥¹¥¥ã¥ó¤¹¤ë¤³¤È¤ò¹Í¤¨¤Þ¤¹¡£
-ºÇ½é¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦:
+最後の高速化の例です:
+1 行に 1 つずつであり別の文字は付かないような、
+識別子とキーワードを全てファイルからスキャンすることを考えます。
+最初は次のようになるでしょう:
.nf
%%
.|\\n /* it's not a keyword */
.fi
-¸åÌá¤ê¤òÈò¤±¤ë¤¿¤á¤ËÁ´¤Æ¤òÊá¤Þ¤¨¤ë¥ë¡¼¥ë¤òƳÆþ¤·¤Þ¤¹:
+後戻りを避けるために全てを捕まえるルールを導入します:
.nf
%%
.|\\n /* it's not a keyword */
.fi
-1 ¹Ô¤ËÀµ³Î¤Ë 1 ¸ì¤À¤±¤¢¤ë¤³¤È¤¬Êݾڤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢
-²þ¹Ô¤Îǧ¼±¤òÊ̤Υȡ¼¥¯¥ó¤ÈÊ»¤»¤ë¤³¤È¤Ç¡¢
-¥Þ¥Ã¥Á¤ÎÁí¿ô¤òȾʬ¤Ë¸º¤é¤¹¤³¤È¤¬½ÐÍè¤Þ¤¹:
+1 行に正確に 1 語だけあることが保証されている場合、
+改行の認識を別のトークンと併せることで、
+マッチの総数を半分に減らすことが出来ます:
.nf
%%
.|\\n /* it's not a keyword */
.fi
-¤³¤³¤Ç¡¢ºÆÅ٥Х寥¢¥Ã¥×¤ò¥¹¥¥ã¥Ê¤ËÁȤ߹þ¤ó¤À¤³¤È¤Ë
-µ¤¤òÉÕ¤±¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
-¼ÂºÝ
-.I ²æ¡¹¤Ï
-ÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¥ì¥¿¡¼¤È²þ¹Ô¤À¤±¤Ç¤¢¤ë¤³¤È¤òÃΤäƤ¤¤Þ¤¹¤¬¡¢
+ここで、再度バックアップをスキャナに組み込んだことに
+気を付けなければなりません。
+実際
+.I 我々は
+入力ストリームはレターと改行だけであることを知っていますが、
.I flex
-¤Ï¤³¤ì¤¬Ê¬¤«¤é¤Ê¤¤¤¿¤á¡¢
-¥È¡¼¥¯¥ó "auto" ¤Ê¤É¤ò¥¹¥¥ã¥ó¤·¤¿¼¡¤Îʸ»ú¤¬²þ¹Ô¤Ç¤â¥ì¥¿¡¼¤Ç¤â¤Ê¤¤¾ì¹ç¤Ë¤Ï
-¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬É¬ÍפǤ¢¤ë¤È¹Í¤¨¤Þ¤¹¡£
-°ÊÁ°¤Ï "auto" ¥ë¡¼¥ë¤ËŬ¹ç¤·¤½¤ì¤Ç½ª¤ê¤Ç¤·¤¿¤¬¡¢
-º£¤Ï "auto" ¥ë¡¼¥ë¤Ï̵¤¯¡¢"auto\\n" ¥ë¡¼¥ë¤À¤±¤¬¤¢¤ê¤Þ¤¹¡£
-¥Ð¥Ã¥¯¥¢¥Ã¥×¤Î²ÄǽÀ¤ò½üµî¤¹¤ë¤¿¤á¤Ë¤Ï¡¢
-ºÇ¸å¤Î²þ¹Ô°Ê³°¤Î¥ë¡¼¥ë¤òÆó½Å²½¤¹¤ë¤«¡¢
-¤½¤Î¤è¤¦¤ÊÆþÎϤ˽Ф¯¤ï¤µ¤Ê¤¤¤Î¤ÇʬÎà¤ÏÉÔÍפÈʬ¤«¤Ã¤Æ¤¤¤ë¤¿¤á¡¢
-²þ¹Ô¤òƳÆþ¤·¤Ê¤¤¤â¤¦°ì¤Ä¤ÎÁ´¤Æ¤òÊá¤Þ¤¨¤ë¥ë¡¼¥ë¤òƳÆþ¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹:
+はこれが分からないため、
+トークン "auto" などをスキャンした次の文字が改行でもレターでもない場合には
+バックアップが必要であると考えます。
+以前は "auto" ルールに適合しそれで終りでしたが、
+今は "auto" ルールは無く、"auto\\n" ルールだけがあります。
+バックアップの可能性を除去するためには、
+最後の改行以外のルールを二重化するか、
+そのような入力に出くわさないので分類は不要と分かっているため、
+改行を導入しないもう一つの全てを捕まえるルールを導入することが出来ます:
.nf
%%
.fi
.B \-Cf
-¤òÉÕ¤±¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¡¢¼ÂºÝÌäÂê¾å
+を付けてコンパイルすると、実際問題上
.I flex
-¤ÇÆÀ¤é¤ì¤ë¤Û¤ÜºÇ®¤Ë¤Ê¤ê¤Þ¤¹¡£
+で得られるほぼ最速になります。
.PP
-ºÇ¸å¤ÎÃí°Õ»ö¹à:
+最後の注意事項:
.I flex
-¤Ï NUL ¤Ë¥Þ¥Ã¥Á¤¹¤ë»þ¤Ë¤ÏÃÙ¤¯¡¢¥È¡¼¥¯¥ó¤¬Ê£¿ô¤Î NUL ¤ò´Þ¤à»þ¤Ë¤ÏÆäËÃÙ¤¤¤Ç¤¹¡£
-¥Æ¥¥¹¥È¤¬¤·¤Ð¤·¤Ð NUL ¤ò´Þ¤à¤â¤Î¤ÈͽÁÛ¤µ¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢¥Æ¥¥¹¥È¤Î
-.I û¤¤
-Éôʬ¤È¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ë¥ë¡¼¥ë¤ò½ñ¤¯¤Ù¤¤Ç¤¹¡£
+は NUL にマッチする時には遅く、トークンが複数の NUL を含む時には特に遅いです。
+テキストがしばしば NUL を含むものと予想される場合には、テキストの
+.I 短い
+部分とマッチするようにルールを書くべきです。
.PP
-¤â¤¦°ì¤Ä¤ÎÀǽ¤Ë´Ø¤¹¤ëºÇ½ªÃí°Õ»ö¹à:
-ÆþÎϤΥޥåÁÊýË¡¤ÎÀá¤Ç´û¤Ë¼¨¤·¤¿¤è¤¦¤Ë¡¢
-Â礤ʥȡ¼¥¯¥ó¤òǼ¤á¤ë¤¿¤á¤Ë
+もう一つの性能に関する最終注意事項:
+入力のマッチ方法の節で既に示したように、
+大きなトークンを納めるために
.B yytext
-¤Î¥µ¥¤¥º¤òưŪ¤ËÊѹ¹¤¹¤ë¤È½èÍý¤¬ÃÙ¤¯¤Ê¤ê¤Þ¤¹¡£
-¤Ê¤¼¤Ê¤é¡¢(µðÂç¤Ê)¥È¡¼¥¯¥ó¤òºÆÅÙÀèƬ¤«¤é¥¹¥¥ã¥ó¤·¤Ê¤ª¤µ¤Í¤Ð¤Ê¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£
-Àǽ¤¬½ÅÍפʾì¹ç¡¢
-¥Æ¥¥¹¥È¤Î "Â礤Ê" Éôʬ¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¤Ù¤¤Ç¤¹¤¬ "µðÂç¤Ê" Éôʬ¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë
-¤Ù¤¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
-ξ¼Ô¤ÎºæÌÜ¤Ï 8K ʸ»ú/¥È¡¼¥¯¥ó¤Ç¤¹¡£
-.SH C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®
-.I flex
-¤Ï 2 Ä̤ê¤Î C++ ¥¹¥¥ã¥ÊÀ¸À®ÊýË¡¤òÄ󶡤·¤Þ¤¹¡£
-ºÇ½é¤ÎÊýË¡¤Ï
-.I flex
-¤¬À¸À®¤·¤¿¥¹¥¥ã¥Ê¤òñ¤Ë C ¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¤Ê¤¯ C++ ¥³¥ó¥Ñ¥¤¥é¤Ç
-¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¤¤¤¦¤â¤Î¤Ç¤¹¡£
-¤³¤Î¾ì¹ç¥³¥ó¥Ñ¥¤¥ë¥¨¥é¡¼¤Ë¤Ï½Ð²ñ¤ï¤Ê¤¤¤Ï¤º¤Ç¤¹
-(¸«ÉÕ¤±¤¿¾ì¹ç¤Ë¤Ïºî¼Ô¤ÎÀá¤Ç¸å½Ò¤¹¤ëÅŻҥ᡼¥ë¥¢¥É¥ì¥¹¤ËÊó¹ð¤·¤Æ²¼¤µ¤¤)¡£
-¤³¤Î¾ì¹ç¥ë¡¼¥ë¤Ë¤ª¤¤¤Æ C ¥³¡¼¥É¤Ç¤Ï¤Ê¤¯ C++ ¥³¡¼¥É¤ò½ñ¤¯¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
-¥¹¥¥ã¥Ê¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆþÎϸµ¤Ï
+のサイズを動的に変更すると処理が遅くなります。
+なぜなら、(巨大な)トークンを再度先頭からスキャンしなおさねばならないからです。
+性能が重要な場合、
+テキストの "大きな" 部分にマッチさせるべきですが "巨大な" 部分にマッチさせる
+べきではありません。
+両者の堺目は 8K 文字/トークンです。
+.SH C++ スキャナの生成
+.I flex
+は 2 通りの C++ スキャナ生成方法を提供します。
+最初の方法は
+.I flex
+が生成したスキャナを単に C コンパイラではなく C++ コンパイラで
+コンパイルするというものです。
+この場合コンパイルエラーには出会わないはずです
+(見付けた場合には作者の節で後述する電子メールアドレスに報告して下さい)。
+この場合ルールにおいて C コードではなく C++ コードを書くことが出来ます。
+スキャナのデフォルトの入力元は
.I yyin
-¤Î¤Þ¤Þ¤Ç¤¢¤ê¡¢
-¥Ç¥Õ¥©¥ë¥È¤Î¥¨¥³¡¼Àè¤Ï
+のままであり、
+デフォルトのエコー先は
.I yyout
-¤Î¤Þ¤Þ¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
-¤É¤Á¤é¤â
+のままであることに注意して下さい。
+どちらも
.I FILE *
-ÊÑ¿ô¤Î¤Þ¤Þ¤Ç¤¢¤ê¡¢C++
+変数のままであり、C++
.I streams
-¤Ç¤Ï¤Ê¤¤¤Ç¤¹¡£
+ではないです。
.PP
.I flex
-¤Ë C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÀ¸À®¤µ¤»¤ë¤³¤È¤â½ÐÍè¤Þ¤¹¡£
+に C++ スキャナクラスを生成させることも出来ます。
.B \-+
-¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë(¤â¤·¤¯¤ÏÅù²ÁŪ¤Ë
+オプションを指定する(もしくは等価的に
.B %option c++
-¤ò»È¤¦)¤È¤³¤Î¤è¤¦¤Ë¼Â¹Ô¤µ¤ì¡¢
-flex ¤Î¼Â¹Ô·Á¼°Ì¾¤¬ '+' ¤Ç½ª¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¼«Æ°Åª¤Ë»ØÄꤵ¤ì¤Þ¤¹¡£
-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È flex ¤¬À¸À®¤¹¤ë¥¹¥¥ã¥Ê¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¥Õ¥¡¥¤¥ë
+を使う)とこのように実行され、
+flex の実行形式名が '+' で終っている場合には自動的に指定されます。
+このオプションを指定すると flex が生成するスキャナのデフォルトはファイル
.B lex.yy.cc
-¤È¤Ê¤ê
+となり
.B lex.yy.c
-¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
-À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ï
-2 ¤Ä¤Î C++ ¥¯¥é¥¹¤È¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄêµÁ¤¹¤ë¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë
+ではありません。
+生成されたスキャナは
+2 つの C++ クラスとのインタフェースを定義するヘッダファイル
.I FlexLexer.h
-¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Þ¤¹¡£
+をインクルードします。
.PP
-ºÇ½é¤Î¥¯¥é¥¹
+æ\9c\80å\88\9dã\81®ã\82¯ã\83©ã\82¹
.B FlexLexer
-¤Ï°ìÈÌŪ¤Ê¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÄêµÁ¤¹¤ëÃê¾Ý´ðÈ×¥¯¥é¥¹¤òÄ󶡤·¤Þ¤¹¡£
-°Ê²¼¤Î¥á¥ó¥Ð´Ø¿ô¤òÄ󶡤·¤Þ¤¹:
+は一般的なスキャナクラスを定義する抽象基盤クラスを提供します。
+以下のメンバ関数を提供します:
.TP
.B const char* YYText()
-ºÇ¸å¤Ë¥Þ¥Ã¥Á¤·¤¿¥Æ¥¥¹¥È¤òÊÖ¤·¤Þ¤¹¡£
+最後にマッチしたテキストを返します。
.B yytext
-¤ÈÅù²Á¤Ç¤¹¡£
+と等価です。
.TP
.B int YYLeng()
-ºÇ¸å¤Ë¥Þ¥Ã¥Á¤·¤¿¥È¡¼¥¯¥ó¤ÎŤµ¤òÊÖ¤·¤Þ¤¹¡£
+最後にマッチしたトークンの長さを返します。
.B yyleng
-¤ÈÅù²Á¤Ç¤¹¡£
+と等価です。
.TP
.B int lineno() const
-¸½ºß¤ÎÆþÎϤιÔÈÖ¹æ(
+現在の入力の行番号(
.B %option yylineno
-»²¾È)¤â¤·¤¯¤Ï
+参照)もしくは
.B %option yylineno
-¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï
+を使用していない場合には
.B 1
-¤òÊÖ¤·¤Þ¤¹¡£
+を返します。
.TP
.B void set_debug( int flag )
-¥¹¥¥ã¥Ê¤Î¥Ç¥Ð¥Ã¥°¥Õ¥é¥°¤ò¥»¥Ã¥È¤·¤Þ¤¹¡£
+スキャナのデバッグフラグをセットします。
.B yy_flex_debug
-¤ËÂåÆþ¤¹¤ë¤Î¤ÈƱ¤¸¤Ç¤¹(¥ª¥×¥·¥ç¥ó¤ÎÀá¤ÇÁ°½Ò)¡£
-¥¹¥¥ã¥Ê¹½ÃÛ»þ¤Ë
+に代入するのと同じです(オプションの節で前述)。
+スキャナ構築時に
.B %option debug
-¤ò»ÈÍѤ·¤Æ¥Ç¥Ð¥Ã¥°¾ðÊó¤òÁȤ߹þ¤àɬÍפ¬¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
+を使用してデバッグ情報を組み込む必要があることに注意して下さい。
.TP
.B int debug() const
-¸½ºß¤Î¥Ç¥Ð¥Ã¥°¥Õ¥é¥°¤ÎÀßÄê¤òÊÖ¤·¤Þ¤¹¡£
+現在のデバッグフラグの設定を返します。
.PP
-¤Þ¤¿¼¡¤Î¤â¤Î¤ÈÅù²Á¤Ê¥á¥ó¥Ð´Ø¿ô¤âÄ󶡤µ¤ì¤Þ¤¹
+また次のものと等価なメンバ関数も提供されます
.B yy_switch_to_buffer(),
.B yy_create_buffer()
-(ºÇ½é¤Î°ú¿ô¤Ï
+(最初の引数は
.B istream*
-¥ª¥Ö¥¸¥§¥¯¥È¥Ý¥¤¥ó¥¿¤Ç¤¢¤ê
+オブジェクトポインタであり
.B FILE*
-¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó),
+ではありません),
.B yy_flush_buffer(),
.B yy_delete_buffer(),
.B yyrestart()
-(¤³¤ì¤â¤Þ¤¿ºÇ½é¤Î°ú¿ô¤Ï
+(これもまた最初の引数は
.B istream*
-¥ª¥Ö¥¸¥§¥¯¥È¥Ý¥¤¥ó¥¿¤Ç¤¹)¡£
+オブジェクトポインタです)。
.PP
-2 ÈÖÌܤΥ¯¥é¥¹¤Ï
+2 番目のクラスは
.I FlexLexer.h
-¤ÇÄêµÁ¤µ¤ì¤ë
+で定義される
.B yyFlexLexer
-¤Ç¤¢¤ê¡¢
+であり、
.B FlexLexer
-¤«¤éƳ½Ð¤·¤¿¤â¤Î¤Ç¤¹¡£
-°Ê²¼¤ÎÄɲäΥá¥ó¥Ð´Ø¿ô¤òÄêµÁ¤·¤Þ¤¹:
+から導出したものです。
+以下の追加のメンバ関数を定義します:
.TP
.B
yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 )
-Í¿¤¨¤é¤ì¤¿Æþ½ÐÎÏ¥¹¥È¥ê¡¼¥à¤ò»È¤¦
+与えられた入出力ストリームを使う
.B yyFlexLexer
-¥ª¥Ö¥¸¥§¥¯¥È¤ò¹½ÃÛ¤·¤Þ¤¹¡£
-»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ë¤Ï¤½¤ì¤¾¤ì¥¹¥È¥ê¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È
+オブジェクトを構築します。
+指定しない場合にはそれぞれストリームのデフォルト
.B cin
-¤È
+と
.B cout
-¤Ë¤Ê¤ê¤Þ¤¹¡£
+になります。
.TP
.B virtual int yylex()
-¤³¤ì¤Ï
+これは
.B yylex()
-¤¬Ä̾ï¤Î flex ¥¹¥¥ã¥Ê¤ËÂФ·¤Æ¹Ô¤Ã¤¿¤Î¤ÈƱÍͤÎÌò³ä¤òô¤¤¤Þ¤¹:
-¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤¬ÃͤòÊÖ¤¹¤Þ¤Ç¡¢
-ÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò¥¹¥¥ã¥ó¤·¡¢¥È¡¼¥¯¥ó¤ò¾ÃÈñ¤·¤Þ¤¹¡£
+が通常の flex スキャナに対して行ったのと同様の役割を担います:
+ルールのアクションが値を返すまで、
+入力ストリームをスキャンし、トークンを消費します。
.B yyFlexLexer
-¤«¤é¥µ¥Ö¥¯¥é¥¹
+ã\81\8bã\82\89ã\82µã\83\96ã\82¯ã\83©ã\82¹
.B S
-¤òƳ½Ð¤·
+を導出し
.B yylex()
-¤«¤é
+から
.B S
-¤Î¥á¥ó¥Ð´Ø¿ô¤ª¤è¤ÓÊÑ¿ô¤ò¥¢¥¯¥»¥¹¤·¤¿¤¤¾ì¹ç¡¢
+のメンバ関数および変数をアクセスしたい場合、
.B %option yyclass="S"
-¤ò»ØÄꤷ¤Æ
+を指定して
.B yyFlexLexer
-¤Ç¤Ï¤Ê¤¯¥µ¥Ö¥¯¥é¥¹¤ò»ÈÍѤ¹¤ë¤³¤È¤ò
+ではなくサブクラスを使用することを
.I flex
-¤ËÃΤ餻¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
-¤³¤Î¾ì¹ç
+に知らせる必要があります。
+この場合
.B yyFlexLexer::yylex()
-¤òÀ¸À®¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢
+を生成するのではなく、
.I flex
-¤Ï
+は
.B S::yylex()
-(¤ª¤è¤Ó¸Æ¤Ó½Ð¤µ¤ì¤¿¤Ê¤é
+(および呼び出されたなら
.B yyFlexLexer::LexerError()
-¤ò¸Æ¤Ó½Ð¤¹¥À¥ß¡¼¤Î
+を呼び出すダミーの
.B yyFlexLexer::yylex()
-¤â)¤òÀ¸À®¤·¤Þ¤¹¡£
+も)を生成します。
.TP
.B
virtual void switch_streams(istream* new_in = 0,
.B
ostream* new_out = 0)
.B yyin
-¤ò
+を
.B new_in
-(Èó¥Ë¥ë¤Î¾ì¹ç)
-¤ËºÆ³äÅö¤·¡¢
+(非ニルの場合)
+に再割当し、
.B yyout
-¤ò
+を
.B new_out
-(ƱÍÍ)¤ËºÆ³äÅö¤·¤Þ¤¹¡£
+(同様)に再割当します。
.B yyin
-¤¬ºÆ³äÅö¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï°ÊÁ°¤ÎÆþÎϥХåե¡¤Ï¾Ãµî¤µ¤ì¤Þ¤¹¡£
+が再割当された場合には以前の入力バッファは消去されます。
.TP
.B
int yylex( istream* new_in, ostream* new_out = 0 )
-¤Þ¤ºÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò
+まず入力ストリームを
.B switch_streams( new_in, new_out )
-¤ò»ÈÍѤ·¤ÆÀÚ¤êÂؤ¨¡¢
+を使用して切り替え、
.B yylex()
-¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
+の値を返します。
.PP
-¤µ¤é¤Ë¡¢
+さらに、
.B yyFlexLexer
-¤Ï¼¡¤Î¥×¥í¥Æ¥¯¥È¤µ¤ì¤¿²¾ÁÛ´Ø¿ô¤òÄêµÁ¤·¤Þ¤¹¡£
-¥¹¥¥ã¥Ê¤Ë¤¢¤ï¤»¤Æ¤³¤ì¤é¤òƳ½Ð¥¯¥é¥¹¤Ë¤ª¤¤¤ÆºÆÄêµÁ½ÐÍè¤Þ¤¹:
+は次のプロテクトされた仮想関数を定義します。
+スキャナにあわせてこれらを導出クラスにおいて再定義出来ます:
.TP
.B
virtual int LexerInput( char* buf, int max_size )
-ºÇÂç
+最大
.B max_size
-ʸ»ú¤ò
+文字を
.B buf
-¤ËÆɤ߹þ¤ß¡¢Æɤ᤿ʸ»ú¿ô¤òÊÖ¤·¤Þ¤¹¡£
-ÆþÎϤνª¤ê¤ò¼¨¤¹¤Ë¤Ï 0 ʸ»ú¤òÊÖ¤·¤Þ¤¹¡£"ÂÐÏÃŪ" ¥¹¥¥ã¥Ê(
+に読み込み、読めた文字数を返します。
+入力の終りを示すには 0 文字を返します。"対話的" スキャナ(
.B \-B
-¤È
+と
.B \-I
-¥Õ¥é¥°¤ò»²¾È)¤Ï¥Þ¥¯¥í
+フラグを参照)はマクロ
.B YY_INTERACTIVE
-¤òÄêµÁ¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
+を定義することに注意して下さい。
.B LexerInput()
-¤òºÆÄêµÁ¤·¡¢
-ÂÐÏÃŪ¤ÊÆþÎϸµ¤ò¥¹¥¥ã¥ó¤¹¤ë²ÄǽÀ¤¬¤¢¤ë¤«¤É¤¦¤«¤Ë°Í¸¤·¤Æ
-°Û¤Ê¤ë¥¢¥¯¥·¥ç¥ó¤¬É¬ÍפȤʤë¾ì¹ç¡¢
-¤³¤Î̾Á°¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Î¥Æ¥¹¥È¤Ï
+を再定義し、
+対話的な入力元をスキャンする可能性があるかどうかに依存して
+異なるアクションが必要となる場合、
+この名前が存在するかどうかのテストは
.B #ifdef
-¤Ë¤Æ²Äǽ¤Ç¤¹¡£
+にて可能です。
.TP
.B
virtual void LexerOutput( const char* buf, int size )
.B size
-ʸ»ú¤ò¥Ð¥Ã¥Õ¥¡
+æ\96\87å\97ã\82\92ã\83\90ã\83\83ã\83\95ã\82¡
.B buf
-¤«¤é½ñ¤½Ð¤·¤Þ¤¹¡£
-¥¹¥¥ã¥Ê¤Î¥ë¡¼¥ë¤¬ NUL ¤ò´Þ¤à¥Æ¥¥¹¥È¤Ë¥Þ¥Ã¥Á²Äǽ¤Ê¾ì¹ç¡¢
-NUL ½ªÃ¼¤µ¤ì¤Æ¤¤¤ë¤³¤Î¥Ð¥Ã¥Õ¥¡¤Ï "ÆâÉô¤Ë" NUL ¤ò´Þ¤ó¤Ç¤¤¤Æ¤â¹½¤¤¤Þ¤»¤ó¡£
+から書き出します。
+スキャナのルールが NUL を含むテキストにマッチ可能な場合、
+NUL 終端されているこのバッファは "内部に" NUL を含んでいても構いません。
.TP
.B
virtual void LexerError( const char* msg )
-Ã×̿Ū¤Ê¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÊó¹ð¤·¤Þ¤¹¡£
-¥Ç¥Õ¥©¥ë¥È¤Î¤³¤Î´Ø¿ô¤Ï¥á¥Ã¥»¡¼¥¸¤ò¥¹¥È¥ê¡¼¥à
+致命的なエラーメッセージを報告します。
+デフォルトのこの関数はメッセージをストリーム
.B cerr
-¤Ë½ñ¤¡¢½ªÎ»¤·¤Þ¤¹¡£
+に書き、終了します。
.PP
.B yyFlexLexer
-¥ª¥Ö¥¸¥§¥¯¥È¤Ï
-.I Á´¤Æ¤Î
-¥¹¥¥ã¥ó»þ¤Î¾õÂÖ¤ò´Þ¤à¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
-¤½¤ì¤æ¤¨¤³¤ÎÍͤʥª¥Ö¥¸¥§¥¯¥È¤ò¥ê¥¨¥ó¥È¥é¥ó¥È¤Ê¥¹¥¥ã¥Ê¤È¤·¤Æ»ÈÍѤǤ¤Þ¤¹¡£
-Ʊ°ì¤Î
+オブジェクトは
+.I 全ての
+スキャン時の状態を含むことに注意して下さい。
+それゆえこの様なオブジェクトをリエントラントなスキャナとして使用できます。
+同一の
.B yyFlexLexer
-¥¯¥é¥¹¤ÎÊ£¿ô¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¶ñÂβ½²Äǽ¤Ç¤¢¤ê¡¢
-Ê£¿ô¤Î C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÁȤ߹ç¤ï¤»¾åµ
+クラスの複数のインスタンスを具体化可能であり、
+複数の C++ スキャナクラスを組み合わせ上記
.B \-P
-¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤ÇƱ°ì¤Î¥×¥í¥°¥é¥à¤Ç»ÈÍѲÄǽ¤Ç¤¹¡£
+オプションを使用することで同一のプログラムで使用可能です。
.PP
-ºÇ¸å¤Ë
+最後に
.B %array
-µ¡Ç½¤Ï C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤Ç¤Ï»ÈÍѤǤ¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤;
+機能は C++ スキャナクラスでは使用できないことに注意して下さい;
.B %pointer
-¤ò»ÈÍѤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó(¥Ç¥Õ¥©¥ë¥È)¡£
+を使用しなければなりません(デフォルト)。
.PP
-ñ½ã¤Ê C++ ¥¹¥¥ã¥Ê¤ÎÎã¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹:
+単純な C++ スキャナの例を以下に示します:
.nf
// An example of using the flex C++ scanner class.
return 0;
}
.fi
-Ê£¿ô¤Î(°Û¤Ê¤Ã¤¿)»ú¶ç²òÀÏ¥¯¥é¥¹¤òÀ¸À®¤·¤¿¤¤¾ì¹ç¡¢
+複数の(異なった)字句解析クラスを生成したい場合、
.B \-P
-¥Õ¥é¥° (¤â¤·¤¯¤Ï
+フラグ (もしくは
.B prefix=
-¥ª¥×¥·¥ç¥ó) ¤ò»ÈÍѤ·¤Æ³Æ
+オプション) を使用して各
.B yyFlexLexer
-¤ò
+を
.B xxFlexLexer
-Åù¤ÎÊ̤Î̾Á°¤Ë¤·¤Þ¤¹¡£
-¼¡¤Ë»ú¶ç²òÀÏ¥¯¥é¥¹¤Î¥½¡¼¥¹¤´¤È¤Ë
+等の別の名前にします。
+次に字句解析クラスのソースごとに
.B <FlexLexer.h>
-¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Þ¤¹¡£
-°Ê²¼¤Î¤è¤¦¤Ë
+をインクルードします。
+以下のように
.B yyFlexLexer
-¤ò¥ê¥Í¡¼¥à¤·¤Þ¤¹:
+をリネームします:
.nf
#undef yyFlexLexer
#include <FlexLexer.h>
.fi
-¤³¤ì¤Ï¤¢¤ë¥¹¥¥ã¥Ê¤ËÂФ·
+これはあるスキャナに対し
.B %option prefix="xx"
-¤ò»ÈÍѤ·¤â¤¦°ìÊý¤ËÂФ·
+を使用しもう一方に対し
.B %option prefix="zz"
-¤ò»ÈÍѤ·¤¿¾ì¹ç¤Ç¤¹¡£
+を使用した場合です。
.PP
-½ÅÍ×: ¸½ºß¤Î¥¹¥¥ã¥ó¥¯¥é¥¹¤Î·Á¼°¤Ï
-.I ¼Â¸³Åª
-¤Ç¤¢¤ê¡¢¥á¥¸¥ã¡¼¥ê¥ê¡¼¥¹¤¬ÊѤï¤ë¤ÈÂ礤¯Êѹ¹¤µ¤ì¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
-.SH LEX ¤ª¤è¤Ó POSIX ¤È¤ÎÈó¸ß´¹À
+重要: 現在のスキャンクラスの形式は
+.I 実験的
+であり、メジャーリリースが変わると大きく変更される可能性があります。
+.SH LEX および POSIX との非互換性
.I flex
-¤Ï AT&T Unix ¤Î
+は AT&T Unix の
.I lex
-¥Ä¡¼¥ë¤Î¥ê¥é¥¤¥È¤Ç¤¹¤¬(2 ¤Ä¤Î¼ÂÁõ¤Ï¤¤¤«¤Ê¤ë¥³¡¼¥É¤â¶¦Í¤·¤Þ¤»¤ó)¡¢
-¤¤¤¯¤Ð¤¯¤«¤Î³ÈÄ¥¤ÈÈó¸ß´¹À¤ò»ý¤Ã¤Æ¤ª¤ê¡¢
-¤É¤Á¤é¤Î¼ÂÁõ¤Ç¤â¼õÍý²Äǽ¤Ê¥¹¥¥ã¥Ê¤ò½ñ¤¤¿¤¤Êý¤Ï
-¤³¤ì¤ò°Õ¼±¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
-flex ¤Ï POSIX
+ツールのリライトですが(2 つの実装はいかなるコードも共有しません)、
+いくばくかの拡張と非互換性を持っており、
+どちらの実装でも受理可能なスキャナを書きたい方は
+これを意識しなければなりません。
+flex は POSIX
.I lex
-»ÅÍͤ˴°Á´¹çÃפ·¤Þ¤¹¤¬¡¢Îã³°¤Ï
+仕様に完全合致しますが、例外は
.B %pointer
-(¥Ç¥Õ¥©¥ë¥È)»ÈÍѤÈ
+(デフォルト)使用と
.B unput()
-¸Æ¤Ó½Ð¤·¤Ë¤è¤ê
+呼び出しにより
.B yytext
-¤ÎÆâÍƤòÇ˲õ¤¹¤ë¤³¤È¤Ç¤¢¤ê¡¢¤³¤ì¤Ï POSIX »ÅÍͤËÈ¿¤·¤Þ¤¹¡£
+の内容を破壊することであり、これは POSIX 仕様に反します。
.PP
-¤³¤ÎÀá¤Ç¤Ï¡¢
-flex ¤È AT&T lex ¤È POSIX »ÅÍͤȤδ֤ÎÁ´¤Æ¤Î´ûÃΤÎÈó¸ß´¹À¤ò°·¤¤¤Þ¤¹¡£
+この節では、
+flex と AT&T lex と POSIX 仕様との間の全ての既知の非互換性を扱います。
.PP
.I flex
-¤Î
+の
.B \-l
-¥ª¥×¥·¥ç¥ó¤Ï¥ª¥ê¥¸¥Ê¥ë¤Î AT&T
+オプションはオリジナルの AT&T
.I lex
-¼ÂÁõ¤È¤ÎºÇÂç¤Î¸ß´¹À¤ò͸ú¤Ë¤·¤Þ¤¹¤¬¡¢
-À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ÎÀǽ¤ÏÂ礤¯Äã²¼¤·¤Þ¤¹¡£
+実装との最大の互換性を有効にしますが、
+生成されたスキャナの性能は大きく低下します。
.B \-l
-¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤âȯÀ¸¤·¤¦¤ëÈó¸ß´¹À¤Ï¸å¤Ç½Ò¤Ù¤Þ¤¹¡£
+オプションを使用しても発生しうる非互換性は後で述べます。
.PP
.I flex
-¤Ï°Ê²¼¤ÎÎã³°¤ò½ü¤
+は以下の例外を除き
.I lex
-¤È´°Á´¸ß´¹¤Ç¤¹:
+と完全互換です:
.IP -
-¥É¥¥å¥á¥ó¥È¤ËµºÜ¤µ¤ì¤Æ¤¤¤Ê¤¤
+ドキュメントに記載されていない
.I lex
-¥¹¥¥ã¥ÊÆâÉô¤ÎÊÑ¿ô
+スキャナ内部の変数
.B yylineno
-¤Ï
+は
.B \-l
-¤â¤·¤¯¤Ï
+もしくは
.B %option yylineno
-¤ò»ÈÍѤ·¤Ê¤¤¤È¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£
+を使用しないとサポートされません。
.IP
.B yylineno
-¤Ï¥¹¥¥ã¥ÊËè(ñ°ì¤Î¥°¥í¡¼¥Ð¥ëÊÑ¿ô)¤Ç¤Ï¤Ê¤¯¡¢¥Ð¥Ã¥Õ¥¡Ëè¤Ë´ÉÍý¤µ¤ì¤ë¤Ù¤¤Ç¤¹¡£
+はスキャナ毎(単一のグローバル変数)ではなく、バッファ毎に管理されるべきです。
.IP
.B yylineno
-¤Ï POSIX »ÅÍͤǤϤ¢¤ê¤Þ¤»¤ó¡£
+は POSIX 仕様ではありません。
.IP -
.B input()
-¥ë¡¼¥Á¥ó¤ÏºÆÄêµÁ¤Ç¤¤Þ¤»¤ó¤¬¡¢
-¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤·¤¿¤â¤Î¤Ë¸å³¤¹¤ëʸ»ú¤òÆɤि¤á¤Ë¸Æ¤Ð¤ì¤¨¤Þ¤¹¡£
+ルーチンは再定義できませんが、
+ルールにマッチしたものに後続する文字を読むために呼ばれえます。
.B input()
-¤¬¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤ËÅþ㤹¤ë¤È¡¢Ä̾ï¤Î
+がファイルの終りに到達すると、通常の
.B yywrap()
-½èÍý¤Ï½ªÎ»¤·¤Þ¤¹¡£``¼ÂºÝ¤Î'' ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Ï
+処理は終了します。``実際の'' ファイルの終りは
.I EOF
-¤È¤·¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£
+として返されます。
.IP
-¼ÂºÝ¤Ë¤ÏÆþÎϤÏ
+実際には入力は
.B YY_INPUT
-¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤êÀ©¸æ¤µ¤ì¤Þ¤¹¡£
+マクロを定義することにより制御されます。
.IP
.B input()
-¤òºÆÄêµÁ¤Ç¤¤Ê¤¤¤È¤¤¤¦
+を再定義できないという
.I flex
-¤ÎÀ©¸Â¤Ï¡¢ºÇ½é¤Ë
+の制限は、最初に
.I yyin
-¤òÀßÄꤹ¤ë°Ê³°¤Î¥¹¥¥ã¥ÊÆþÎÏÀ©¸æÊýË¡¤òñ¤Ëµ¬Äꤷ¤Æ¤¤¤Ê¤¤¤È¤¤¤¦¡¢
-POSIX »ÅÍͤȹçÃפ·¤Þ¤¹¡£
+を設定する以外のスキャナ入力制御方法を単に規定していないという、
+POSIX 仕様と合致します。
.IP -
.B unput()
-¥ë¡¼¥Á¥ó¤ÏºÆÄêµÁ¤Ç¤¤Þ¤»¤ó¡£¤³¤ÎÀ©¸Â¤Ï POSIX ¤Ë¹çÃפ·¤Æ¤¤¤Þ¤¹¡£
+ルーチンは再定義できません。この制限は POSIX に合致しています。
.IP -
.I flex
-¥¹¥¥ã¥Ê¤Ï
+スキャナは
.I lex
-¥¹¥¥ã¥Ê¤È¤Ï°Û¤Ê¤ê¥ê¥¨¥ó¥È¥é¥ó¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
-¼ÂºÝ¡¢ÂÐÏÃŪ¤Ê¥¹¥¥ã¥Ê¤Ë¤ª¤¤¤Æ¡¢
-³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é¤Ë¤Æ¥í¥ó¥°¥¸¥ã¥ó¥×¤òÍѤ¤¤Æ¥¹¥¥ã¥Ê¤«¤éæ½Ð¤·¡¢
-¤½¤Î¸å¥¹¥¥ã¥Ê¤òºÆÅٸƤӽФ¹¾ì¹ç¡¢°Ê²¼¤Î¥á¥Ã¥»¡¼¥¸¤òÆÀ¤ë¤Ç¤·¤ç¤¦:
+スキャナとは異なりリエントラントではありません。
+実際、対話的なスキャナにおいて、
+割り込みハンドラにてロングジャンプを用いてスキャナから脱出し、
+その後スキャナを再度呼び出す場合、以下のメッセージを得るでしょう:
.nf
fatal flex scanner internal error--end of buffer missed
.fi
-¥¹¥¥ã¥Ê¤ËºÆÅÙÆþ¤ë¤¿¤á¤Ë¤Ï¡¢¤Þ¤º°Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤
+スキャナに再度入るためには、まず以下のようにして下さい
.nf
yyrestart( yyin );
.fi
-¤³¤Î¸Æ¤Ó½Ð¤·¤Ë¤è¤êÆþÎϥХåե¡¤Ï¼Î¤Æ¤é¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤;
-Ä̾盧¤ì¤ÏÂÐÏÃŪ¥¹¥¥ã¥Ê¤Ç¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
+この呼び出しにより入力バッファは捨てられることに注意して下さい;
+通常これは対話的スキャナでは問題ではありません。
.IP
-¤Þ¤¿¡¢C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤Ï¥ê¥¨¥ó¥È¥é¥ó¥È
-.I ¤Ç¤¹
-¤Î¤Ç¡¢C++ ¤ò»ÈÍѤǤ¤ë¤Î¤Ê¤é¡¢C++ ¤ò»ÈÍѤ¹¤Ù¤¤Ç¤¹¡£
-Á°½Ò¤Î "C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®" ¤ò»²¾È¤·¤Æ²¼¤µ¤¤¡£
+また、C++ スキャナクラスはリエントラント
+.I です
+ので、C++ を使用できるのなら、C++ を使用すべきです。
+前述の "C++ スキャナの生成" を参照して下さい。
.IP -
.B output()
-¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£
+はサポートされていません。
.B ECHO
-¥Þ¥¯¥í¤«¤é¤Î½ÐÎϤϥե¡¥¤¥ë¥Ý¥¤¥ó¥¿
+ã\83\9eã\82¯ã\83ã\81\8bã\82\89ã\81®å\87ºå\8a\9bã\81¯ã\83\95ã\82¡ã\82¤ã\83«ã\83\9dã\82¤ã\83³ã\82¿
.I yyout
-(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï
-.I ɸ½à½ÐÎÏ
-)¤ËÂФ·¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£
+(デフォルトでは
+.I 標準出力
+)に対して行われます。
.IP
.B output()
-¤Ï POSIX »ÅÍͤˤϤ¢¤ê¤Þ¤»¤ó¡£
+は POSIX 仕様にはありません。
.IP -
.I lex
-¤ÏÇÓ¾Ū³«»Ï¾ò·ï (%x) ¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¤¬¡¢¤³¤ì¤Ï POSIX »ÅÍͤˤ¢¤ê¤Þ¤¹¡£
+は排他的開始条件 (%x) をサポートしませんが、これは POSIX 仕様にあります。
.IP -
-ÄêµÁ¤òŸ³«¤¹¤ë»þ¡¢
+定義を展開する時、
.I flex
-¤Ç¤Ï³ç¸Ì¤Ç³ç¤ê¤Þ¤¹¡£
-lex ¤Ç¤Ï°Ê²¼¤Ï:
+では括弧で括ります。
+lex では以下は:
.nf
NAME [A-Z][A-Z0-9]*
%%
.fi
-ʸ»úÎó "foo" ¤Ë¤Ï¥Þ¥Ã¥Á¤·¤Þ¤»¤ó¡£
-¤Ê¤¼¤Ê¤éŸ³«¤µ¤ì¤¿¥Þ¥¯¥í¤Ï¥ë¡¼¥ë "foo[A-Z][A-Z0-9]*?" ¤ÈÅù²Á¤Ë¤Ê¤ê¡¢
-Í¥ÀèÅÙ¤Ë¤Æ `?' ¤Ï "[A-Z0-9]*" ¤È·ë¤ÓÉÕ¤¤Þ¤¹¡£
+文字列 "foo" にはマッチしません。
+なぜなら展開されたマクロはルール "foo[A-Z][A-Z0-9]*?" と等価になり、
+優先度にて `?' は "[A-Z0-9]*" と結び付きます。
.I flex
-¤Ç¤Ï¥ë¡¼¥ë¤¬Å¸³«¤µ¤ì¤ë¤È "foo([A-Z][A-Z0-9]*)?" ¤È¤Ê¤ê¡¢
-ʸ»úÎó "foo" ¤¬¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
+ではルールが展開されると "foo([A-Z][A-Z0-9]*)?" となり、
+文字列 "foo" がマッチします。
.IP
.B ^
-¤Ç»Ï¤Þ¤ë¤«
+で始まるか
.B $
-¤Ç½ª¤ëÄêµÁ¤Ï¡¢Å¸³«»þ¤Ë³ç¸Ì¤Ç³ç¤é¤º¡¢
-¤³¤ì¤é¤Î¥ª¥Ú¥ì¡¼¥¿¤¬ÄêµÁ¤Ë¤ª¤¤¤ÆÆÃÊ̤ʰÕÌ£¤ò¼º¤ï¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ë
-Ãí°Õ¤·¤Æ²¼¤µ¤¤¡£
-¤·¤«¤·
+で終る定義は、展開時に括弧で括らず、
+これらのオペレータが定義において特別な意味を失わないようにすることに
+注意して下さい。
+しかし
.B <s>, /,
.B <<EOF>>
-¥ª¥Ú¥ì¡¼¥¿¤Ï
+オペレータは
.I flex
-¤ÎÄêµÁ¤Ç¤Ï»ÈÍѤǤ¤Þ¤»¤ó¡£
+の定義では使用できません。
.IP
.B \-l
-¤ò»ÈÍѤ¹¤ë¤È¡¢
+を使用すると、
.I lex
-¤Î¿¶Éñ¤¤¤ÈƱ¤¸¤¯ÄêµÁ¤ò³ç¸Ì¤Ç³ç¤ê¤Þ¤»¤ó¡£
+の振舞いと同じく定義を括弧で括りません。
.IP
-POSIX »ÅÍͤǤϡ¢ÄêµÁ¤ò³ç¸Ì¤Ç³ç¤ê¤Þ¤¹¡£
+POSIX 仕様では、定義を括弧で括ります。
.IP -
.I lex
-¤Î¼ÂÁõ¤Ë¤è¤Ã¤Æ¤Ï¡¢
-¥ë¡¼¥ë¤Î¥Ñ¥¿¡¼¥ó¤Î±¦Â¦¤Ë¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢
-¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤òÊ̤ιԤ«¤é»Ï¤á¤ë¤³¤È¤òµö¤·¤Þ¤¹:
+の実装によっては、
+ルールのパターンの右側に空白がある場合、
+ルールのアクションを別の行から始めることを許します:
.nf
%%
.fi
.I flex
-¤Ï¤³¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¡£
+はこの機能をサポートしません。
.IP -
.I lex
-¤Î
+の
.B %r
-(Ratfor ¥¹¥¥ã¥Ê¤ÎÀ¸À®)¥ª¥×¥·¥ç¥ó¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£
-¤³¤ì¤Ï POSIX »ÅÍͤˤϴޤޤì¤Þ¤»¤ó¡£
+(Ratfor スキャナの生成)オプションはサポートされていません。
+これは POSIX 仕様には含まれません。
.IP -
-¥¹¥¥ã¥Ê¤ò
+スキャナを
.B %array
-¤ò»ÈÍѤ·¤Æ¹½ÃÛ¤·¤¿¤Î¤Ç¤Ï¤Ê¤¤¸Â¤ê¡¢
+を使用して構築したのではない限り、
.B unput()
-¸Æ¤Ó½Ð¤·¸å¤Ë¤Ï¡¢¼¡¤Î¥È¡¼¥¯¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë¤Þ¤Ç
+呼び出し後には、次のトークンにマッチするまで
.I yytext
-¤Ï̤ÄêµÁ¤Ç¤¹¡£
-¤³¤ì¤Ï
+は未定義です。
+これは
.I lex
-¤Ë¤â POSIX »ÅÍͤˤâÅö¤Æ¤Ï¤Þ¤ê¤Þ¤»¤ó¡£
+にも POSIX 仕様にも当てはまりません。
.B \-l
-¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¤³¤ÎÈó¸ß´¹À¤ò¼è¤ê½ü¤¤Þ¤¹¡£
+オプションを指定するとこの非互換性を取り除きます。
.IP -
.B {}
-(¿ôÃÍÈÏ°Ï)¥ª¥Ú¥ì¡¼¥¿¤ÎÍ¥ÀèÅÙ¤¬°Û¤Ê¤ê¤Þ¤¹¡£
+(数値範囲)オペレータの優先度が異なります。
.I lex
-¤Ï "abc{1,3}" ¤ò "1 ÅÙ¤« 2 ÅÙ¤« 3 Å٤Π'abc' ¤Ë¥Þ¥Ã¥Á" ¤È²ò¼á¤·¤Þ¤¹¤¬¡¢
+は "abc{1,3}" を "1 度か 2 度か 3 度の 'abc' にマッチ" と解釈しますが、
.I flex
-¤Ï "'ab' ¤Ë 1 ÅÙ¤« 2 ÅÙ¤« 3 Å٤Π'c' ¤¬Â³¤¯¤â¤Î¤Ë¥Þ¥Ã¥Á" ¤È²ò¼á¤·¤Þ¤¹¡£
-¸å¼Ô¤¬ POSIX »ÅÍͤ˹çÃפ·¤Þ¤¹¡£
+は "'ab' に 1 度か 2 度か 3 度の 'c' が続くものにマッチ" と解釈します。
+後者が POSIX 仕様に合致します。
.IP -
.B ^
-¥ª¥Ú¥ì¡¼¥¿¤ÎÍ¥ÀèÅÙ¤¬°Û¤Ê¤ê¤Þ¤¹¡£
+オペレータの優先度が異なります。
.I lex
-¤Ï "^foo|bar" ¤ò "¹ÔƬ¤Î 'foo' ¤«Ç¤°Õ°ÌÃ֤Π'bar' ¤Ë¥Þ¥Ã¥Á" ¤È²ò¼á¤·¤Þ¤¹¤¬¡¢
+は "^foo|bar" を "行頭の 'foo' か任意位置の 'bar' にマッチ" と解釈しますが、
.I flex
-¤Ï "¹ÔƬ¤Î 'foo' ¤« 'bar' ¤Ë¥Þ¥Ã¥Á" ¤È²ò¼á¤·¤Þ¤¹¡£
-¸å¼Ô¤¬ POSIX »ÅÍͤ˹çÃפ·¤Þ¤¹¡£
+は "行頭の 'foo' か 'bar' にマッチ" と解釈します。
+後者が POSIX 仕様に合致します。
.IP -
.I lex
-¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë
+でサポートされている
.B %a
-Åù¤ÎÆÃÊ̤ʥơ¼¥Ö¥ë¥µ¥¤¥º¤ÎÀë¸À¤Ï
+等の特別なテーブルサイズの宣言は
.I flex
-¥¹¥¥ã¥Ê¤Ç¤ÏÉÔÍפǤ¹;
+スキャナでは不要です;
.I flex
-¤Ï¤³¤ì¤é¤ò̵»ë¤·¤Þ¤¹¡£
+はこれらを無視します。
.IP -
.I flex
-¤È
+と
.I lex
-¤Î¤É¤Á¤é¤Ç¤â¥¹¥¥ã¥Ê¤ò»ÈÍѲÄǽ¤Ë½ñ¤±¤ë¤è¤¦¤Ë¡¢
+のどちらでもスキャナを使用可能に書けるように、
.bd
FLEX_SCANNER
-¤È¤¤¤¦Ì¾Á°¤òÄêµÁ¤·¤Þ¤¹¡£
-¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤¿
+という名前を定義します。
+スキャナを生成した
.I flex
-¤Î¥Ð¡¼¥¸¥ç¥ó¤òɽ¤¹
+のバージョンを表す
.B YY_FLEX_MAJOR_VERSION
-¤È
+と
.B YY_FLEX_MINOR_VERSION
-¤ò¡¢¥¹¥¥ã¥Ê¤Ï´Þ¤ß¤Þ¤¹
-(Î㤨¤Ð 2.5 ¥ê¥ê¡¼¥¹¤Ç¤Ï¤³¤ì¤é¤Ï¤½¤ì¤¾¤ì 2 ¤È 5 ¤Ë¤Ê¤ê¤Þ¤¹)¡£
+を、スキャナは含みます
+(例えば 2.5 リリースではこれらはそれぞれ 2 と 5 になります)。
.PP
-°Ê²¼¤Î
+以下の
.I flex
-¤Îµ¡Ç½¤Ï
+の機能は
.I lex
-¤ª¤è¤Ó POSIX »ÅÍͤˤϴޤޤì¤Þ¤»¤ó:
+および POSIX 仕様には含まれません:
.nf
- C++ ¥¹¥¥ã¥Ê
+ C++ スキャナ
%option
- ³«»Ï¾ò·ï¥¹¥³¡¼¥×
- ³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯
- ÂÐÏÃŪ/ÈóÂÐÏÃŪ¥¹¥¥ã¥Ê
- yy_scan_string() Åù
+ 開始条件スコープ
+ é\96\8bå§\8bæ\9d¡ä»¶ã\82¹ã\82¿ã\83\83ã\82¯
+ 対話的/非対話的スキャナ
+ yy_scan_string() 等
yyterminate()
yy_set_interactive()
yy_set_bol()
YY_START
YY_USER_ACTION
YY_USER_INIT
- #line ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö
- ¥¢¥¯¥·¥ç¥ó¤Î¼þ¤ê¤Î %{}
- ñ°ì¹Ô¤Ë¤ª¤±¤ëÊ£¿ô¤Î¥¢¥¯¥·¥ç¥ó
+ #line ディレクティブ
+ アクションの周りの %{}
+ 単一行における複数のアクション
.fi
-¤µ¤é¤Ë¤Û¤ÜÁ´¤Æ¤Î flex ¥Õ¥é¥°¤Ç¤¹¡£
-¥ê¥¹¥È¤ÎºÇ¸å¤Îµ¡Ç½¤Î°ÕÌ£¤Ï¡¢
+さらにほぼ全ての flex フラグです。
+リストの最後の機能の意味は、
.I flex
-¤Ç¤ÏÊ£¿ô¤Î¥¢¥¯¥·¥ç¥ó¤ò¥»¥ß¥³¥í¥ó¤Ç¶èÀڤäÆƱ°ì¹Ô¤Ëµ½Ò²Äǽ¤Ç¤¹¤¬¡¢
+では複数のアクションをセミコロンで区切って同一行に記述可能ですが、
.I lex
-¤Ç¤Ï¼¡¤Î
+では次の
.nf
foo handle_foo(); ++num_foos_seen;
.fi
-¤Ï (¶Ã¤¯¤Ù¤¤³¤È¤Ë) ¼¡¤Î¤è¤¦¤ËÀÚ¤êµÍ¤á¤é¤ì¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
+は (驚くべきことに) 次のように切り詰められるということです。
.nf
foo handle_foo();
.fi
.I flex
-¤Ï¥¢¥¯¥·¥ç¥ó¤òÀÚ¤êµÍ¤á¤Þ¤»¤ó¡£
-¥Ö¥ì¡¼¥¹¤Ç³ç¤é¤ì¤Ê¤¤¥¢¥¯¥·¥ç¥ó¤Ïñ½ã¤Ë¹ÔËö¤Ç½ªÎ»¤·¤Þ¤¹¡£
-.SH ¿ÇÃÇ
+はアクションを切り詰めません。
+ブレースで括られないアクションは単純に行末で終了します。
+.SH 診断
.I warning, rule cannot be matched
-¾ï¤ËƱ¤¸¥Æ¥¥¹¥È¤Ë¥Þ¥Ã¥Á¤¹¤ë¥ë¡¼¥ë¤¬Á°¤Ë¤¢¤ë¤Î¤Ç¡¢
-Í¿¤¨¤é¤ì¤¿¥ë¡¼¥ë¤¬¥Þ¥Ã¥Á¤·¤Þ¤»¤ó¡£
-Î㤨¤Ð°Ê²¼¤Î "foo" ¤Ï "Á´¤Æ¤òÊá¤Þ¤¨¤ë" ¥ë¡¼¥ë¤Î¸å¤í¤Ë¤¢¤ê¤Þ¤¹¤Î¤Ç
-·è¤·¤Æ¥Þ¥Ã¥Á¤·¤Þ¤»¤ó:
+常に同じテキストにマッチするルールが前にあるので、
+与えられたルールがマッチしません。
+例えば以下の "foo" は "全てを捕まえる" ルールの後ろにありますので
+決してマッチしません:
.nf
[a-z]+ got_identifier();
foo got_foo();
.fi
-¥¹¥¥ã¥ÊÃæ¤Ç
+スキャナ中で
.B REJECT
-¤ò»ÈÍѤ¹¤ë¤È¤³¤Î·Ù¹ð¤òÍÞÀ©¤·¤Þ¤¹¡£
+を使用するとこの警告を抑制します。
.PP
.I warning,
.B \-s
.I
option given but default rule can be matched
-(¤ª¤½¤é¤¯¤¢¤ëÆÃÄê¤Î³«»Ï¾ò·ï¤Î¤â¤È¤Ç¤Ï)
-¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë (Ǥ°Õ¤Î°ìʸ»ú¤Ë¥Þ¥Ã¥Á¤¹¤ë) ¤·¤«ÆÃÄê¤ÎÆþÎϤË
-ÂФ·¤Æ¤Ï¥Þ¥Ã¥Á¤·¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
+(おそらくある特定の開始条件のもとでは)
+デフォルトルール (任意の一文字にマッチする) しか特定の入力に
+対してはマッチしないことがあります。
.B \-s
-¤ò»ØÄꤷ¤Æ¤¤¤ë¤Î¤Ç¡¢¤ª¤½¤é¤¯¤½¤¦¤Ê¤ê¤Þ¤»¤ó¡£
+を指定しているので、おそらくそうなりません。
.PP
.I reject_used_but_not_detected undefined
-¤¢¤ë¤¤¤Ï
+あるいは
.I yymore_used_but_not_detected undefined -
-¤³¤ì¤é¤Î¥¨¥é¡¼¤Ï ¥³¥ó¥Ñ¥¤¥ë»þ¤Ëµ¯¤¤Þ¤¹¡£¥¹¥¥ã¥Ê¤¬
+これらのエラーは コンパイル時に起きます。スキャナが
.B REJECT
-¤â¤·¤¯¤Ï
+もしくは
.B yymore()
-¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¤¬
+を使っていますが
.I flex
-¤¬¤½¤Î¤³¤È¤Ëµ¤¤Å¤«¤Ê¤«¤Ã¤¿¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
-¤Ä¤Þ¤ê¡¢
+がそのことに気づかなかったということです。
+つまり、
.I flex
-¤ÏºÇ½é¤Î 2 ¤Ä¤ÎÉôʬ¤òõ¤·¤Æ¤â
-¤³¤ì¤é¤Î¥¢¥¯¥·¥ç¥ó¤Î½Ð¸½¤ò¸«¤Ä¤±¤é¤ì¤Ê¤«¤Ã¤¿¤Î¤Ç¤¹¤¬¡¢
-¼ÂºÝ¤Ë¤Ï²¿¤é¤«¤ÎÊýË¡
-(Î㤨¤Ð #include ¥Õ¥¡¥¤¥ë¤ò²ð¤·¤Æ)¤Ç¤³¤ì¤é¤¬µ½Ò¤µ¤ì¤Æ¤¤¤¿¡¢¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
+は最初の 2 つの部分を探しても
+これらのアクションの出現を見つけられなかったのですが、
+実際には何らかの方法
+(例えば #include ファイルを介して)でこれらが記述されていた、ということです。
.B %option reject
-¤«
+か
.B %option yymore
-¤ò»ÈÍѤ·¤Æ¡¢flex ¤Ë¤³¤ì¤é¤Îµ¡Ç½¤ò¼ÂºÝ¤Ë»ÈÍѤ·¤Æ¤¤¤ë¤³¤È¤ò¶µ¤¨¤Æ²¼¤µ¤¤¡£
+を使用して、flex にこれらの機能を実際に使用していることを教えて下さい。
.PP
.I flex scanner jammed -
.B \-s
-¤Ç¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥¹¥¥ã¥Ê¤¬¡¢¤É¤Î¥ë¡¼¥ë¤Ë¤â¥Þ¥Ã¥Á¤·¤Ê¤¤
-ÆþÎÏʸ»úÎó¤ËÁø¶ø¤·¤Þ¤·¤¿¡£
-ÆâÉôŪ¤ÊÌäÂê¤Ëµ¯°ø¤·¤Æ¤³¤Î¥¨¥é¡¼¤¬µ¯¤³¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡£
+でコンパイルされたスキャナが、どのルールにもマッチしない
+入力文字列に遭遇しました。
+内部的な問題に起因してこのエラーが起こることもあります。
.PP
.I token too large, exceeds YYLMAX -
-¥¹¥¥ã¥Ê¤¬
+スキャナが
.B %array
-¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ë¡¢¤¢¤ë¥ë¡¼¥ë¤¬Äê¿ô
+を使っている場合に、あるルールが定数
.B YYLMAX
-(¥Ç¥Õ¥©¥ë¥È¤Ç 8K ¥Ð¥¤¥È) ¤è¤êÂ礤Êʸ»úÎó¤È¥Þ¥Ã¥Á¤·¤Þ¤·¤¿¡£
+(デフォルトで 8K バイト) より大きな文字列とマッチしました。
.I flex
-¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÄêµÁÉô¤Ç
+の入力ファイルの定義部で
.B YYLMAX
-¤ò #define ¤¹¤ë¤³¤È¤ÇÃͤòÂ礤¯¤Ç¤¤Þ¤¹¡£
+を #define することで値を大きくできます。
.PP
.I scanner requires \-8 flag to
.I use the character 'x' -
-¥¹¥¥ã¥Ê¤Îµ½Ò¤Ë 8 ¥Ó¥Ã¥È¤Îʸ»ú
+スキャナの記述に 8 ビットの文字
.I 'x'
-¤ò¼±Ê̤¹¤ëÉôʬ¤¬¤¢¤ê¡¢
+を識別する部分があり、
.B \-Cf
-¤â¤·¤¯¤Ï
+もしくは
.B \-CF
-¤Î¥Æ¡¼¥Ö¥ë°µ½Ì¥ª¥×¥·¥ç¥ó¤Î¤¿¤á¤Ë¥Ç¥Õ¥©¥ë¥È¤Î 7 ¥Ó¥Ã¥È¤Ë¤Ê¤Ã¤Æ¤¤¤ë
-¤Ë¤â¤«¤«¤ï¤é¤º¡¢
-\-8 ¥ª¥×¥·¥ç¥ó¤ò¤Ä¤±¤Æ¤¤¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
-¾ÜºÙ¤Ï
+のテーブル圧縮オプションのためにデフォルトの 7 ビットになっている
+にもかかわらず、
+\-8 オプションをつけていないということです。
+詳細は
.B \-7
-¥Õ¥é¥°¤Î¥ª¥×¥·¥ç¥ó¤ÎµÄÏÀ¤ò»²¾È¤·¤Æ²¼¤µ¤¤¡£
+フラグのオプションの議論を参照して下さい。
.PP
.I flex scanner push-back overflow -
.B unput()
-¤Ç¥Æ¥¥¹¥È¤òÌᤷ¤¹¤®¤¿¤¿¤á¡¢¥¹¥¥ã¥Ê¤Î¥Ð¥Ã¥Õ¥¡¤Ï
-Ìᤷ¤¿¥Æ¥¥¹¥È¤È¸½¥È¡¼¥¯¥ó¤ò
+でテキストを戻しすぎたため、スキャナのバッファは
+戻したテキストと現トークンを
.B yytext
-¤ËÊݤƤޤ»¤ó¡£
-¤³¤Î¾ì¹ç¡¢ÍýÁÛŪ¤Ë¤Ï¥¹¥¥ã¥Ê¤¬Æ°Åª¤Ë¥Ð¥Ã¥Õ¥¡¤ÎÂ礤µ¤òÊѤ¨¤ë¤Ù¤¤Ç¤¹¤¬¡¢
-¸½ºß¤Î¤È¤³¤í¤½¤¦¤Ê¤Ã¤Æ¤Ï¤¤¤Þ¤»¤ó¡£
+に保てません。
+この場合、理想的にはスキャナが動的にバッファの大きさを変えるべきですが、
+現在のところそうなってはいません。
.PP
.I
input buffer overflow, can't enlarge buffer because scanner uses REJECT -
-¥¹¥¥ã¥Ê¤ÏÈó¾ï¤ËÂ礤ʥȡ¼¥¯¥ó¤Î¥Þ¥Ã¥Á¤òÄ´¤Ù¤Æ¤¤¤Æ¡¢ÆþÎϥХåե¡¤ò
-³ÈÄ¥¤¹¤ëɬÍפ¬µ¯¤¤Þ¤·¤¿¡£¤·¤«¤·¤Ê¤¬¤é¡¢¥Ð¥Ã¥Õ¥¡¤Î³ÈÄ¥¤Ï
+スキャナは非常に大きなトークンのマッチを調べていて、入力バッファを
+拡張する必要が起きました。しかしながら、バッファの拡張は
.B
REJECT
-¤ò»È¤¦¥¹¥¥ã¥Ê¤Ç¤ÏƯ¤¤Þ¤»¤ó¡£
+を使うスキャナでは働きません。
.PP
.I
fatal flex scanner internal error--end of buffer missed -
-¥¹¥¥ã¥Ê¤¬»ÈÍѤ·¤Æ¤¤¤ë¥Õ¥ì¡¼¥à¤«¤é(¤ò±Û¤¨¤Æ)¥í¥ó¥°¥¸¥ã¥ó¥×¤·¤¿¸å¡¢
-ºÆÅÙ¥¹¥¥ã¥Ê¤ËÆþ¤Ã¤¿¾ì¹ç¤Ëµ¯¤³¤ê¤Þ¤¹¡£
-ºÆÅÙ¥¹¥¥ã¥Ê¤ËÆþ¤ëÁ°¤Ë:
+スキャナが使用しているフレームから(を越えて)ロングジャンプした後、
+再度スキャナに入った場合に起こります。
+再度スキャナに入る前に:
.nf
yyrestart( yyin );
.fi
-¤ò»È¤¦¤«¡¢Á°½Ò¤Î¤è¤¦¤Ë C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£
+を使うか、前述のように C++ スキャナクラスを使用するようにして下さい。
.PP
.I too many start conditions in <> construct! -
-¸ºß¤¹¤ë¤è¤ê¿¤¯¤Î³«»Ï¾ò·ï¤ò <> Ãæ¤ËµºÜ¤·¤Þ¤·¤¿
-(¾¯¤Ê¤¯¤È¤â°ì¤Ä¤òÆóÅÙµºÜ¤·¤Þ¤·¤¿)¡£
-.SH ´ØÏ¢¥Õ¥¡¥¤¥ë
+存在するより多くの開始条件を <> 中に記載しました
+(少なくとも一つを二度記載しました)。
+.SH 関連ファイル
.TP
.B \-ll
-¥¹¥¥ã¥Ê¤¬¥ê¥ó¥¯¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¥é¥¤¥Ö¥é¥ê¡£
+スキャナがリンクしなければならないライブラリ。
.TP
.I lex.yy.c
-À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê(¥·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ¤Ï
+生成されたスキャナ(システムによっては
.I lexyy.c
-¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹)¡£
+という名前になります)。
.TP
.I lex.yy.cc
.B -+
-¤ò»È¤Ã¤¿»þ¤ËºîÀ®¤µ¤ì¤¿ C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¡£
+を使った時に作成された C++ スキャナクラス。
.TP
.I <FlexLexer.h>
-C++ ¥¹¥¥ã¥Ê¥Ù¡¼¥¹¥¯¥é¥¹
+C++ ã\82¹ã\82ã\83£ã\83\8aã\83\99ã\83¼ã\82¹ã\82¯ã\83©ã\82¹
.B FlexLexer
-¤È¤½¤ÎƳ½Ð¥¯¥é¥¹
+ã\81¨ã\81\9dã\81®å°\8eå\87ºã\82¯ã\83©ã\82¹
.B yyFlexLexer
-¤òÄêµÁ¤¹¤ë¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¡£
+を定義するヘッダファイル。
.TP
.I flex.skl
-¥¹¥±¥ë¥È¥ó¥¹¥¥ã¥Ê¡£
-¤³¤Î¥Õ¥¡¥¤¥ë¤Ï flex ¤Î¼Â¹Ô»þ¤Ç¤Ï¤Ê¤¯¡¢flex ¤ò¹½ÃÛ¤¹¤ë»þ¤Î¤ßÍøÍѤµ¤ì¤Þ¤¹¡£
+スケルトンスキャナ。
+このファイルは flex の実行時ではなく、flex を構築する時のみ利用されます。
.TP
.I lex.backup
.B \-b
-¥Õ¥é¥°ÍѤΥХ寥¢¥Ã¥×¾ðÊó(¥·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ¤Ï
+フラグ用のバックアップ情報(システムによっては
.I lex.bck
-¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹)¡£
-.SH ·ç´Ù / ¥Ð¥°
-±¦Ê¸Ì®(trailing context)¥Ñ¥¿¡¼¥ó¤ÎÃæ¤Ë¤Ï¡¢Àµ¤·¤¯¥Þ¥Ã¥Á¤»¤º
-·Ù¹ð¥á¥Ã¥»¡¼¥¸ ("dangerous trailing context") ¤ò½Ð¤¹¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£
-¤³¤ì¤é¤Î¥Ñ¥¿¡¼¥ó¤Ï¡¢
-¥ë¡¼¥ë¤ÎºÇ½é¤ÎÉôʬ¤¬ 2ÈÖÌܤÎƬ¤ÎÉôʬ¤È¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ê¤â¤Î¤Ç¤¹¡£
-Î㤨¤Ð "zx*/xy*" ¤Î¾ì¹ç¡¢'x*' ¤Ï±¦Ê¸Ì®¤ÎƬ¤Î 'x' ¤È¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
-(POSIX ¥É¥é¥Õ¥È¤Ç¤Ï¤½¤Î¤è¤¦¤Ê¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë¥Æ¥¥¹¥È¤Ï
-̤ÄêµÁ¤Ç¤¢¤ë¤È½Ò¤Ù¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£)
-.PP
-±¦Ê¸Ì®¤ÎÃæ¤Ë¤Ï¡¢¼ÂºÝ¤Ë¤Ï¸ÇÄêŤǤ¢¤ë¤Î¤Ë¤½¤¦¤È¤Ï²ò¼á¤µ¤ì¤Ê¤¤¤â¤Î¤¬¤¢¤ê¡¢
-¾å¤Ë½Ò¤Ù¤¿Àǽ¤ÎÄã²¼¤¬µ¯¤³¤ê¤Þ¤¹¡£
-Æäˡ¢ '|' ¤ä {n} (Î㤨¤Ð "foo{3}") ¤Ï¾ï¤Ë²ÄÊÑŤǤ¢¤ë¤È²ò¼á¤µ¤ì¤Þ¤¹¡£
-.PP
-±¦Ê¸Ì®¤ÈÆÃÊ̤ʥ¢¥¯¥·¥ç¥ó '|' ¤òÁȤ߹ç¤ï¤»¤ë¤È
-.I ¸ÇÄê¤Î
-±¦Ê¸Ì®¤¬¤è¤ê¥³¥¹¥È¤Î¤«¤«¤ë
-.I ²ÄÊѤÎ
-±¦Ê¸Ì®¤È¤Ê¤ê¤Þ¤¹¡£Î㤨¤Ð¡¢¼¡¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¹:
+という名前になります)。
+.SH æ¬ é\99¥ / ã\83\90ã\82°
+右文脈(trailing context)パターンの中には、正しくマッチせず
+警告メッセージ ("dangerous trailing context") を出すものがあります。
+これらのパターンは、
+ルールの最初の部分が 2番目の頭の部分とマッチするようなものです。
+例えば "zx*/xy*" の場合、'x*' は右文脈の頭の 'x' とマッチします。
+(POSIX ドラフトではそのようなパターンにマッチするテキストは
+未定義であると述べていることに注意して下さい。)
+.PP
+右文脈の中には、実際には固定長であるのにそうとは解釈されないものがあり、
+上に述べた性能の低下が起こります。
+特に、 '|' や {n} (例えば "foo{3}") は常に可変長であると解釈されます。
+.PP
+右文脈と特別なアクション '|' を組み合わせると
+.I 固定の
+右文脈がよりコストのかかる
+.I 可変の
+右文脈となります。例えば、次のようなものです:
.nf
%%
.fi
.PP
.B %array
-¤â¤·¤¯¤Ï
+もしくは
.B \-l
-¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢
+オプションを指定しない場合、
.B unput()
-¤ò»È¤¦¤È yytext ¤È yyleng ¤òÇ˲õ¤·¤Þ¤¹¡£
+を使うと yytext と yyleng を破壊します。
.PP
-NUL ¤Î¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤Ï¾¤Îʸ»ú¤ÎÈæ³Ó¤è¤ê¤«¤Ê¤êÃÙ¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
+NUL のパターンマッチングは他の文字の比較よりかなり遅くなっています。
.PP
-ÆþÎϥХåե¡¤ÎưŪ¤ÊÂ礤µ¤ÎºÆÄ´À°¤Ï»þ´Ö¤¬¤«¤«¤ê¤Þ¤¹¡£¤³¤ì¤Ï¸½¥È¡¼¥¯¥ó
-(°ìÈ̤˵ðÂç)¤Þ¤Ç¤Î¥Þ¥Ã¥Á¤·¤¿Á´¥Æ¥¥¹¥È¤ÎºÆ¥¹¥¥ã¥ó¤òȼ¤¦¤¿¤á¤Ç¤¹¡£
+入力バッファの動的な大きさの再調整は時間がかかります。これは現トークン
+(一般に巨大)までのマッチした全テキストの再スキャンを伴うためです。
.PP
-ÆþÎϤΥХåե¡¥ê¥ó¥°¤ÈÀèÆɤߤΤ¿¤á¡¢ <stdio.h> ¥ë¡¼¥Á¥ó¤È
-º®¹ç¤·¤Æ»È¤¦¤³¤È¤¬½ÐÍè¤Þ¤»¤ó¡£Î㤨¤Ð¡¢
+入力のバッファリングと先読みのため、 <stdio.h> ルーチンと
+混合して使うことが出来ません。例えば、
.B getchar()
-¤È
+と
.I flex
-¤Î¥ë¡¼¥ë¤Ï¤¦¤Þ¤¯¹Ô¤¤Þ¤»¤ó¡£Âå¤ï¤ê¤Ë
+のルールはうまく行きません。代わりに
.B input()
-¤ò»È¤Ã¤Æ²¼¤µ¤¤¡£
+を使って下さい。
.PP
.B \-v
-¥ª¥×¥·¥ç¥ó¤Çɽ¼¨¤µ¤ì¤ëÁ´¥Æ¡¼¥Ö¥ë¥¨¥ó¥È¥ê¤Ë¤Ï¡¢
-¤É¤Î¥ë¡¼¥ë¤¬¥Þ¥Ã¥Á¤·¤¿¤Î¤«¤ò·èÄꤹ¤ë¤Î¤ËɬÍפʥơ¼¥Ö¥ë¥¨¥ó¥È¥ê¿ô¤¬
-´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¥¨¥ó¥È¥ê¤Î¿ô¤Ï¥¹¥¥ã¥Ê¤¬
+オプションで表示される全テーブルエントリには、
+どのルールがマッチしたのかを決定するのに必要なテーブルエントリ数が
+含まれていません。エントリの数はスキャナが
.B REJECT
-¤ò»È¤Ã¤Æ¤¤¤Ê¤¤¤È¤¤Ë¤Ï DFA ¾õÂÖ¿ô¤ËÅù¤·¤¯¡¢
-»È¤Ã¤Æ¤¤¤ë¤È¤¤Ë¤Ï DFA ¾õÂÖ¿ô¤è¤ê¤¤¤¯¤é¤«Â礤¯¤Ê¤ê¤Þ¤¹¡£
+を使っていないときには DFA 状態数に等しく、
+使っているときには DFA 状態数よりいくらか大きくなります。
.PP
.B REJECT
-¤¬¥ª¥×¥·¥ç¥ó
+がオプション
.B \-f
-¤â¤·¤¯¤Ï
+もしくは
.B \-F
-¤È¤È¤â¤Ë»È¤¨¤Þ¤»¤ó¡£
+とともに使えません。
.PP
.I flex
-¤ÎÆâÉô¥¢¥ë¥´¥ê¥º¥à¤Ë¤Ä¤¤¤Æ¤Î¥É¥¥å¥á¥ó¥È¤¬É¬ÍפǤ¹¡£
-.SH ´ØÏ¢¹àÌÜ
+の内部アルゴリズムについてのドキュメントが必要です。
+.SH 関連項目
lex(1), yacc(1), sed(1), awk(1)
.PP
John Levine, Tony Mason, and Doug Brown,
.I Lex & Yacc,
O'Reilly and Associates.
-Âè 2 ÈǤòÆþ¼ê¤¹¤ë¤³¤È¡£
+第 2 版を入手すること。
.PP
M. E. Lesk and E. Schmidt,
.I LEX \- Lexical Analyzer Generator
.I Compilers: Principles, Techniques and Tools,
Addison-Wesley (1986).
.I flex
-¤Ç»ÈÍѤ·¤Æ¤¤¤ë¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°µ»Ë¡¤ò²òÀ⤷¤Æ¤¤¤ë(·èÄêÀ¥ª¡¼¥È¥Þ¥È¥ó)¡£
-.SH ºî¼Ô
-Vern Paxson ¤¬Â¿¤¯¤Î¥¢¥¤¥Ç¥£¥¢¤È¥¤¥ó¥¹¥Ô¥ì¡¼¥·¥ç¥ó¤òÆÀ¤ë½õ¤±¤ò
-Van Jacobson ¤«¤é¼õ¤±¤Þ¤·¤¿¡£
-¥ª¥ê¥¸¥Ê¥ë¥Ð¡¼¥¸¥ç¥ó¤Ï Jef Poskanzer ¤¬ºîÀ®¤·¤Þ¤·¤¿¡£
-¹â®¥Æ¡¼¥Ö¥ëɽ¸½¤Ï Van Jacobson ¤Î¥Ç¥¶¥¤¥ó¤ÎÉôʬ¼ÂÁõ¤Ç¤¹¡£
-¤³¤Î¼ÂÁõ¤Ï Kevin Gong ¤È Vern Paxson ¤¬¹Ô¤¤¤Þ¤·¤¿¡£
+で使用しているパターンマッチング技法を解説している(決定性オートマトン)。
+.SH 作者
+Vern Paxson が多くのアイディアとインスピレーションを得る助けを
+Van Jacobson から受けました。
+オリジナルバージョンは Jef Poskanzer が作成しました。
+高速テーブル表現は Van Jacobson のデザインの部分実装です。
+この実装は Kevin Gong と Vern Paxson が行いました。
.PP
-¿¤¯¤Î
+多くの
.I flex
-¥Ù¡¼¥¿¥Æ¥¹¥¿¡¢¥Õ¥£¡¼¥É¥Ð¥Ã¥«¡¢¥³¥ó¥È¥ê¥Ó¥å¡¼¥¿¡¢ÆÃ¤Ë Francois Pinard,
+ベータテスタ、フィードバッカ、コントリビュータ、特に Francois Pinard,
Casey Leedom,
Robert Abramovitz,
Stan Adermann, Terry Allen, David Barker-Plummer, John Basrai,
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,
-¤ª¤è¤Ó»ä¤ÎºÇÄã¤Î¥á¡¼¥ë¥¢¡¼¥«¥¤¥ÖǽÎϤ«¤é³ê¤êÍî¤Á¤¿Êý¡¹¡¢
-¤½¤ì¤é¤ÎÊý¡¹¤Î¶¨ÎϤˤâƱÍͤ˴¶¼Õ¤·¤Þ¤¹¡£
+および私の最低のメールアーカイブ能力から滑り落ちた方々、
+それらの方々の協力にも同様に感謝します。
.PP
Keith Bostic, Jon Forrest, Noah Friedman,
John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T.
Nicol, Francois Pinard, Rich Salz, Richard Stallman
-¤Ë¤Ï¿¤¯¤ÎǺ¤ß¤Îʬ»¶¤Ë´Ø¤·¤Æ´¶¼Õ¤·¤Þ¤¹¡£
+には多くの悩みの分散に関して感謝します。
.PP
-Esmond Pitt ¤È Earle Horton ¤Ë¤Ï 8 ¥Ó¥Ã¥Èʸ»ú¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ;
-Benson Margulies ¤È Fred Burke ¤Ë¤Ï C++ ¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ;
-Kent Williams ¤È Tom Epperly ¤Ë¤Ï C++ ¥¯¥é¥¹¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ;
-Ove Ewerlid ¤Ë¤Ï NUL ¤Î¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ;
-Eric Hughes ¤Ë¤ÏÊ£¿ô¥Ð¥Ã¥Õ¥¡¤Î¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ¡¢¤½¤ì¤¾¤ì´¶¼Õ¤·¤Þ¤¹¡£
+Esmond Pitt と Earle Horton には 8 ビット文字サポートに関して;
+Benson Margulies と Fred Burke には C++ サポートに関して;
+Kent Williams と Tom Epperly には C++ クラスサポートに関して;
+Ove Ewerlid には NUL のサポートに関して;
+Eric Hughes には複数バッファのサポートに関して、それぞれ感謝します。
.PP
-¤³¤ÎºîÉʤÏÅö½é¡¢»ä¤¬ CA Berkeley ¤Î Lawrence Berkeley Laboratory
-¤Ë¤ª¤±¤ë Real Time Systems Group ¤Ë¤¤¤¿»þ¤ËºîÀ®¤µ¤ì¤Þ¤·¤¿¡£
-»ä¤Ë¶¨ÎϤ·¤Æ¤¯¤ì¤¿Êý¡¹¤Ë´¶¼Õ¤·¤Þ¤¹¡£
+この作品は当初、私が CA Berkeley の Lawrence Berkeley Laboratory
+における Real Time Systems Group にいた時に作成されました。
+私に協力してくれた方々に感謝します。
.PP
-¥³¥á¥ó¥È¤Ï vern@ee.lbl.gov ¤ËÁ÷¤Ã¤Æ²¼¤µ¤¤¡£
+コメントは vern@ee.lbl.gov に送って下さい。