スタート状態の名前を並べただけではあまり役に立ちません。
つまり、
スタート状態がいつ活性化されるのかということも制御しなければなりません。
活性化は、
アクションの中、
または、
記述情報内の追加的な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)
によって、
スキャナの状態が効果的に
(もちろん、
その時点においてスキャンしている箇所を維持したまま)
リセットされることを意味しています。