ルールはFlexの心臓部です。 ルールを書くことによって、 プログラマは、 スキャナが何を実行するべきであるかをFlexに通知します。
通常、 ルールは2つの部分から構成されます。
pattern actions
このうちpatternが何を認識するべきかを定義し、 actionsがその何かを認識した時に何を実行するべきであるかをスキャナに知らせます。 patternの部分は空白によって区切られます。 これは、 空白をマッチさせたい場合には、 それを引用符で囲む必要があるということを意味しています。
スキャナは、 マッチするものを2つ以上見つけた場合、 以下の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
に出力します。