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);
}
}