补全:把类型打出来
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 show_t 的 bin 分支:左、运算符、右,外加括
补全:把类型记进 ann
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 annotate:推类型的逻辑和 type_of 一样
前三句的装饰树
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg
带类型的树
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) annotate 推类型时把每个表达式节点的类型记进 ann
标注放在哪
这条路线的节点是元组,改不了。给节点加类型标注,可行的办法是【0】。
为什么把类型写回树
类型已经推出来了,语义分析还要把它「标注」在树的节点上。这样做的好处是【0】。
补全:类型顺着名字传下去
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) let d = c ; 的右边只是一个名字。补全 type_
补全:记下推断的轨迹
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 trace(n, scope, out):bin 节点
补全:let 的类型不能一律当 num
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 下面 check_stmt 的 let 分支还用着 n02
一段程序推出的表
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 五句 let,右边分别是数字、字符串、字符串拼接、乘法、比较