前: Optimizing for Speed, 上: Optimization


6.2 サイズの最適化

Flexは、 サイズの小さいスキャナよりも、 むしろ非常に高速なスキャナを作成することを目標としていますが、 いずれにしても、 作成されるテーブルのサイズはLexによるそれと比較しても、 通常はかなり小さいものになります。

デフォルトでは、 Flexは可能な限りサイズの小さいスキャナを作成します。 これは、 コマンドラインで`-Cem'を使うのと同等です。 デフォルトを使うのであれば、 コマンドライン・オプションを気にする必要はありません。

さらにテーブルのサイズを小さくするには、 より大きなテキスト・グループにマッチするルールを使い、 字句の値を認識するためにCのサブルーチンを使うのが最も良い方法です。 この良い例がコンパイラで、 以下のようなルールを与えることができます。

     %%
     begin    return(BEGINSYM);
     end      return(ENDSYM);
     program  return(PROGSYM);
         ...

あるいは、 以下のようにテーブル検索を使うことも可能です。

     [a-zA-Z][a-zA-Z0-9]*  return(lookup(yytext));

ここでは、 一般的なルールが指定されていて、 lookup()がテキストをキーワードにマッチさせ、 そのトークンが何であるかを示す整数値を返します。 これにより、 サイズのより小さいテーブルが生成されますが、 性能は悪くなる傾向があります。 また、 数が少なく複雑ではないルール集合については、 テーブル・サイズを縮小することの効果は、 シンボル・マッピング用の情報をプログラム中の他の領域に格納しなければならないという事実によって、 相殺されるかもしれません。 というのは、 シンボル・マッピング用の情報は、 Flexテーブルと比較して、 より多くのスペースを必要とする可能性があるからです。