补全:遮蔽合法,同层重复不合法

补全:遮蔽合法,同层重复不合法

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 下面的 declare 用 lookup 查重,把「块里再

阅读更多 →
补全:块要开新的一层

补全:块要开新的一层

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg

阅读更多 →
补全:顺着 parent 往外查

补全:顺着 parent 往外查

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 Scope.lookup:从自己开始,一层层沿 par

阅读更多 →
出了块再用

出了块再用

块里亮起来的名字,出了块还亮吗 ? (每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let r

阅读更多 →
两层表各查一次

两层表各查一次

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) Scope 有 parent:lookup 先查自己、再查

阅读更多 →
从哪一层开始查

从哪一层开始查

块里亮起来的名字,出了块还亮吗 ? 符号表变成了一叠:每进一个块压一层。查一个名字的顺序是【0】。

阅读更多 →
里外同名

里外同名

外面 let x = 1 ;,块里又 let x = "s" ;。这段程序的语义是【0】。

阅读更多 →
块里的名字出了块

块里的名字出了块

贯穿的源码: let rate = 12 ; let msg = "hi" ; let total = rate * 3 ; if ( total >= 30 ) { let

阅读更多 →
补全:走一遍顶层语句

补全:走一遍顶层语句

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg

阅读更多 →
补全:查一个名字

补全:查一个名字

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 lookup(sym, name):在表里就交回类型,

阅读更多 →