补全:条件必须是 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】。

开始练习 →