Previous: Start States, Up: Flex Descriptions


3.9 %option(Flex 2.5の補足情報)

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

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

     %option option_name

オプションoption_nameの指定を無効にするためには、 オプション名の前に‘no’を付けます。

     %option nooption_name


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

%option 7bit
-7オプション


%option 8bit
-8オプション


%option align
-Caオプション


%option backup
-bオプション


%option batch
-Bオプション


%option c++
-+オプション


%option caseful
-iオプションの否定


%option case-sensitive
-iオプションの否定


%option case-insensitive
-iオプション


%option caseless
-iオプション


%option debug
-dオプション


%option default
-sオプションの否定


%option ecs
-Ceオプション


%option fast
-Fオプション


%option full
-fオプション


%option interactive
-Iオプション


%option lex-compat
-lオプション


%option meta-ecs
-Cmオプション


%option output="file"
-ofileオプション


%option perf-report
-pオプション


%option prefix="prefix"
-Pprefixオプション


%option read
-Crオプション


%option stdout
-tオプション


%option verbose
-vオプション


%option warn
-wオプションの否定


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

%option array
yytextcharの配列として定義します。 これは、 ‘%array’と同じです。


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


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

これは、 暗黙のうちに‘%option noyywrap’を指定します。


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


%option pointer
yytextcharに対するポインタとして定義します。 これは、 ‘%pointer’と同じです。


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


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


%option stdinit
yyinstdinで、 yyoutstdoutで、 それぞれ初期化します。 この%option指示子が指定されない場合、 あるいは、 ‘%option nostdinit’が指定された場合、 yyinyyoutは、 (FILE *)0(NULLポインタ)で初期化されます。


%option unput
%option nounput’が指定されると、 生成されるスキャナの中に、 関数unput()が組み込まれません。1


%option yy_pop_state
%option noyy_pop_state’が指定されると、 生成されるスキャナの中に、 関数yy_pop_state()が組み込まれません。 ただし、 ‘%option stack’が指定されていない場合は、 ‘%option noyy_pop_state’の指定の有無にかかわらず、 関数yy_pop_state()は組み込まれません。


%option yy_push_state
%option noyy_push_state’が指定されると、 生成されるスキャナの中に、 関数yy_push_state()が組み込まれません。 ただし、 ‘%option stack’が指定されていない場合は、 ‘%option noyy_push_state’の指定の有無にかかわらず、 関数yy_push_state()は組み込まれません。


%option yy_scan_buffer
%option noyy_scan_buffer’が指定されると、 生成されるスキャナの中に、 関数yy_scan_buffer()が組み込まれません。


%option yy_scan_bytes
%option noyy_scan_bytes’が指定されると、 生成されるスキャナの中に、 関数yy_scan_bytes()が組み込まれません。


%option yy_scan_string
%option noyy_scan_string’が指定されると、 生成されるスキャナの中に、 関数yy_scan_string()が組み込まれません。


%option yy_top_state
%option noyy_top_state’が指定されると、 生成されるスキャナの中に、 関数yy_top_state()が組み込まれません。 ただし、 ‘%option stack’が指定されていない場合は、 ‘%option noyy_top_state’の指定の有無にかかわらず、 関数yy_top_state()は組み込まれません。


%option yyclass="classname"
これは、 ‘-+’オプションが指定されている場合 (すなわち、 C++スキャナを生成する場合) のみ有効です。 これにより、 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
%option noyywrap’が指定されると、 yywrap()はマクロとして、
          #define yywrap() 1

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


Footnotes

[1] Flex 2.5.4に付属のドキュメントflex.texiには、 関数input()についても同様のことが記載されていますが、 実際に‘%option noinput’を指定してみると、 生成されるスキャナの中に、 関数input()が組み込まれます。