交付一:Scope
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。)
类型只有 num / str / bool:数字是 num,字符串是 str;+ - * / 两边都是 num 得 num,+ 两边都是 str 得 str;比较运算两边同类得 bool;其余是类型不匹配。let 把名字登记进当前作用域,类型取右边;同一作用域重复 let 是重复声明;赋值要求名字已登记、右边类型等于登记的类型;if / while 的条件必须是 bool,块开新作用域。
从零写出 Scope:declare(同层重复抛 SemError("重复声明「名字」", 行, 列),文案和 n03_q6 一样)和 lookup(沿 parent 往外查,没有交回 None)。
全部评论