交付三:四种语句

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 类型只有 num / str / bool:数字是 num,字符串是 str;+ - * / 两边都

开始练习 →

交付四:一次报全部

(每道题开头都有同一段:上一站的 parser(多记了位置)、show(),和错误类 SemError——错误写成一行「原因@行:列」。) 从零写出 check_all(program)(逐句 try,错了收进列表继续)和 report(e

开始练习 →

交付五:五条验收

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

开始练习 →

语法过了才轮到语义

真机上 checker.py 对一批文件先做语法分析再做语义检查。某个文件有语法错误时,它对这个文件【0】。

开始练习 →

从批量输出里分门别类

真机上 checker.py 每个文件打若干行:错误、警告 或 OK。要在脚本里汇总,先在这里练: lines = ["a.toy: 错误 未定义「x」@2:1", "a.toy: 警告 未使用「y」@1:5&

开始练习 →

八个文件一共几处语义错误

场景:实验机的 ~/sem 里是这条路线的语义检查器 checker.py(开头有用法)和目录 src/,八个 .toy 文件都能通过语法分析。家目录有一份对照表:八个数各配一个标记。 任务:查出八个文件一共有多少处语义错误(警告不算),到

开始练习 →

哪个名字没声明过

场景:~/sem/src/main.toy 语法没问题,但有一处语义错误:某个名字用到了却「没声明过」。对照表按名字配了标记。 任务:用 checker.py 找出这个名字,到对照表里查它对应的标记。⚠️ 用眼睛找 let 会被骗——想想作

开始练习 →

错在第几行第几列

场景:~/sem/src/main.toy 有一处类型不匹配。对照表列了八个「行:列」位置,各配一个标记。 任务:用 checker.py 查出它报的位置,到对照表里查这个位置对应的标记。⚠️ 位置是 checker 报的那个 token

开始练习 →

顶层符号表是哪一张

场景:~/sem/src/main.toy 里的名字没有一个写了类型,全靠推断。对照表列了八张顶层符号表,只差一两个类型。 任务:查出它顶层作用域的符号表(checker.py 有个只打符号表的开关,看开头用法),到对照表里查那一行对应的标

开始练习 →

修好检查器里的规则 bug

场景:~/sem/checker.py 有一个规则 bug:对 src/ 里八个文件跑出来的结果和家目录的 期望.txt 对不上。 任务:只改 checker.py,让 python3 checker.py src/*.toy 的输出和期望

开始练习 →