实现 3/5:函数与帧

👁️ 2 人浏览 💬 0 人评论 ❤️ 添加收藏

(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         弹栈当返回值、弹帧、压回调用者的栈

在 2/5 的基础上:编译 fn(函数体单独一段,末尾 PUSH 0 / RETURN)、return、call(参数、CALL 名 个数);VM 改成帧栈(每帧 [代码, pc, env, 栈, 名]),CALL 压帧、RETURN 弹帧把值给调用者。跑前三段。

提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论