Flex(Fast Lexical Analyzer Generator)とは、正規表現で書かれた定義ファイルからC言語の字句解析プログラム(スキャナ)を自動生成するツールです。 [1, 2]
元々はUNIX標準のlexというツールがあり、Flexはその機能を拡張したオープンソースの互換バリアントにあたります。 [3]
📊 字句解析の役割とFlexの位置づけ
コンパイラがプログラムを処理する際、最初のステップとして字句解析(トークン化)を行います。 [4, 5]
- 字句解析(Flexの担当)
ソースコードの文字列を、意味のある最小単位(トークン)に分解します。- (例)
if (x == 10)➔[if] [(] [x] [==] [10] [)][6]
- (例)
- 構文解析(Bisonなどの担当)
分解されたトークンの並びが、言語の文法規則に合っているかを判定します。 [7, 8]
Flexは、この1つ目のステップである「文字列からトークンを切り出すプログラム」を自動で作ってくれます。 [2, 5]
⚙️ Flexプログラムの基本構造
Flexのソースファイル(拡張子は通常 .l または .lex)は、3つのセクションから構成されています。 [2, 9]
/* 1. 定義部(マクロやC言語のヘッダなどを記述) */
%{
#include <stdio.h>
%}
%%
/* 2. 規則部(正規表現と、一致したときのC言語アクションを記述) */
[0-9]+ { printf("数値が見つかりました: %s\n", yytext); }
[a-zA-Z]+ { printf("識別子が見つかりました: %s\n", yytext); }
[ \t\n] { /* 空白や改行は無視 */ }
. { printf("その他の文字: %s\n", yytext); }
%%
/* 3. ユーザコード部(メイン関数などを記述) */
int main(void) {
yylex(); /* 字句解析を開始する関数 */
return 0;
}
int yywrap(void) { return 1; }
🛠️ 動作の流れ
.lファイルの作成:上記の規則を記述したファイル(例:scanner.l)を用意します。- Cコードの生成:
flex scanner.lコマンドを実行すると、lex.yy.cという字句解析用のC言語プログラムが生成されます。 - コンパイル:
gcc lex.yy.c -o scannerで実行ファイルを書き出し、テキストを入力すると自動で判定・処理してくれます。 [10]
構文解析器を自動生成するツール Bison(yaccの互換ツール) と組み合わせて、自作のプログラミング言語やコンパイラ、インタプリタを開発する際によく利用されます。 [10, 11]
もし具体的なコンパイラ作成に興味がある場合は、簡単な電卓プログラムの作り方や、Bisonとの連携方法について詳しく解説を続けることも可能です。どのような情報が必要か教えてください!
[1] https://hatada.stars.ne.jp
[2] https://guppy.eng.kagawa-u.ac.jp
[3] https://www.asahi-net.or.jp
[4] https://p-www.iwate-pu.ac.jp
[7] https://developer.mozilla.org
[9] https://www.momoyama-usagi.com
