为什么用字典
符号表用字典而不是列表来存,最直接的原因是【0】。
三句 let 建出的表
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg = "hi" ;
补全:登记一个名字
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 declare(sym, name, typ, line, col):名字已经在表里就抛 Se
补全:查一个名字
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 lookup(sym, name):在表里就交回类型,不在就交回 None。
补全:走一遍顶层语句
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg = "hi" ;
块里的名字出了块
贯穿的源码: let rate = 12 ; let msg = "hi" ; let total = rate * 3 ; if ( total >= 30 ) { let big = 1 ; total = t
里外同名
外面 let x = 1 ;,块里又 let x = "s" ;。这段程序的语义是【0】。
从哪一层开始查
块里亮起来的名字,出了块还亮吗 ? 符号表变成了一叠:每进一个块压一层。查一个名字的顺序是【0】。
两层表各查一次
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) Scope 有 parent:lookup 先查自己、再查 parent。外层登记 x 是 num,
出了块再用
块里亮起来的名字,出了块还亮吗 ? (每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 贯穿的源码: let rate = 12 ; let msg =