多くの言語は、 その識別子において大文字・小文字を区別しません(Pascal、basic、fortran等)。 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では、 パターンの複雑さは大した影響をもたらしません)。
ほかにもこれと同じことを行う方法がありますが、 いずれもエレガントではありません。
========================================================================
========================================================================