课题9:DSL错误提示美化器
难度:中
概述:改进DSL前端出错时的错误报告,显示错误位置(行号、列号)、出错代码行、标记错误位置,并给出修复建议。
详细任务:
1. 修改词法/语法分析器,在解析过程中记录当前行号和列号(基于字符索引)。
2. 自定义异常类DSLSyntaxError,包含行号、列号、错误信息、源码行内容。
3. 在解析函数中捕获异常,抛出DSLSyntaxError。
4. 编写错误格式化函数:输出文件名:行:列: error: 消息,然后打印源码行,下一行用^标记错误位置。
5. 根据常见错误类型提供修复建议(如“缺少右括号”、“未定义的变量”)。
6. 支持多错误收集(不提前退出),输出所有错误。
7. 使用ANSI颜色高亮错误位置和文件名。
交付产物:
- 修改后的dsl_parser.py和错误处理模块
- 测试用例(包含各种语法错误的DSL文件)及对应的预期错误输出
- 文档:如何扩展错误类型
12周每周目标:
- W1:研究现有解析器出错时是否能得到行列号。手动构造错误DSL,观察输出。
- W2:修改解析器,在每次读取一行时记录行号,每匹配一个token记录列号。扩展AST节点携带位置信息。
- W3:自定义异常类DSLSyntaxError,包含行号、列号、消息、源码行。
- W4:在解析函数的关键位置(如期望特定token但未匹配)抛出DSLSyntaxError。测试捕获位置正确性。
- W5:编写错误格式化函数,输出文件名:行:列: error: 消息,并打印源码行和^标记。
- W6:为常见错误添加修复建议词典(如“缺少括号” → “你可能忘了加右括号”)。
- W7:集成到编译器主流程:捕获解析异常并调用格式化函数,优雅退出。
- W8:增加多行错误上下文(显示错误行前后各一行),使用ANSI颜色高亮。
- W9:处理词法错误(如非法字符)同样输出行列号。
- W10:实现错误收集:当有多个错误时,收集所有再一并输出(不提前退出)。
- W11:测试20个以上的错误用例,确保提示清晰且位置准确。
- W12:撰写文档:如何为新的语法规则添加位置跟踪、如何扩展错误建议。