lex
出典: フリー百科事典『ウィキペディア(Wikipedia)』
lex(レック、レックス)はレキシカル・アナライザ(字句解析プログラム、字句解析器)を生成するプログラムである。パーサージェネレータ(構文解析プログラム生成)プログラムであるyaccとともに使用されることが多い。lexはエリック・シュミットとマイク・レスクによって書かれunixにおける標準のレキシカル・アナライザとなっており、POSIX標準ともなっている。lexと同等の機能を有するflexがある。
[編集] lex のファイル構造
lexのファイル構造は意識的にyaccのそれに似せて定義されている。 ファイルは3つの部分に分割されており、それぞれ定義領域、規則領域、Cコード領域である。各領域はパーセント記号2つ(%%)のみを含んだ行で区切られる。
定義領域は正規表現を用いてマクロを定義するところであり、かつCのヘッダーファイルを取り込む場所でもある。
規則領域は最も重要な領域でありCの命令との関連付けを行う。lexの規則と一致するパターンがあるとそれに関連付けされたCコードを実行する。
Cコード領域には生成したソースにそのままコピーされるCの命令や関数が含まれている。 これらの命令は規則領域での規則により呼ばれたコードを含む場合もある。大規模なプログラムではここに分割して置きコンパイル時にリンクするほうが便利である。
[編集] flex用のサンプルファイル
次の例はflex版の入力ファイルのサンプルである。これは入力中の整数値を認識する。 "abc123z.!&*24ghj6"という入力があると次のような表示を行う。
Saw an integer: 123 Saw an integer: 24 Saw an integer: 6
/* * flex用字句解析 例 * * 数値(整数値)を入力を取り出す. */ /*** Definition section ***/ %{ /* * C コードにはCの標準I/O ライブラリを使うものがある. * %{と %} で囲まれた部分はそのまま生成ファイルに * 取り込まれる. */ #include <stdio.h> %} /* マクロ; 正規表現 */ DIGIT [0-9] INTEGER {DIGIT}+ /* これはflexに入力ファイルが一つであることを示す. */ %option noyywrap %% /* * 規則領域 * * コメントはインデントしなければならない. * そうしないと正規表現と誤認識してしまう. */ {INTEGER} { /* * この規則は入力から整数を表示する. * yytextには一致した文字列が含まれる. */ printf("Saw an integer: %s\n", yytext); } . { /* それ以外の文字は無視. */ } %% /*** Cコード領域 ***/ /* * メインプログラム. * * 字句解析を呼び出し、処理が済むと終了する. */ int main(void) { /* yyin はlexが読むファイルでここでは標準入力になっている. */ FILE *yyin = stdin; /* 字句解析の呼び出し. */ yylex(); return 0; }