实现 2/5:语句和控制流
(n08 五道题共用一段开头:06 的词法/语法/Env/RunError,五段验收程序 PROGS(和 06 的一样:14|20 / 10 / 81 / 11|12 / 错误:除以零),和 run_progs(编译函数, VM函数, k):把前 k 段各编译、各跑。这五道题自己写编译器和 VM——每题在上一题的基础上加。)
本条的指令集(每条是一个元组):
PUSH 值 把一个常量压栈 LOAD 名 把变量的值压栈
DEFINE 名 弹栈、在当前层登记 STORE 名 弹栈、沿链改变量
BIN 运算符 弹两个、算、压回一个 PRINT 弹栈、打印
POP 弹栈丢掉 JUMP 目标 跳到第几条
JUMP_IF_FALSE 目标 弹栈,假就跳 ENTER / LEAVE 进块开一层 / 出块关一层
MAKE_FN 名 参数 代码 造一个函数值登记 CALL 名 个数 弹参数、压新帧
RETURN 弹栈当返回值、弹帧、压回调用者的栈在 1/5 的基础上:编译 let / assign / if / while(DEFINE / STORE / JUMP / JUMP_IF_FALSE / ENTER / LEAVE,跳转先占位后回填);VM 加这六种指令。跑前两段。
全部评论