课题1:DSL前端增强器

难度:中

概述:为现有DSL增加条件判断(if/else)和循环(while)语法,扩展解析器并生成对应的三地址码(IR)。

详细任务: 1. 理解现有dsl_parser.py(递归下降解析)和ir_builder.py。 2. 设计新语法的BNF规则:if_stmt -> 'if' '(' cond ')' block ('else' block)?,while_stmt -> 'while' '(' cond ')' block。 3. 修改解析器,增加parse_if()和parse_while()方法,构建AST节点(IfNode, WhileNode)。 4. 扩展IR生成:为IfNode生成条件跳转(BR cond, label_then, label_else)和标签;为WhileNode生成循环结构。 5. 处理嵌套语句,确保标签编号唯一。 6. 编写至少3个完整的DSL程序(含分支和循环),使用后端生成汇编并用模拟器验证。

交付产物: - 增强后的dsl_parser.py和ir_builder.py - 示例DSL程序(if_else.dsl, while_sum.dsl, nested_loop.dsl) - 文档:新增语法说明、使用示例

12周每周目标: - W1:搭建环境,运行现有DSL示例。阅读dsl_parser.py和ir_builder.py,画出现有流程思维导图。 - W2:学习递归下降解析原理,为if语法设计BNF规则,编写伪代码。 - W3:添加parse_if()方法,识别if关键字和括号,构建IfNode(简单存储条件、then块、else块)。 - W4:实现条件表达式的解析(支持==, <, >等),输出AST结构。 - W5:学习项目IR表示(三地址码,含BR, LABEL)。为IfNode编写IR生成函数。 - W6:实现if-else完整IR生成(两个分支,汇合标签)。测试简单if程序。 - W7:添加while语法,解析为WhileNode。设计IR模式:条件判断->循环体->跳回。 - W8:实现while的IR生成,确保退出条件正确。测试while求和程序。 - W9:处理嵌套if和while,确保标签编号不冲突(使用计数器)。测试嵌套例子。 - W10:增加错误恢复(可结合课题9的成果),完善注释。 - W11:编写3个完整DSL程序,使用后端生成汇编,用tinyfive.py验证结果。 - W12:撰写文档(使用说明、新增语法示例、内部设计图),准备演示。