次: , 前: Introduction, 上: Introduction


1.1 問題解決手段としてのFlex

Flexはプログラマに対して、 字句解析処理部分をきれいに記述し、 その記述にしたがった効率的な字句スキャナを生成する方法を提供します。 プログラマはFlexに対して、 必要なスキャナに関する記述情報を提供します。 Flexはその記述情報を使って、 C言語で書かれたスキャナを生成します。 記述に使われる言語は上級言語であり、 スキャナの記述に関してはC言語よりもはるかに適しています。 その上級言語を使うことで、 プログラマは、 文字をどのようにグループ化し、 グループ化が完了した時にどのようなアクションを発生させるかを指定することができます。

注:このマニュアルのほとんどの部分はFlex、Lexの両方を対象にしています。 Lexは (Flexには劣りますが) ほとんどのUnixシステム上にある標準のスキャナ生成ユーティリティです。 両者の間に違いがある場合には、 Flexを優先させています。 Lexについては標準Lexで簡単に説明してあります。

ここでも1つの良い例がコンパイラです。 前に議論したように、 コンパイラの構文チェッカは、 文字が連続したものではなく、 言語文法の構成要素を表すトークンが連続したものを、 入力として受け取る必要があります。 Flexはこのような場合に最適です。 Flexによって生成されたスキャナが構文チェッカとファイルの仲介役となり、 構文チェッカが次の意味のあるトークンを要求するのを待ちます。 Flexはファイルを読み、 プログラマが与える記述にしたがって文字をグループ化して、 マッチしたトークンを返却します。 この処理は、 スキャナもしくはパーサが終了するまで続きます。

Cのコンパイラを作成する場合、 このようなことを行うために必要となるFlexの記述情報は、 コードの行数にして100行から300行くらいになるかもしれません。 この記述情報のほとんどは、 シンボル・テーブルの管理、識別子の検索、型のマッピング、ある数の値等の追加情報の返却を行うための補助的なCコードになるでしょう。 こうしたコード自体は記述情報の一部ではありませんが、 通常、 コンパイラによって必要とされるものです。

概念的にはFlexは、 原材料(文字)を取り込み、 消費者(パーサ等)がすぐに使うことができる完成品(トークン)を製造する工場のようなものです。