%{ /* 動作記述のなかで用いる関数の定義や宣言をここに書く。 */ /* 次の 2 行は決まり文句 */ #define YY_SKIP_YYWRAP int yywrap(void) { return 1; } %} %option always-interactive /* ここは正規表現の定義(良く使う正規表現に名前をつける) */ /* 行頭に空白を入れないようにしてください。 */ delim [ \t] ws {delim}+ letter [A-Za-z] digit [0-9] ident {letter}({letter}|{digit})* number {digit}+(\.{digit}+)?(E[+\-]?{digit}+)? %% /* ここに動作記述を書く。*/ /* ECHO はマッチした文字列をそのまま出力するマクロ */ {ws} { putchar('_'); } {number} { printf(""); ECHO; printf(""); } {ident} { printf(""); ECHO; printf(""); } "." { ECHO; exit(1); } .|\n { ECHO; } /* 上の動作記述では値を返していないが、動作記述の中で return 文を書くと、yylex 関数の戻り値になる。(これが本来の使い方)*/ %% /* その他の関数の定義などをここに書く。*/ int main (void) { return yylex(); } /* この例では lexer 単独で動作させるので main 関数を定義し、 その中で yylex 関数を呼んでいる。*/