次: , 前: Start States Explained, 上: Start States


3.8.2 状態の活性化

スタート状態の名前を並べただけではあまり役に立ちません。 つまり、 スタート状態がいつ活性化されるのかということも制御しなければなりません。 活性化は、 アクションの中、 または、 記述情報内の追加的なCコードを記述する領域の中において、 BEGINを使うことで実現されます。 使い方は以下のとおりです。

     BEGIN(start_state_name);

例を挙げると、 以下のようになります。

     %x COMMENT
     %%
     "{"            BEGIN(COMMENT);
     <COMMENT>"$R"
     <COMMENT>"$I"
     <COMMENT>"$M"
         ...
     <COMMENT>"}"   BEGIN(INITIAL);

この場合、 Pascalのコメントの先頭部分を見つけるとCOMMENT状態に移行し、 コンパイラ・オプションを認識するようになります。 BEGINは最初の`%%'の直後(最初のルールの前)において使うこともでき、 この場合はyylex()は常に指定された状態で開始されます。

上の例においては、 定義されていないINITIALという状態があることに注意してください。 この状態は常に利用可能で、 活性化された状態が1つも存在しない時のスキャナの初期状態を表します。 つまり、 BEGIN(INITIAL)によって、 スキャナの状態が効果的に (もちろん、 その時点においてスキャンしている箇所を維持したまま) リセットされることを意味しています。