推断的顺序
推 ( 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 打树时把类型跟在节点后面