Next: , Previous: Other Flex Features, Up: Other Flex Features


5.1 大文字・小文字を区別しないスキャナ

多くの言語は、 その識別子において大文字・小文字を区別しません(Pascal、basicfortran等)。 Lexにも、 大文字・小文字を区別しないスキャナを指定するための方法がありますが、 それらは概して美しくなく、 理解するのも困難です。 個々の文字を置き換えてくれる定義を、 長いリストにして作成することも可能ですし、 すべての識別子を受け付ける1つのルールを作成し、 そのルールにおいて大文字・小文字を変換してから、 トークンの種類を返すようにすることも可能です。 以下のコードは、 この2つの方法を示すものです。 定義を使うのであれば、以下のようになります。

     A [aA]
     B [bB]
      ...
     Z [zZ]
     %%
     {B}{E}{G}{I}{N}      return(BEGIN_SYM);
     {E}{N}{D}            return(END_SYM);

これに似た操作をサブルーチンで実行するのであれば、 以下のようにします。

     ALPHA      [a-zA-Z]
     NUM        [0-9]
     ALPHANUM   {ALPHA}|{NUM}
     %%
     {ALPHA}{ALPHANUM}*     return(convert_and_lookup(yytext));

もっともこれは、 関数呼び出しの必要があるため、 効率が悪くなります (Flexでは、 パターンの複雑さは大した影響をもたらしません)。

ほかにもこれと同じことを行う方法がありますが、 いずれもエレガントではありません。

========================================================================

========================================================================