| 原作者 | マイク・レスク、エリック・シュミット |
|---|---|
| 初回リリース | 1975年 |
| リポジトリ |
|
| 書かれた | C |
| オペレーティング·システム | Unix、Unix ライク、Plan 9 |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
| ライセンス | プラン9: MITライセンス |
Lex は、字句解析器(「スキャナ」または「レクサー」)を生成するコンピュータ プログラムです。 [1] [2]これは、 yaccパーサ ジェネレーターでよく使用され、多くのUnixおよびUnix 系システムで標準の字句解析器ジェネレーターです。同等のツールは、POSIX標準の一部として指定されています。[3]
Lex は、字句解析器を指定する入力ストリームを読み取り、 C プログラミング言語で字句解析器を実装するソース コードを書き込みます。
Cに加えて、Lexの古いバージョンのいくつかはRatforで字句解析器を生成することができました。[4]
歴史
Lexはもともとマイク・レスクとエリック・シュミットによって書かれ[5]、1975年に説明されました。 [6] [7] その後の数年間で、Lexは多くのUnixおよびUnix系システムの標準的な字句解析器ジェネレータになりました。1983年には、Lexはベル研究所のライセンスの下でチャールズ・リバー・データ・システムズのUNOSオペレーティングシステムで利用できるいくつかのUNIXツールの1つでした。 [8] もともとプロプライエタリソフトウェアとして配布されていましたが、Lexのいくつかのバージョンは現在オープンソースになっています。オリジナルのプロプライエタリコードに基づいたLexのオープンソースバージョンは、現在ベル研究所のOpenSolarisやPlan 9などのオープンソースオペレーティングシステムで配布されています。Lexの人気のあるオープンソースバージョンの1つであるflex、または「高速字句解析器」は、プロプライエタリコーディングから派生したものではありません。
Lexファイルの構造
Lex ファイルの構造は意図的に yacc ファイルの構造に似ています。ファイルは 3 つのセクションに分かれており、次のように 2 つのパーセント記号のみを含む行で区切られています。
- 定義セクションでは、マクロを定義し、Cで記述されたヘッダー ファイルをインポートします。ここで任意の C コードを記述することもできます。これは、生成されたソース ファイルにそのままコピーされます。
- ルールセクションでは、正規表現パターンを C ステートメントに関連付けます。入力内のテキストが指定されたパターンに一致すると、レキサーは関連付けられた C コードを実行します。
- Cコードセクションには、生成されたソース ファイルにそのままコピーされる C ステートメントと関数が含まれます。これらのステートメントには、ルール セクションのルールによって呼び出されるコードが含まれていると考えられます。大規模なプログラムでは、このコードをコンパイル時にリンクされる別のファイルに配置する方が便利です。
Lexファイルの例
以下は、Lex のflexバージョンの Lex ファイルの例です。入力内の数値 (正の整数) の文字列を認識し、それを単純に出力します。
/*** 定義セクション ***/
% {
/* そのままコピーされる C コード */
#include <stdio.h> % }
%%
/*** ルールセクション ***/
/* [0-9]+ は 1 つ以上の数字の文字列に一致します */
[ 0-9 ] + { /* yytext は一致したテキストを含む文字列です。 */ printf ( "整数が検出されました: %s \n " , yytext ); }
. | \ n { /* その他の文字はすべて無視します。 */ }
%%
/*** C コードセクション ***/
int main ( void ) { /* 字句解析器を呼び出して終了します。 */ yylex (); return 0 ; }
この入力が に与えられた場合flex、それは C ファイル に変換されます。これは、整数の文字列に一致して出力する実行可能ファイルにコンパイルできます。たとえば、次の入力があるとします。
lex.yy.c
abc123z.!&*2gj6
プログラムは次のように出力します:
整数を見た: 123 整数を見た: 2 整数を見た: 6
Lexを他のプログラミングツールと併用する
パーサージェネレーターでLexを使用する
Lex は、他の字句解析ツールと同様に、正規表現で記述できるルールのみに制限します。このため、Lex は、言語のチョムスキー階層で示される有限状態オートマトンによって実装できます。より複雑な言語を認識するために、Lex はYaccやBisonなどのパーサー ジェネレーターとともに使用されることがよくあります。パーサー ジェネレーターは、形式文法を使用して入力ストリームを解析します。
通常は、文字のストリーム (「文字ストリーム」) を直接処理するのではなく、たとえば Yacc によって生成されたパーサーがトークンのストリーム (「トークン ストリーム」) を入力として受け入れる方が望ましいです。Lex は、このようなトークン ストリームを生成するためによく使用されます。
スキャナレス解析とは、明確な字句解析器を使用せずに入力文字ストリームを直接解析することを指します。
Lexとmake
makeはLexを含むプログラムを保守するために使用できるユーティリティです。makeは拡張子を持つファイルを.lLexソースファイルであると想定します。make内部マクロをLFLAGS使用して、makeによって自動的に呼び出されるLexオプションを指定できます。[9]
参照
参考文献
- ^ レヴィン、ジョン・R. ; メイソン、トニー; ブラウン、ダグ (1992). lex & yacc (第2版).オライリー. pp. 1–2. ISBN 1-56592-000-7。
- ^ レヴィン、ジョン(2009年8月)。flex & bison。オライリーメディア。p. 304。ISBN 978-0-596-15597-1。
- ^ The Open Group Base Specifications Issue 7、2018年版 § シェルとユーティリティ § ユーティリティ § lex
- ^ John R. Levine、John Mason、Doug Brown ( 1992 )。Lex & Yacc。O'Reilly。ISBN 9781565920002。
- ^ Lesk, ME; Schmidt, E. 「Lex – 語彙解析ジェネレーター」。2012年7月28日時点のオリジナルよりアーカイブ。2010年8月16日閲覧。
- ^ Lesk, ME; Schmidt, E. (1975 年 7 月 21 日)。「Lex – 字句解析ジェネレーター」(PDF)。UNIXタイム シェアリング システム:UNIX プログラマーズ マニュアル、第 7 版、第 2B 巻。bell-labs.com。2011年12 月 20 日閲覧。
- ^ Lesk, ME (1975 年 10 月)。「Lex – 語彙解析ジェネレーター」。Comp . Sci. Tech. Rep. No. 39。ニュージャージー州マレーヒル: ベル研究所。
- ^ The Insider's Guide To The Universe (PDF) . Charles River Data Systems, Inc. 1983. p. 13.
- ^ "make". The Open Group 基本仕様(6). The IEEE および The Open Group. 2004. IEEE Std 1003.1、2004 版。
外部リンク
- Macworld.com での Flex と Bison の使用
- – Solaris 11.4ユーザーコマンドリファレンスマニュアル
- – Plan 9プログラマーズマニュアル、第 1 巻
