报出声明了却没用过的名字
场景:~/sem/checker.py 能报错误,但不报「声明了却从没用过」的名字。 任务:加上未使用警告——每个作用域结束时,凡是 let 过却从没被查过的名字,各打一行「文件名: 警告 未使用「x」@行:列」(位置是 let 时那个名字
一次报全部,块里的也别漏
场景:~/sem/checker.py 现在每个文件只报第一处语义错误就停。 任务:让它一次报全部——每条语句独立检查(块里的语句也一样),错了记下来继续下一条,最后所有错误按位置排序、每条一行打出;退出码规则不变。写好后运行 ~/chec
交付:块里允许遮蔽外层同名
场景:~/sem/checker.py 现在把「块里再 let 一个外层已有的名字」当成重复声明。 任务:让遮蔽合法——块里可以 let 同名(只查当前这一层),块里用的是内层的类型,出了块外层的名字和类型原样恢复;同一层重复 let 仍然
解释器拿树做什么
树上每个格子,从底下一层层亮上去 下面的先有了,上面的才有 树的形状(05 的形状加新节点): ("num", 3) ("str", "hi") ("var"
先算谁
树的形状(05 的形状加新节点): ("num", 3) ("str", "hi") ("var", "x", 行, 列) (&quo
语句和表达式差在哪
这门小语言(在 03/05 的基础上加了三样): let x = 1 ; x = x + 1 ; if ( c ) { … } else { … } while ( c ) { … } print e ;
环境是什么
树上每个格子,从底下一层层亮上去 下面的先有了,上面的才有 解释器算到 ("var", "total", …),要知道 total 现在是几。它去查的东西叫环境(Env),环境是【0】。
为什么叫「树遍历」
这种解释器叫「树遍历解释器」,相对于后面路线的字节码虚拟机。它的特点是【0】。
沿树走一遍
(每道题开头都有同一段:这门语言的 parser、show()、环境 Env(define / find / get / set,get 和 set 查不到就抛 RunError)、函数值 Closure(name, params, bod
叶子怎么算
树的形状(05 的形状加新节点): ("num", 3) ("str", "hi") ("var", "x", 行, 列) (&quo