推断的顺序

推 ( rate * 3 ) >= 30 的类型时,先算出来的是【0】。

开始练习 →

推不出来怎么办

let x = y ;,而 y 从没声明过。此时 x 的类型【0】。

开始练习 →

自底向上的轨迹

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) trace 按「先孩子后自己」的顺序记下每个表达式节点的类型。看 ( rate * 3 ) >

开始练习 →

一段程序推出的表

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 五句 let,右边分别是数字、字符串、字符串拼接、乘法、比较。看符号表: KEYWORDS = (&

开始练习 →

补全:let 的类型不能一律当 num

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 下面 check_stmt 的 let 分支还用着 n02 那条笨规则(右边是字符串才 str,其余

开始练习 →

补全:记下推断的轨迹

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 trace(n, scope, out):bin 节点先对左右孩子递归,然后把自己的类型追加进

开始练习 →

补全:类型顺着名字传下去

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) let d = c ; 的右边只是一个名字。补全 type_of 的 var 分支(查表交回类型),

开始练习 →

为什么把类型写回树

类型已经推出来了,语义分析还要把它「标注」在树的节点上。这样做的好处是【0】。

开始练习 →

标注放在哪

这条路线的节点是元组,改不了。给节点加类型标注,可行的办法是【0】。

开始练习 →

带类型的树

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) annotate 推类型时把每个表达式节点的类型记进 ann;show_t 打树时把类型跟在节点后面

开始练习 →