补全:RETURN 和 MAKE_FN
(每道题开头都有同一段:06 的词法/语法/show、Env、RunError;本条加的 compile_expr / compile_stmt / compile_block / compile_program(树 → 指令列表)、listing(code)(把指令列表打成「序号:指令 操作数|…」)、Code(函数值:名、参数、代码、定义时的环境)、run_code(code, env, out)(栈式 VM,交回执行的指令条数)、run_vm(src)。)
本条的指令集(每条是一个元组):
PUSH 值 把一个常量压栈 LOAD 名 把变量的值压栈
DEFINE 名 弹栈、在当前层登记 STORE 名 弹栈、沿链改变量
BIN 运算符 弹两个、算、压回一个 PRINT 弹栈、打印
POP 弹栈丢掉 JUMP 目标 跳到第几条
JUMP_IF_FALSE 目标 弹栈,假就跳 ENTER / LEAVE 进块开一层 / 出块关一层
MAKE_FN 名 参数 代码 造一个函数值登记 CALL 名 个数 弹参数、压新帧
RETURN 弹栈当返回值、弹帧、压回调用者的栈补全 run_code 的 MAKE_FN(在当前环境登记 Code(名, 参数, 代码, 当前环境))和 RETURN(弹值、弹帧、有调用者就把值压到调用者的栈)。
全部评论