Flexをやってみる

深くやるつもりはないが,少し気になったのでやってみた.参考にしたページはWikipeida.

はじめに

Ubuntu 7.04を使用する.

$ sudo apt-get install flex

flexのコードを書く

以下,Wikipediaに記述してあるコード.flex_sampleという名前で保存する.

/* 
 * 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;
}

コンパイル(?)と実行

$ flex flex_sample
$ gcc lec.yy.c
$ ./a.out
lex123sample456lex789_a1b2c3c4 # 入力
Saw an integer: 123
Saw an integer: 456
Saw an integer: 789
Saw an integer: 1
Saw an integer: 2
Saw an integer: 3
Saw an integer: 4