前三句的装饰树
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg = "hi" ;
补全:把类型记进 ann
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 annotate:推类型的逻辑和 type_of 一样,但每算出一个节点的类型就 ann[id
补全:把类型打出来
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 show_t 的 bin 分支:左、运算符、右,外加括号,括号后跟「:类型」。
补全:给声明标上层数
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg = "hi" ;
补全:数一数标了几种类型
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg = "hi" ;
验收一个语义检查器
交付语义检查器之前,最能说明「它对了」的验收是【0】。
要在树上走几遍
这门语言要求先声明后使用。语义分析要在树上走【0】。
整段源码的表
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg = "hi" ;
交付一:Scope
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 类型只有 num / str / bool:数字是 num,字符串是 str;+ - * / 两边都
交付二:type_of
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 类型只有 num / str / bool:数字是 num,字符串是 str;+ - * / 两边都