@c Copyright (C) 1999 Kazuhisa Ichikawa
@c This is part of the Flex manual, as published by ASCII
@ignore
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

Permission is granted to process this file through TeX and print the
results, provided the printed document carries copying permission notice
identical to this one except for the removal of this paragraph (this
paragraph not being relevant to the printed manual).

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation approved
by the Free Software Foundation.
@end ignore

@c @node %option (Flex 2.5),  , Start States, Flex Descriptions
@c @section %option（Flex 2.5の補足情報）
@cindex @code{%option}

Flex 2.5では、
スキャナ定義ファイルの中で様々なオプションを指定することができます。
オプションを指定するには、
スキャナ定義ファイルの先頭
（最初の@samp{%%}よりも前の部分）
に、
@code{%option}指示子を記述します。

ほとんどの@code{%option}指示子は、
以下の形式で指定されます。

@example
%option @var{option_name}
@end example

オプション@var{option_name}の指定を無効にするためには、
オプション名の前に@samp{no}を付けます。

@example
%option no@var{option_name}
@end example

@*
@noindent
以下に、
コマンドライン・オプションと同等の効果を持つ@code{%option}指示子を示します。
各コマンドライン・オプションの意味については、
@ref{Command Line Switches}と@ref{Command Line Switches (Flex 2.5)}を参照してください。

@table @code
@vindex @code{7bit}、@code{%option}
@item %option 7bit
-7オプション

@vindex @code{8bit}、@code{%option}
@item %option 8bit
-8オプション

@vindex @code{align}、@code{%option}
@item %option align
-Caオプション

@vindex @code{backup}、@code{%option}
@item %option backup
-bオプション

@vindex @code{batch}、@code{%option}
@item %option batch
-Bオプション

@vindex @code{c++}、@code{%option}
@item %option c++
-+オプション

@vindex @code{caseful}、@code{%option}
@item %option caseful
-iオプションの否定

@vindex @code{case-sensitive}、@code{%option}
@item %option case-sensitive
-iオプションの否定

@vindex @code{case-insensitive}、@code{%option}
@item %option case-insensitive
-iオプション

@vindex @code{caseless}、@code{%option}
@item %option caseless
-iオプション

@vindex @code{debug}、@code{%option}
@item %option debug
-dオプション

@vindex @code{default}、@code{%option}
@item %option default
-sオプションの否定

@vindex @code{ecs}、@code{%option}
@item %option ecs
-Ceオプション

@vindex @code{fast}、@code{%option}
@item %option fast
-Fオプション

@vindex @code{full}、@code{%option}
@item %option full
-fオプション

@vindex @code{interactive}、@code{%option}
@item %option interactive
-Iオプション

@vindex @code{lex-compat}、@code{%option}
@item %option lex-compat
-lオプション

@vindex @code{meta-ecs}、@code{%option}
@item %option meta-ecs
-Cmオプション

@vindex @code{output}、@code{%option}
@item %option output="@var{file}"
-o@var{file}オプション

@vindex @code{perf-report}、@code{%option}
@item %option perf-report
-pオプション

@vindex @code{prefix}、@code{%option}
@item %option prefix="@var{prefix}"
-P@var{prefix}オプション

@vindex @code{read}、@code{%option}
@item %option read
-Crオプション

@vindex @code{stdout}、@code{%option}
@item %option stdout
-tオプション

@vindex @code{verbose}、@code{%option}
@item %option verbose
-vオプション

@vindex @code{warn}、@code{%option}
@item %option warn
-wオプションの否定
@end table

@*
@noindent
次に、
コマンドライン・オプションでは代替できない@code{%option}指示子を示します。

@table @code
@vindex @code{array}、@code{%option}
@vindex @code{%array}
@item %option array
@code{yytext}を@code{char}の配列として定義します。
これは、
@samp{%array}と同じです。

@vindex @code{always-interactive}、@code{%option}
@item %option always-interactive
入力を常に対話的に扱うスキャナを生成するよう指示します。
これと@samp{%option never-interactive}のどちらも指定されない場合、
生成されたスキャナは、
ファイルをオープンするたびに@code{isatty()}を呼び出して、
入力を対話的に（１文字ずつ）読み込むべきか否かを決定します。

@vindex @code{main}、@code{%option}
@item %option main
生成されるスキャナに、
以下のような@code{main()}関数を組み込むよう指示します。

@example
int main()
	@{
	yylex();
	return 0;
	@}
@end example

これは、
暗黙のうちに@samp{%option noyywrap}を指定します。

@vindex @code{never-interactive}、@code{%option}
@item %option never-interactive
入力を常に対話的に扱わないスキャナを生成するよう指示します。
これと@samp{%option always-interactive}のどちらも指定されない場合、
生成されたスキャナは、
ファイルをオープンするたびに@code{isatty()}を呼び出して、
入力を対話的に（１文字ずつ）読み込むべきか否かを決定します。

@vindex @code{pointer}、@code{%option}
@vindex @code{%pointer}
@item %option pointer
@code{yytext}を@code{char}に対するポインタとして定義します。
これは、
@samp{%pointer}と同じです。

@vindex @code{reject}、@code{%option}
@item %option reject
スキャナ定義ファイルの中で@code{REJECT}が使われていることを、
Flexに通知します。
Flexは通常、
定義ファイルの中で@code{REJECT}が使われているか否かを自分で調査しますが、
この@code{%option}指示子の指定は、
Flex自身による判定結果に優先します。

@vindex @code{stack}、@code{%option}
@item %option stack
スタート状態スタック
（@ref{Start State Notes (Flex 2.5)}を参照）
を使用するためには、
この@code{%option}指示子を指定しなければなりません。

@vindex @code{stdinit}、@code{%option}
@item %option stdinit
@code{yyin}を@code{stdin}で、
@code{yyout}を@code{stdout}で、
それぞれ初期化します。
この@code{%option}指示子が指定されない場合、
あるいは、
@samp{%option nostdinit}が指定された場合、
@code{yyin}と@code{yyout}は、
@code{(FILE *)0}（NULLポインタ）で初期化されます。

@vindex @code{unput}、@code{%option}
@item %option unput
@samp{%option @strong{no}unput}が指定されると、
生成されるスキャナの中に、
関数@code{unput()}が組み込まれません。@footnote{Flex 2.5.4に付属のドキュメント@file{flex.texi}には、
関数@code{input()}についても同様のことが記載されていますが、
実際に@samp{%option @strong{no}input}を指定してみると、
生成されるスキャナの中に、
関数@code{input()}が組み込まれます。}

@vindex @code{yy_pop_state}、@code{%option}
@item %option yy_pop_state
@samp{%option @strong{no}yy_pop_state}が指定されると、
生成されるスキャナの中に、
関数@code{yy_pop_state()}が組み込まれません。
ただし、
@samp{%option stack}が指定されていない場合は、
@samp{%option @strong{no}yy_pop_state}の指定の有無にかかわらず、
関数@code{yy_pop_state()}は組み込まれません。

@vindex @code{yy_push_state}、@code{%option}
@item %option yy_push_state
@samp{%option @strong{no}yy_push_state}が指定されると、
生成されるスキャナの中に、
関数@code{yy_push_state()}が組み込まれません。
ただし、
@samp{%option stack}が指定されていない場合は、
@samp{%option @strong{no}yy_push_state}の指定の有無にかかわらず、
関数@code{yy_push_state()}は組み込まれません。

@vindex @code{yy_scan_buffer}、@code{%option}
@item %option yy_scan_buffer
@samp{%option @strong{no}yy_scan_buffer}が指定されると、
生成されるスキャナの中に、
関数@code{yy_scan_buffer()}が組み込まれません。

@vindex @code{yy_scan_bytes}、@code{%option}
@item %option yy_scan_bytes
@samp{%option @strong{no}yy_scan_bytes}が指定されると、
生成されるスキャナの中に、
関数@code{yy_scan_bytes()}が組み込まれません。

@vindex @code{yy_scan_string}、@code{%option}
@item %option yy_scan_string
@samp{%option @strong{no}yy_scan_string}が指定されると、
生成されるスキャナの中に、
関数@code{yy_scan_string()}が組み込まれません。

@vindex @code{yy_top_state}、@code{%option}
@item %option yy_top_state
@samp{%option @strong{no}yy_top_state}が指定されると、
生成されるスキャナの中に、
関数@code{yy_top_state()}が組み込まれません。
ただし、
@samp{%option stack}が指定されていない場合は、
@samp{%option @strong{no}yy_top_state}の指定の有無にかかわらず、
関数@code{yy_top_state()}は組み込まれません。

@vindex @code{yyclass}、@code{%option}
@item %option yyclass="@var{classname}"
これは、
@samp{-+}オプションが指定されている場合
（すなわち、
C++スキャナを生成する場合）
のみ有効です。
これにより、
@var{classname}により指定される名前のクラスが、
@code{yyFlexLexer}のサブクラスとして定義されます。
実際にスキャン処理を実行するコードは、
クラス@var{classname}のメンバ関数@code{yylex()}（@code{@var{classname}::yylex()}）に実装されます。
詳細については、
@ref{Flex and C++ (Flex 2.5)}を参照してください。

@vindex @code{yylineno}、@code{%option}
@item %option yylineno
入力の行数をカウントして大域変数@code{yylineno}に保持するスキャナを生成するよう指示します。

@vindex @code{yymore}、@code{%option}
@item %option yymore
スキャナ定義ファイルの中で@code{yymore()}が使われていることを、
Flexに通知します。
Flexは通常、
定義ファイルの中で@code{yymore()}が使われているか否かを自分で調査しますが、
この@code{%option}指示子の指定は、
Flex自身による判定結果に優先します。

@vindex @code{yywrap}、@code{%option}
@item %option yywrap
@samp{%option @strong{no}yywrap}が指定されると、
@code{yywrap()}はマクロとして、

@example
#define yywrap() 1
@end example

@noindent
のように定義されます。
この結果、
ファイルの終端を検出した時に、
スキャナは、
ほかにスキャンすべきファイルは存在しないと判断するようになります。
@end table

