Next: , Previous: Optional C Code, Up: Flex Descriptions


3.3 定義

定義セクションにおいて、 プログラマは、 ある文字のグループに一意な識別子を与え、 その識別子がその文字グループに置き換えられるようにすることができます。 定義は以下のような形式になります。

     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を参照してください。


Footnotes

[1] 訳注:Flex 2.5では、 ‘-l’オプションを指定して生成されたスキャナは、 Lexの場合と同じように、 定義を展開する時に丸括弧( )で囲みません。