[Contents] [Back] [Prev] [Up] [Next] [Forward]
ここでは、
Flexの使用に関連するすべての情報を要約します。
この情報は、
クイック・リファレンスとして使うことができます。
Flexには、
以下のコマンドライン・オプションがあります。
- -b
-
このオプションは、
バックトラッキングを必要とする状態をもたらすルールに関する情報を含む、
`lex.backtrack'というファイルを生成します。
なぜこの情報が重要なのか、
また、
この情報をどのように使うかという点に関する詳細については、
スピードの最適化と バックトラッキングの削除を参照してください。
- -c
-
このオプションは、
POSIXとの互換性のためだけに提供されており、
実際には何もしません。
以前は、
テーブル圧縮を制御するために使われていましたが、
その機能は`-C'オプションに移されました。
このフラグを見つけると、
Flexはユーザがテーブル圧縮を希望しているものと想定し、
警告メッセージを出力します。
将来、
この警告メッセージは出力されないようになるかもしれません。(24)
- -d
-
デバッグに使われます。
実行中に自身の状態情報を
yyout
に書き込むスキャナを生成します。
あるルールがマッチするたびに、
バックトラッキングに関する情報、検出されたバッファの終端、NUL
に関する情報に加えて、
以下のような情報が書き込まれます。
--accepting rule at line 行番号 ("マッチしたテキスト")
この中の行番号は
(`-L'オプションが使われていない場合には)、
生成されたファイル`lex.yy.c'ではなく、
スキャナを生成するのに使われた記述ファイルの行番号を指します。
- -f
-
フル・スキャナ(full scanner)を生成します。
圧縮は一切行われません。
これは、
`-Cf'と同等です
(詳細については、
テーブルの圧縮とスキャナのスピードを参照してください)。
- -i
-
大文字・小文字の区別を無視するスキャナを作成するよう、
Flexに通知します。
ルールのマッチ処理において大文字・小文字の区別は無視されますが、
個々の文字は大文字または小文字に変換されないので、
yytext
には大文字・小文字が混在した文字の並びが入ることになります。
- -n
-
このオプションは、
Flexに対してはまったく意味を持たず、
単にPOSIXとの互換性のためだけに提供されています。
- -p
-
性能に関する情報を
stderr
に書き込むよう、
Flexに通知します。
報告される情報は、
性能を低下させるようなスキャナ記述情報の機能に関するコメントによって構成されます。
- -s
-
マッチするものがなかった場合のFlexスキャナのデフォルトのアクションは、
マッチしなかった入力情報を
stdout
に書き込むことです。
`-s'オプションはこのアクションを抑制し、
その代わりに、
入力がマッチしないとすぐにスキャナを異常終了させます。
- -t
-
このオプションが指定されると、
Flexは生成されたスキャナをファイル`lex.yy.c'にではなく、
stdout
に書き込みます。
- -v
-
冗長モードで動作するよう、
Flexに通知します。
Flexは、
生成されたスキャナに関する統計情報の要約を生成して、
stdout
に出力します。
要約情報の第1行にはFlexのバージョン番号、
次の行には日付と時刻、
さらに次の行には実際に使われているオプションが示されます。
要約情報のこれ以外の部分は、
Flexやその他の同様のプログラムの動作の詳細を理解している人以外にはほとんど意味を持ちません。
- -F
-
ファスト・スキャナ(fast scanner)を生成するよう、
Flexに通知します。
これは、
`-CF'と同等です。
詳細については、
スキャナの最適化を参照してください。
- -I
-
このオプションは、
シェル上や、
型を持つ入力情報を受け付ける必要のあるプログラム内で使うことのできる対話型スキャナを生成するよう、
Flexに通知します。
詳細については、
`-I'オプション:対話型スキャナを参照してください。
注:`-I'オプションは、
`-Cf'、`-f'、`-CF'、`-F'の各オプションと一緒に使うことはできません。
- -L
-
デフォルトではFlexは、
エラーがスキャナ定義のどこで発生したのかを追跡できるように、
生成されたスキャナのコード中に
#line
指示子を生成します。
`-L'オプションは、
この#line
指示子を生成する機能を抑制します。
- -T
-
Flexをトレース・モードで実行させます。
Flexは、
入力情報、スキャン処理テーブル、同等クラス(equivalence class)、およびメタ同等クラス(meta-equivalence class)に関するメッセージを生成して、
(
stderr
に)書き込みます。
この情報は、
Flexの内部的な動作を理解していない人には、
ほとんど意味を持たないでしょう。
- -8
-
このオプションは、
8ビットの入力情報を受け付けることのできるスキャナを生成するよう、
Flexに通知します。
7ビットの入力情報しか受け付けないスキャナに8ビットの入力情報を与えた場合の結果は、
予測不能です。
- -C[efmF]
-
スキャン処理テーブルをどのように圧縮するかを、
Flexに通知します。
詳細については、
スキャナの最適化を参照してくださいを参照してください。
- -Sskeleton_file
-
生成されるスキャナのベースとして、
skeleton_fileで指定されるファイルを使うよう、
Flexに通知します。
これを使うことはほとんどありませんが、
MS-DOS上ではこれによって標準のスキャナ・スケルトンへのパスを設定することができます。
Flex 2.5では、
前節(Flex コマンドライン・オプションの要約)で説明されていない、
以下のオプションもサポートされています。
- -h
-
Flexに対してコマンドライン・オプションの要約情報を出力するよう指示します。
- -l
-
AT&Tにより実装されたlexとの互換性を最大限に提供します。
このオプションは、
性能面でかなりの悪影響を及ぼします。
また、
このオプションを、
`-f'、`-F'、`-Cf'、`-CF'、`-+'オプションと同時に指定することはできません。
- -w
-
このオプションが指定されると、
Flexは、
警告メッセージを出力しません。
- -B
-
Flexに対してバッチ・スキャナを生成するよう指示します。
これは、
対話型スキャナを生成するよう指示する`-I'オプションの否定です。
- -V
-
Flexに対してバージョン番号を出力するよう指示します。
- -7
-
Flexに対して7ビット・スキャナを生成するよう指示します。
これは、
`-8'オプションの否定です。
- -+
-
Flexに対してC++スキャナ・クラスを生成するよう指示します。
- -?
-
Flexに対してコマンドライン・オプションの要約情報を出力するよう指示します。
(`-h'オプションと同じです)。
- -Ca
-
このオプションは、
スキャン処理用のテーブルを
long int
の配列として定義するようFlexに通知します
(デフォルトではshort int
型の配列となります)。
- -Cr
-
このオプションを指定して生成されたスキャナは、
入力に
read()
システム・コールを使います。
デフォルトでは、
対話型スキャナの場合はgetc()
が、
バッチ(非対話型)・スキャナの場合はfread()
が使われます。
- -ofile
-
このオプションが指定されると、
Flexは生成されたスキャナをfileにより指定されるファイルに出力します。
デフォルトでは、
スキャナはファイル`lex.yy.c'に出力されます。
- -Pprefix
-
Flexにより生成されるスキャナのソース・ファイルの中では、
大域変数や大域関数の名前の先頭に接頭辞`yy'が付けられます。
このオプションが指定されると、
`yy'の代わりに、
prefixにより指定される文字列が接頭辞として使用されます。
また、
`-o'オプションが指定されない場合のスキャナ・ファイル名`lex.yy.c'も、
`lex.prefix.c'となります。
- --help
-
Flexに対してコマンドライン・オプションの要約情報を出力するよう指示します。
(`-h'オプションと同じです)。
- --version
-
Flexに対してバージョン番号を出力するよう指示します。
(`-V'オプションと同じです)。
Flexに対する主要なCインターフェイスは、
以下のルーチンおよび変数を通じて実現されます。
個々のルーチン、変数に関する完全な説明については、
Flexとのインターフェイスを参照してください。
yylex()
-
主要なインターフェイスです。
これが実際のスキャン処理を行う関数です。
yyin
-
yylex()
が文字を読み込む元となるファイルです。
このデフォルトはstdin
です。
yyout
-
スキャナの出力ファイルです。
デフォルトは
stdout
です。
yytext
-
最後にマッチした文字列を保持する大域変数です。
つまり、
最後に認識されたトークンを保持しています。
yyleng
-
最後に認識されたトークンの長さを保持する大域変数です。
yywrap()
-
この関数は、
yyin
の終端に達した時に呼び出されます。
これがTRUE
(ゼロ以外)を返すとスキャナは実行を終了しますが、
FALSE
(ゼロ)を返すと、
yyin
が次の入力ファイルを指すよう設定されたものと想定し、
スキャン処理は継続されます。
yymore()
-
次に認識されるトークンで
yytext
の内容を上書きするのではなく、
そのトークンをyytext
の末尾に付加するようFlexに通知する関数です。
yyless(n)
-
yymore()
とほぼ反対のことを行います。
この関数は、
最初のn文字を除くすべての文字を戻します。
戻された文字の並びは、
次のトークンをマッチするのに使われます。
yyleng
とyytext
の内容には、
この変更が反映されます。
input()
-
入力から次の1文字を返します。
これは、
標準のFlex記述言語や特にLex記述言語を使ったのではうまく処理できないようなスキャナにおいて、
よく使われます。
unput(c)
-
この関数は、
文字cを入力ストリームに戻します。
この後、
この文字は次にスキャンされる文字になります。
yyterminate()
-
この関数は、
アクションの中で使われると、
スキャナ(
yylex()
)の実行を終了させます。
終了したスキャナは0を返します。
この後yyrestart()
が呼び出されない間は、
yylex()
を呼び出してもすぐに復帰してしまいます。
yyrestart(file)
-
この関数は、
スキャナの実行を再開するようFlexに通知します。
これは、
スキャンすべきファイル(通常は
yyin
)を表す引数を1つ取ります。
EOFを処理するのに使うことができますし、
また、
Flexに割り込みをかけ、
その後で再開始することを可能にするために使うこともできます。
(Flexが再入可能ではないので、
このようなことが必要になります。)
ECHO
-
yytext
の内容をyyout
にコピーするマクロです。
REJECT
-
カレントなトークンを認識しないで、
次に最もよくマッチするものを選択するよう、
スキャナに通知します。
スキャナは、
マッチするもののうち最も長いものを探します。
マッチするものが2つあってその長さが同じ場合には、
スキャナ記述の中で最初に定義されているものを選択します。
BEGIN(state)
-
スキャナをある特定のスタート状態に置くために使われます。
BEGIN
の後ろの名前は、
スタート状態の名前です。
これは、
スキャナ記述の先頭の定義セクションにおいて宣言されているものでなければなりません。
YY_USER_INIT
-
スキャナが初期化される前に実行されるべきアクションを定義します。
詳細については、
FlexとCを参照してください。
YY_USER_ACTION
-
マッチが発生した後で、
ルール・セクションに定義されたアクションが実行される前に、
実行されるべきアクションを定義します。
例えば、
yytext
の内容を小文字から大文字へ変換する等を行うのに使うことができます。
デフォルトのルールでは何も実行されません。
詳細については、
FlexとCを参照してください。
YY_BREAK
-
実際にはインターフェイス機能ではなく、
むしろ生成されるコードを変更するために使うことができるものです。
スキャナの中では、
すべてのアクションは1つの大きな
switch
文の構成要素であり、
個々のアクションの区切りは、
デフォルトで`break;'文に変換されるYY_BREAK
で与えられます。
もし、
ほとんどのルールのアクション部が`return;'文を含んでいると、
コンパイラは`statement not reached'というエラーをたくさん表示することになるでしょう
(表示するはずです)。
YY_BREAK
を再定義することによって、
この警告メッセージを表示させないようにすることが可能です。
注:YY_BREAK
を再定義する場合は、
アクションが必ず`return;'か`break;'で終わるようにしてください。
YY_DECL
-
スキャン処理を実行する関数の名前を定義するマクロです。
デフォルトは
yylex
ですが、
再定義することができます。
再定義した名前は、
関数のプロトタイプとして正当なものでなければなりません。
YY_INPUT
-
入力ルーチンの名前を定義するマクロです。
必要があれば、
この名前は再定義することができます。
例えば、
文字列や、
標準的ではない何らかの入力デバイスを入力として、
スキャン処理を行う場合に役に立ちます。
YY_NEW_FILE
-
yyin
が新しいファイルを指すよう設定されたこと、
および、
処理が継続されるべきであることをFlexに通知するマクロです。(25)
YY_CURRENT_BUFFER
-
カレントな入力バッファを返すマクロです。
yy_create_buffer()
-
新しい入力バッファを作成するのに使われます。
この関数と、
この後の2つの関数を使うことにより、
複数のバッファを作成し、
バッファ間で切り替えることが可能になります。
バッファを操作する関数を参照してください。
yy_delete_buffer()
-
以前に作成された入力バッファを削除するのに使われます。
yy_switch_to_buffer()
-
複数の入力バッファの間で切り替えを行うのに使われます。
YY_BUFFER_STATE
-
バッファを処理するのに使われる型です。
バッファのカレントなコンテキストを保持します。
複数のバッファ間で切り替えを行う時には、
この型の変数が必要になります。
YYSTYPE
-
Bisonファイル中の
%union
の型です。
これは、
FlexとBisonの間のインターフェイスで使われます。
yylval
-
Bisonパーサのカレントなパース状態に関連するデータを保持する、
Bisonパーサ中の変数です。
この変数を使うことで、
データをFlexとBisonの間で渡すことができます。
Flex 2.5では、
前節(Flex変数およびFlex関数の要約)で説明されていない、
以下の関数やマクロもサポートされています。
yy_set_interactive()
-
カレント・バッファを、
対話的なものと見なすか、
非対話的なものと見なすかを制御します。
引数にゼロ以外の値を渡すと、
カレント・バッファは対話的なものと見なされ、
ゼロを渡すと、
非対話的なものと見なされます。
yy_set_bol()
-
バッファ内のカレントな位置が行の先頭にあるか否かを表すコンテキスト情報を設定します。
引数にゼロ以外の値を渡すと、
バッファ内のカレントな位置は行の先頭である、
というコンテキスト情報がセットされます。
したがって、
次にトークンのマッチ処理が行われる時には、
行頭を表す`^'を含むルールの適用が試みられます。
逆に、
引数にゼロを渡すと、
バッファ内のカレントな位置は行の先頭ではないことになり、
次にトークンのマッチ処理が行われる時には、
行頭を表す`^'を含むルールの適用が試みられなくなります。
YY_AT_BOL()
-
次にトークンのマッチ処理が行われる時に、
行頭を表す`^'を含むルールの適用が試みられるようなコンテキスト情報がセットされている場合には、
ゼロ以外の値を返します。
それ以外の場合は、
ゼロを返します。
yy_new_buffer()
-
yy_create_buffer
の別名です。
yy_flush_buffer()
-
引数で指定されたバッファの内容を破棄し、
バッファの先頭2バイトに
YY_END_OF_BUFFER_CHAR
(`\0')をセットします。
YY_FLUSH_BUFFER
-
引数にカレント・バッファを指定して
yy_flush_buffer()
を呼び出すよう定義されたマクロです。
yy_scan_string()
-
NULL文字で終端する文字列をスキャンするための入力バッファを作成します。
実際には、
引数で渡された文字列のコピーがスキャンされます。
yy_scan_bytes()
-
引数で指定されたメモリ領域をスキャンするためのバッファを作成します。
実際には、
メモリ領域上のデータのコピーがスキャンされます。
yy_scan_buffer()
-
引数で指定されたメモリ領域をスキャンするためのバッファを作成します。
メモリ領域上のデータはコピーされません。
yy_push_state()
-
カレントなスタート状態をスタート状態スタックにプッシュし、
引数で指定された状態に遷移します。
yy_pop_state()
-
スタート状態スタックからスタート状態をポップし、
そのポップされたスタート状態に遷移します。
yy_top_state()
-
スタート状態スタックの先頭にあるスタート状態を返します
(スタート状態スタックの内容は変更されません)。
yyFlexLexer::yylex()
-
C++スキャナにおいて実際にスキャン処理を行う関数です。
yyFlexLexer::LexerInput()
-
yyFlexLexer
のサブクラスにおいて再定義することによって、
C++スキャナの入力処理を変更することができます。
yyFlexLexer::LexerOutput()
-
yyFlexLexer
のサブクラスにおいて再定義することによって、
C++スキャナの出力処理を変更することができます。
yyFlexLexer::LexerError()
-
yyFlexLexer
のサブクラスにおいて再定義することによって、
C++スキャナのエラー・メッセージ出力処理を変更することができます。
Flexにおける基本的な構成要素の1つに、
文字があります。
基本的にFlexは、
演算子、特殊文字、エスケープ・シーケンスを除いて、
文字をそのまま受け付けます。
エスケープ・シーケンスは、
ANSI Cに見られるものと同一です。
Flexの演算子と特殊文字は以下のとおりです。
文字
-
Flexの解釈
\
-
バックスラッシュは、
ANSI Cのエスケープ・シーケンスで使われるのと同様の、
エスケープ文字です。
[ ]
-
角括弧[ ]は、
文字の集合を文字クラスにグループ化するのに使われます。
詳細については、
Flexにおける文字のグループ化を参照してください。
^
-
文字クラスの中では、
`^'は否定を意味します。
詳細については、
Flexにおける文字のグループ化を参照してください。
一方、
文字クラスの外部では、
行の先頭を意味し、
(エスケープされていない場合は)
ルールの先頭にのみ置くことができます。
-
-
ハイフンは、
文字クラスの中で文字の範囲を設定するのに使われます。
文字クラスの外部では、
ハイフン自身を表します。
詳細については、
Flexにおける文字のグループ化を参照してください。
{ }
-
大括弧{ }は、
定義の参照、複数行にわたるアクションの先頭と末尾の指定、
またはパターンの繰り返し回数の範囲の定義を行います。
( )
-
丸括弧( )は、
優先順位の変更に使われます。
また、
定義は展開される時に、
暗黙のうちに丸括弧で囲まれることに注意してください。
""
-
二重引用符は、
文字列の範囲を示します。
引用符で囲まれた範囲の中にある文字だけがマッチされます。
/
-
スラッシュは、
後続コンテキスト(trailing context)を設定します。
これは、
あるパターンを認識するのを、
その後ろに別のパターンが続く場合に限定したい、
という場合です。
これは、
スラッシュ`/'が一種の「ルック・アヘッド(その先を見る)」演算子として機能することを意味します。
< >
-
かぎ括弧< >は、
スタート状態の参照、またはスタート状態のグループの参照を行い、
さらに
EOF
シンボル(`<<EOF>>')で使われます。
これに関する完全な説明については、
スタート状態と ファイルの終端(End-Of-File)ルールを参照してください。
? + *
-
`?'、`+'、`*'の各文字は、
ある正規表現が何回出現することができるかを指定するのに使われます。
`?'は、
ゼロ回もしくは1回(つまり、オプションであるということ)を、
`+'は1回以上を、
`*'はゼロ回以上をそれぞれ意味します。
|
-
OR演算子を表します。
また、
カレントなルールに対するマッチが発生した場合、
次に記述されているルールのアクションを実行するようFlexに通知する、
特別なアクションを表します。
$
-
ドル記号は行末を意味します。
ここに挙げた文字を、
その文字自身として表したい場合には、
その文字を引用符で囲む(例えば"*"
)か、
または、
エスケープ・シーケンスとして表す必要があります。
詳細については、
文字を参照してください。
Flexにおけるルールには2つの部分があります。
パターン・マッチング用の表現式とアクション部です。
この2つは、
以下のように配置されます。
pattern actions
Flexがマッチするパターンは、
正規表現を使って作られます。
そしてその正規表現は、
文字、文字列、定義、スタート状態、および演算子から作られます。
下の表は、
種々の正当な正規表現を示します。
表中において、
`c'は(エスケープ・シーケンスを含む)任意の単一文字を、
`r'は任意の正規表現を、
`s'は文字列を、
それぞれ表します。
表はグループ別に編成されていて、
優先度の最も高いものが一番上にあります。
これは、
sed
、grep
、Emacsや正規表現を使う他の一般的なプログラムにおいて使われる正規表現と完全に同一ではないことに注意してください。
ルールのアクション部は、
任意の正当なCコードです。
単一行に複数の文を書くことも可能ですし、
括弧の対{...}
で囲むことで、
複数の文のブロックを複数行にわたって書くことも可能です。
[Contents] [Back] [Prev] [Up] [Next] [Forward]