前: Start States, 上: Flex Descriptions
Flex 2.5では、
スキャナ定義ファイルの中で様々なオプションを指定することができます。
オプションを指定するには、
スキャナ定義ファイルの先頭
(最初の`%%'よりも前の部分)
に、
%option
指示子を記述します。
ほとんどの%option
指示子は、
以下の形式で指定されます。
%option option_name
オプションoption_nameの指定を無効にするためには、 オプション名の前に`no'を付けます。
%option nooption_name
以下に、
コマンドライン・オプションと同等の効果を持つ%option
指示子を示します。
各コマンドライン・オプションの意味については、
Command Line SwitchesとCommand Line Switches (Flex 2.5)を参照してください。
%option 7bit
%option 8bit
%option align
%option backup
%option batch
%option c++
%option caseful
%option case-sensitive
%option case-insensitive
%option caseless
%option debug
%option default
%option ecs
%option fast
%option full
%option interactive
%option lex-compat
%option meta-ecs
%option output="
file"
%option perf-report
%option prefix="
prefix"
%option read
%option stdout
%option verbose
%option warn
次に、
コマンドライン・オプションでは代替できない%option
指示子を示します。
%option array
yytext
をchar
の配列として定義します。
これは、
`%array'と同じです。
%option always-interactive
isatty()
を呼び出して、
入力を対話的に(1文字ずつ)読み込むべきか否かを決定します。
%option main
main()
関数を組み込むよう指示します。
int main() { yylex(); return 0; }
これは、 暗黙のうちに`%option noyywrap'を指定します。
%option never-interactive
isatty()
を呼び出して、
入力を対話的に(1文字ずつ)読み込むべきか否かを決定します。
%option pointer
yytext
をchar
に対するポインタとして定義します。
これは、
`%pointer'と同じです。
%option reject
REJECT
が使われていることを、
Flexに通知します。
Flexは通常、
定義ファイルの中でREJECT
が使われているか否かを自分で調査しますが、
この%option
指示子の指定は、
Flex自身による判定結果に優先します。
%option stack
%option
指示子を指定しなければなりません。
%option stdinit
yyin
をstdin
で、
yyout
をstdout
で、
それぞれ初期化します。
この%option
指示子が指定されない場合、
あるいは、
`%option nostdinit'が指定された場合、
yyin
とyyout
は、
(FILE *)0
(NULLポインタ)で初期化されます。
%option unput
unput()
が組み込まれません。1
%option yy_pop_state
yy_pop_state()
が組み込まれません。
ただし、
`%option stack'が指定されていない場合は、
`%option noyy_pop_state'の指定の有無にかかわらず、
関数yy_pop_state()
は組み込まれません。
%option yy_push_state
yy_push_state()
が組み込まれません。
ただし、
`%option stack'が指定されていない場合は、
`%option noyy_push_state'の指定の有無にかかわらず、
関数yy_push_state()
は組み込まれません。
%option yy_scan_buffer
yy_scan_buffer()
が組み込まれません。
%option yy_scan_bytes
yy_scan_bytes()
が組み込まれません。
%option yy_scan_string
yy_scan_string()
が組み込まれません。
%option yy_top_state
yy_top_state()
が組み込まれません。
ただし、
`%option stack'が指定されていない場合は、
`%option noyy_top_state'の指定の有無にかかわらず、
関数yy_top_state()
は組み込まれません。
%option yyclass="
classname"
yyFlexLexer
のサブクラスとして定義されます。
実際にスキャン処理を実行するコードは、
クラスclassnameのメンバ関数yylex()
(classname::yylex()
)に実装されます。
詳細については、
Flex and C++ (Flex 2.5)を参照してください。
%option yylineno
yylineno
に保持するスキャナを生成するよう指示します。
%option yymore
yymore()
が使われていることを、
Flexに通知します。
Flexは通常、
定義ファイルの中でyymore()
が使われているか否かを自分で調査しますが、
この%option
指示子の指定は、
Flex自身による判定結果に優先します。
%option yywrap
yywrap()
はマクロとして、
#define yywrap() 1
のように定義されます。 この結果、 ファイルの終端を検出した時に、 スキャナは、 ほかにスキャンすべきファイルは存在しないと判断するようになります。
[1] Flex 2.5.4に付属のドキュメントflex.texiには、
関数input()
についても同様のことが記載されていますが、
実際に`%option noinput'を指定してみると、
生成されるスキャナの中に、
関数input()
が組み込まれます。