lex コマンドによる字句解析プログラムの生成
lex コマンドは、 文字ストリーム入力を受け取ってそれをプログラムのアクションに変換する、C 言語のプログラムの作成を支援します。
lex コマンドを使用する場合は、 以下のものが入っている仕様ファイルを用意するか、または作成する必要があります。
- 拡張正規表現
- 生成された字句解析プログラムが認識できる文字パターン。
- アクション・ステートメント
- 生成された字句解析プログラムが認識できる拡張正規表現に対して、 どのように対応するかを定義する C 言語のプログラム・フラグメント。
このファイルで使用可能なフォーマットとロジックについては、「コマンド・リファレンス 第 3 巻」の lex コマンドを参照してください。
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 プログラムを使用して、 仕様ファイルを C 言語プログラムに変更します。 変更されたプログラムは lex.yy.c ファイルに入れられます。
- -ll フラグを指定した cc コマンドを使用して、lex サブルーチンのライブラリーを用いてプログラムのコンパイルとリンクを行います。 結果の実行可能プログラムは、 a.out ファイルにあります。
lex lextest
cc lex.yy.c -ll