Langphilia! / KL1 / klex, 2002-07-13
GNU autoconf, automake, flex を使って KL1 項の字句解析器を作ってみる。
-- 以降は本ページ用のコメントなので、ソースファイルには書かないでね。
AC_INIT(klex.l) -- ソースファイル AM_INIT_AUTOMAKE(klex, 0.2) -- プログラム名とバージョン AC_PROG_CC -- gcc を使う AM_PROG_LEX -- flex を使う AC_OUTPUT(Makefile) -- Makefile を作らせる
bin_PROGRAMS = klex -- 実行ファイル klex_SOURCES = klex.l -- ソースファイル klex_LDADD = @LEXLIB@ -- flex の共有ライブラリを使う
/* klex.l -- lexer for KL1 * Copyright 2002, TAKAGI Yusuke. */ %{ /* 普通は flex と bison を一緒に使うので、それらの間のインタフェイス yylex() * の結果であるトークン型も bison に生成させ、#include "klparse.h" するみたい。 * 今回は flex しか使わないので、トークン型も main() も klex.l の中で定義する。 */ enum token { T_EOF, -- ファイルの終りに到達したら yylex() は 0 を返す T_NONE = 'n', -- 空白類とコメント T_VAR = 'v', -- 変数トークン T_ATOM = 'a', -- 記号トークン T_INT = 'i', -- 整数トークン T_FLOAT = 'f', -- 浮動小数点数トークン T_STRING = 's' }; -- 文字列トークン -- 一文字のトークンは文字コードそのまま %} SPACE [ \f\n\r\t\v] LOWER [a-z] -- 小文字クラス UPPER [A-Z_] -- 大文字クラス ALNUM [0-9a-zA-Z_] -- 英数字クラス SEPARATOR [,(){}\[\]] -- 区切り文字 CBLOCK [/][*]+([^*/]*[*]+)+[/] -- ブロックコメントの正則表現 CLINE [%][^\n]*[\n] -- 行コメントの正則表現 VAR {UPPER}{ALNUM}* -- 変数トークンの正則表現 ATOM {LOWER}{ALNUM}* -- 記号の正則表現 SPE [~+\-*/\^<>=`:.?@#$&]+ -- 特殊記号アトムの正則表現 ONE [!\|;] -- 一文字アトムの正則表現 SIGN [+-]? DEC [0-9]+ INT {SIGN}{DEC} FLOAT {SIGN}{DEC}[.]{DEC}([e]{SIGN}{DEC})? -- 空白を入れてはいけません。 STRING \"([^\"\n\\]|\\\n|\\.)*\" %% /* 空白類とコメントを読み飛ばす。 */ {SPACE}+ {CBLOCK} {CLINE} {SEPARATOR} { return yytext[0]; } /* 記号ではない一文字のトークン */ {VAR} { return T_VAR; } /* 変数トークン */ {ATOM}|{SPE}|{ONE} { return T_ATOM; } /* 記号トークン */ {INT} { return T_INT; } {FLOAT} { return T_FLOAT; } {STRING} { return T_STRING; } . { return T_NONE; } %% extern int main(int argc, char** argv) { for(;;){ enum token token = yylex(); if(token == T_EOF) break; printf("<%c>%s%c>\n", token, yytext, token); } }