次: , 前: %%, 上: Flex Descriptions


3.5 ルール

ルールはFlexの心臓部です。 ルールを書くことによって、 プログラマは、 スキャナが何を実行するべきであるかをFlexに通知します。

通常、 ルールは2つの部分から構成されます。

     pattern       actions

このうちpatternが何を認識するべきかを定義し、 actionsがその何かを認識した時に何を実行するべきであるかをスキャナに知らせます。 patternの部分は空白によって区切られます。 これは、 空白をマッチさせたい場合には、 それを引用符で囲む必要があるということを意味しています。

スキャナは、 マッチするものを2つ以上見つけた場合、 以下の2つのルールを使ってどれを受け入れるかを決めます。

  1. 後続コンテキスト(trailing context)も含めて最も長いものを受け入れる。
  2. マッチするものがすべて同じ長さの場合、 スキャナ定義中に最初に記述されたものを受け入れる。

actionsは、 空(コードなし)にするか、 もしくは、 1つ以上のCの文を含む単一のコード行、 {...}または%{...%}で囲まれた1行以上のコード、 単一の垂直棒(`|')のいずれかを記述することができます。 以下にいくつか例を挙げます。

     hi         |
     bonjour    |
     hello      printf("hello!\n");
     goodbye    {  printf("goodbye!\n"); }
     konnichiwa {
                    line 1
                    ...
                    line n
                }
     sayonara   printf("lex will not "); printf("print this\n");

どの行も複数の文を含むことができます。 `|'は、 そのルールにマッチするものが見つかった場合、 次に現れるルールのアクション部に記述されているアクションが実行されるべきであることをFlexに通知します。

注:ほとんどのバージョンのLexは、 `{'と`}'のペアの外部では単一の文しか許しません (例えば上のsayonaraルールは許されません)。 また、 C以外の言語をターゲットにしているLexでは、 `{'と`}'のペアは、 例えばPascalの場合のbegin...endのように、 異なるシンボルに置き換える必要があるかもしれません。

ルールにマッチしなかった入力に対するデフォルトのアクションは、 それをstdoutに出力することであり、 一方、 マッチしたパターンに対するデフォルトのアクションは、 それを破棄することであるという点に注意してください。 これは、 最も単純なFlexの定義が

     %%

であることを意味しています。 これは、 入力を変更せずそのままstdoutへ出力するものです。 別の単純な例として以下のようなものがあります。

     %%
     foobar

この場合、 入力の中から`foobar'という文字の並びをすべて取り除き、 取り除いた結果をstdoutに出力します。