プログラミングユーティリティ

字句アナライザプログラムの生成

lex は、ユーザーが作成したソース仕様から C 言語スキャナを生成します。この仕様には、入力テキスト内で検索される文字列 (式) と、式が見つかったときに実行するアクションが示す、規則のリストが含まれています。lex 仕様の作成方法については、lex ソースの作成」を参照してください。

字句アナライザの C ソースコードは、以下のコマンドを実行すると生成されます。

$ lex lex.l

lex.1 は、lex 仕様が記述されているファイルです。(慣例的に lex.1 という名前が使用されていますが、この名前は自由に選択できます。ただし接尾辞の .l は、他のシステムツール、特に make によって認識される規約なので、注意してください。) ソースコードは、デフォルトで、lex.yy.c という名前の出力ファイルに書き込まれます。このファイルには、指定した式が入力ファイル内で見つかるごとに 1 を返し、ファイルの終わりを検出すると 0 を返す yylex() という関数の定義が含まれています。yylex() を呼び出すと、トークンが 1 つ構文解析されます (結果は yylex() に返されます)。yylex() を再度呼び出すと、yylex() は最後に構文解析したトークンの次のトークンから構文解析を再開します。

以下の例のように、複数のファイルにまたがった仕様に対して lex を実行しても、 lex.yy.c というファイルが 1 つ生成されます。

$ lex lex1.l lex2.l lex3.l

-t オプションを付けて lex を呼び出すと、lex.yy.c の代わりに stdoutlex の出力が書き込まれるため、以下のように出力をリダイレクトすることができます。

$ lex -t lex.l > lex.c

lex のオプションは、コマンド名とファイル名の引数の間に入力します。

入力テキストの字句解析を行う実行可能オブジェクトプログラム (スキャナ) を生成するためには、lex.yy.c (または、lex.yy.c のリダイレクト先の .c ファイル) に保存された字句アナライザのコードをコンパイルする必要があります。

lex ライブラリは、関数 yylex() を呼び出すデフォルトの main() を提供します。したがって、ユーザーは独自の main() を用意する必要はありません。このライブラリにアクセスするには、以下のように cc-ll オプションを付けてコンパイルします。

$ cc lex.yy.c -ll

また、ユーザーは独自のドライバを作成することもできます。lex ライブラリのドライバに類似したコードを以下に示します。

extern int yylex(); 

int yywrap()
{
     return(1); 
}

main()
{
     while (yylex());
         ;
}

関数 yywrap() についての詳細は、lex ソースの作成」を参照してください。以下のように、lex.yy.c と共にドライバファイルをコンパイルすると、lex ライブラリがロードされているかのように、その main() は実行時に yylex() を呼び出します。

$ cc lex.yy.c driver.c

生成された実行可能ファイルは、stdin を読み取り、出力を stdout に書き込みます。lex による処理の流れを図 2-1 に示します。

図 2-1 lex による字句アナライザの作成と使用

Graphic