补全:遮蔽合法,同层重复不合法
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 下面的 declare 用 lookup 查重,把「块里再
补全:块要开新的一层
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg
补全:顺着 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):在表里就交回类型,