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 の代わりに stdout へ lex の出力が書き込まれるため、以下のように出力をリダイレクトすることができます。
$ 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 に示します。