lex コマンドによる字句解析プログラムの生成

lex コマンドは、 文字ストリーム入力を受け取ってそれをプログラムのアクションに変換する、C 言語のプログラムの作成を支援します。

lex コマンドを使用する場合は、 以下のものが入っている仕様ファイルを用意するか、または作成する必要があります。

拡張正規表現
生成された字句解析プログラムが認識できる文字パターン。
アクション・ステートメント
生成された字句解析プログラムが認識できる拡張正規表現に対して、 どのように対応するかを定義する C 言語のプログラム・フラグメント。

このファイルで使用可能なフォーマットとロジックについては、「コマンド・リファレンス 第 3 巻」の lex コマンドを参照してください。

lex コマンドは、 仕様ファイル内の情報を使用して入力ストリームを分析できる C 言語のプログラムを生成します。 その後、lex コマンドは、出力プログラムを lex.yy.c ファイルに保管します。 出力プログラムが単純な 1 ワードの入力構造を認識する場合、 次のコマンドで lex.yy.c 出力ファイルをコンパイルして、実行可能な字句解析プログラムを作成することができます。

cc lex.yy.c -ll

ただし、字句解析プログラムがより複雑な構文を認識する必要がある場合、 出力ファイルで使用するためのパーサー・プログラムを作成し、任意の入力を適切に処理することができます。

lex.yy.c 出力ファイルを、lex ライブラリー関数をサポートする C コンパイラーを備えた別のシステムに移動することができます。

コンパイルされた字句解析プログラムは、以下の機能を実行します。
  • 入力文字ストリームを読み取る。
  • 入力ストリームを出力ストリームへコピーする。
  • 入力ストリームを、lex 仕様ファイル内の拡張正規表現と一致する短い文字列に分割する。
  • 認識した各拡張正規表現についてアクションを実行する。 これらのアクションは、lex 仕様ファイル内の C 言語のプログラム・フラグメントです。 各アクション・フラグメントは、 その外部にあるアクションまたはサブルーチンを呼び出すことができます。

lex コマンドが生成する字句解析プログラムは、 決定性有限状態オートマトン と呼ばれる分析方式を使用します。 この方式では、字句解析プログラムがとりうる有限数の状態、および字句解析プログラムの状態を決定する規則が規定されます。

オートマトンによって、生成された字句解析プログラムは、 入力ストリームの 1 文字または 2 文字以上先を見ることができます。 例えば、lex 仕様ファイル内に 2 つの規則を定義するとします。 一方は文字列 ab を探し、 他方は文字列 abcdefg を探すものです。 字句解析プログラムは、abcdefh という入力文字列を受け取ると、 入力文字列の終わりまで文字を読んでから、 文字列 abcdefg と合致しないことを判別します。 その後、字句解析プログラムは 文字列 ab を探す規則に戻り、 入力の一部と合致することを判別して、 残りの入力 cdefh を使用して他に合致する部分がないかどうか探そうとします。

字句解析プログラムのコンパイル

lex プログラムをコンパイルする手順は、次のとおりです。
  1. lex プログラムを使用して、 仕様ファイルを C 言語プログラムに変更します。 変更されたプログラムは lex.yy.c ファイルに入れられます。
  2. -ll フラグを指定した cc コマンドを使用して、lex サブルーチンのライブラリーを用いてプログラムのコンパイルとリンクを行います。 結果の実行可能プログラムは、 a.out ファイルにあります。
例えば、lex 仕様ファイルが lextest という名前の場合、 次のコマンドを入力します。
lex lextest
cc lex.yy.c -ll