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