2009年11月1日日曜日

cl-yaccでCライクなコードを読む

Rubyライクな構文を読む、というネタを見たときからやってみたいと思ってたのでcl-yaccで遊んでみた。

とりあえず、こんなコードが

int main()
{
for(int x = 1; x < 10; x = x + 1)
{
if(x%2 == 0){
format(t,"~d:偶数~%",x);
}else{
format(t,"~d:奇数~%",x);
}
}
}

こんなコードに変換されるようになった。

(PROGN
(DEFUN MAIN ()
(LOOP :WITH X = 1
:WHILE (< X 10)
:DO (IF (EQUAL (MOD X 2) 0)
(PROGN (FORMAT T "~d:偶数~%" X))
(PROGN (FORMAT T "~d:奇数~%" X)))
(SETF X (+ X 1)))))

readで読み込んだ順のリストを作り、リストの内容が頭から取り出せるlexerを用意し、すさまじく適当な文法のparserでS式に変換している。

また、セミコロンやカンマ、括弧、演算子(+,==等)などはそのままでは CommonLisp用に読み込まれてしまったり他のシンボルの一部になってしまったりするので、リーダマクロでシンボルを返すようにした。

そうしたら今度は、hoge-fugaと書くと(- hoge fuga)にされてしまうという困った状態になった。

この調子だと明日もこのネタで遊んでそう。

0 件のコメント:

コメントを投稿