交付:块里允许遮蔽外层同名

交付:块里允许遮蔽外层同名

场景:~/sem/checker.py 现在把「块里再 let 一个外层已有的名字」当成重复声明。 任务:让遮蔽合法——块里可以 let 同名(只查当前这一层),块里用的是内层的类型,出了块外层的名字

阅读更多 →
一次报全部,块里的也别漏

一次报全部,块里的也别漏

场景:~/sem/checker.py 现在每个文件只报第一处语义错误就停。 任务:让它一次报全部——每条语句独立检查(块里的语句也一样),错了记下来继续下一条,最后所有错误按位置排序、每条一行打出;

阅读更多 →
报出声明了却没用过的名字

报出声明了却没用过的名字

场景:~/sem/checker.py 能报错误,但不报「声明了却从没用过」的名字。 任务:加上未使用警告——每个作用域结束时,凡是 let 过却从没被查过的名字,各打一行「文件名: 警告 未使用「x

阅读更多 →
修好检查器里的规则 bug

修好检查器里的规则 bug

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

阅读更多 →
顶层符号表是哪一张

顶层符号表是哪一张

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

阅读更多 →
错在第几行第几列

错在第几行第几列

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

阅读更多 →
哪个名字没声明过

哪个名字没声明过

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

阅读更多 →
八个文件一共几处语义错误

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

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

阅读更多 →
从批量输出里分门别类

从批量输出里分门别类

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

阅读更多 →
语法过了才轮到语义

语法过了才轮到语义

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

阅读更多 →