lisp on yarv製作日誌1
今日から、卒研作成しているLispの処理系の製作日誌を書くことにしました。
今日は、if文を使えるようにしました。
| tLPAREN keyword_if sexp sexp sexp ')' { $$ = NEW_LIF($3, $4, $5); }
パーサはこんな感じです。
次はコンパイルの部分
case NODE_LIF:{ LABEL *else_label, *end_label; else_label = NEW_LABEL(nd_line(node)); end_label = NEW_LABEL(nd_line(node)); //cond lisp_compile(iseq, ret, node->nd_lcond, poped); ADD_INSNL(ret, nd_line(node), branchunless, else_label); //then lisp_compile(iseq, ret, node->nd_lt, poped); ADD_INSNL(ret, nd_line(node), jump, end_label); //else ADD_LABEL(ret, else_label); lisp_compile(iseq, ret, node->nd_lf, poped); ADD_LABEL(ret, end_label); break; }
わりと簡単にできました。
で実行してみると、
def ==(i, j) i==j end lblock (if (== 10 10) (puts 10) (puts 20)) end
ちゃんと10が表示されます。