次: %%, 前: Optional C Code, 上: Flex Descriptions
定義セクションにおいて、 プログラマは、 ある文字のグループに一意な識別子を与え、 その識別子がその文字グループに置き換えられるようにすることができます。 定義は以下のような形式になります。
definition_name definition
definition_nameは最初のカラムから始まらなければならず、 そうしないとその定義はlex.yy.cにそのままコピーされてしまうということに注意してください。 以下に一般的な定義をいくつか挙げます。
DIGIT [0-9] LETTER [a-z] IDENT [a-z_][a-z0-9_]* ALPHANUM {LETTER}|{DIGIT}
definition nameは、
そのグループの一意な識別子でなければなりません。
また、
definitionはルール・セクション(後述)において正当なものであれば何でも構いません。
ルール・セクションや
(上の例のALPHANUM
の定義において示されるように)
別の定義中において使われる場合には、
定義は`{ }'によって囲まれていなければなりません。
FlexとLexの非常に重要な相違点に、 定義を展開する時、 Flexは字義どおりに丸括弧( )で囲むのに対して、 Lexは囲まないという点があります。1 これは、 `^'、`<<EOF>>'、`$'、`/'を定義中に入れることができないことを意味しています。 というのは、 前述の文字は丸括弧( )で囲まれた部分に入れることができないからです。 詳細は、 CharactersおよびFlex and Lexにおいて説明します。
例えば、
FUNCTION ^[a-zA-Z_][a-zA-Z0-9_]*"(" %% {FUNCTION} printf("got a function\n");
は、 以下のようなプログラミング・スタイルを使っている場合の、 Cの関数宣言にマッチするように見えます。
int foo() { ... }
しかし実際にはうまくいきません。
というのは、
{FUNCTION}
が展開されると、
(^[a-zA-Z_][a-zA-Z0-9_]*)
のようになりますが、 これは不正だからです。 このような種類の問題に関する説明については、 Flex and POSIXを参照してください。