lex プログラムの開始条件

規則は、任意の開始条件と関連付けることができます。

ただし、lex プログラムが規則を認識できるのは、 その関連した開始条件の場合だけです。 現在の開始条件は、いつでも変更可能です。

開始条件は、次の形式の行を使用して、 仕様ファイルの定義 セクションで定義します。

%Start  name1 name2

ここで、name1 および name2 は条件を表す名前を定義します。 条件の数には制限がなく、どのような順番に並べても構いません。 ワード Start を、s または S に短縮することもできます。

仕様ファイルの規則セクション内の開始条件を使用するときは、開始条件の名前を規則の先頭に置き、<> (より小、より大) 記号の中に囲みます。 次の例は、規則、lex プログラムが認識するのは lex プログラムが開始条件 name1 の場合だけであることを定義します。

<name1> expression
lex プログラムを特定の開始条件にするには、 規則のアクション部分内のアクション・ステートメント (例えば、次の行の BEGIN) を実行します。
BEGIN name1;

このステートメントは、開始条件を name1 に変更します。

通常状態を再開するには、次のように入力します。
BEGIN 0;
or
BEGIN INITIAL;

ここで、INITIAL は、lex プログラムによって 0 であると定義されています。BEGIN 0; は、 lex プログラムを初期条件にリセットします。

lex プログラムは、%x (パーセント記号、 小文字 x)、または %X (パーセント記号、英大文字 X) 演算子と、それに続く通常の開始条件と同じフォーマットの排他的開始名のリストによって指定される、排他的開始条件もサポートします。 排他的開始条件は、 開始条件から始まらない規則は字句解析プログラムが排他的開始状態であるときはアクティブではないという点で、 通常の開始条件とは異なっています。 例:

%s      one
%x      two
%%
abc     {printf("matched ");ECHO;BEGIN one;}
<one>def         printf("matched ");ECHO;BEGIN two;}
<two>ghi         {printf("matched ");ECHO;BEGIN INITIAL;}

前の例の開始状態 one では、abc および def を両方とも突き合わせることができます。 開始状態 two では、ghi だけを突き合わせることができます。