补全:条件必须是 bool
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 check_stmt 里 if 和 while 的条件检查:条件类型不是 bool 就报「条件
一条语义错该说什么
对写代码的人最有用的语义错误信息是【0】。
报一个还是报全部
一个文件里有四处语义错误。检查器最好的做法是【0】。
两种错各在什么时候查
「未定义」和「重复声明」这两种错误,检查的时机分别是【0】。
一次报全部
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 五句话里四处错。check_all 逐句检查、记下错误、继续;report 按位置排序汇总: KEY
补全:用到没登记的名字
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 type_of 的 var 分支:查表拿不到就抛「未定义「名字」」,位置在这个名字的 toke
补全:登记时查重
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 Scope.declare:当前层已有同名就抛「重复声明「名字」」,位置在这次 let 的名字
补全:错了记下来继续
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 check_all:对顶层每句 try 一次 check_stmt,抛 SemError 就收
补全:排好序的报告
(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 补全 report(errors):按 (行, 列) 排序,每条写成「行:列:原因」,用 | 连,最
没写类型,类型从哪来
这门语言的 let total = rate * 3 ; 没有写 total 是什么类型,符号表里却登记了 num。这个类型是【0】。