前三句的装饰树

(每道题开头都有同一段:上一站的 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;+ - * / 两边都

开始练习 →