diff --git a/doc/Snow语言文档.md b/doc/Snow语言文档.md index c03e328..521e333 100644 --- a/doc/Snow语言文档.md +++ b/doc/Snow语言文档.md @@ -63,18 +63,6 @@ Parser采用**递归下降**和**运算符优先解析**相结合的方法:顶 语义分析结束后,若无错误,即可确保AST上的每个标识符引用都有定义,每个函数调用可解析到目标函数,每条语句在语义上是合理的。这为后续代码生成提供了可靠基础。语义阶段还可以在AST节点上附加类型注解,便于代码生成选择合适的指令。目前Context的parseType会将类型名字符串转换为Type对象(如BuiltinType.INT等)供符号记录,但AST节点未存储类型属性,后端主要依赖变量的Type信息选择指令。整个SemanticAnalyzer设计采用了**注册表 + 分派**模式:通过AnalyzerRegistrar将具体AST节点类型与相应SemanticAnalyzer关联,FunctionChecker运行时按节点类型获取分析器。这种设计方便扩展新的语义检查规则,只需增加对应节点的Analyzer并注册即可。 -*健壮性*: 语义分析目前存在一些可改进点:二是三是四是 - -上面是Semantic相关介绍 - -## 需要你完成的 -1. 解压然后读取项目里面全部相关代码,然后解决下面的问题 -2. **错误收集**不完善,目前遇到语义错误就记录并在最后可能退出,但对于不同模块或函数的多个错误能否一次收集输出没有详述。改进为**非终止检查**,在尽可能继续分析后面的代码前提下收集所有错误。 -3**作用域管理**仅支持函数级,缺少块级作用域支持(如在if/loop内部声明的变量不单独成域);需要更细粒度的SymbolTable嵌套和Analyzer处理需实现。 -4**类型系统**如上所述比较原始,没有检查表达式的类型正确性(例如算术运算混用int和string等),引入类型推断或强制类型检查,使语言更加健壮。 -5帮我解决以上问题,确保修改后和后面模块兼容,画布给我修改后的代码和新增的代码 - - ## 中间代码(IR)生成 在通过语法和语义检查后,编译器将AST转换为中间表示IR(Intermediate Representation)。IR是一种适合进一步翻译优化的**抽象指令序列**,通常比AST更贴近目标机但又独立于具体机器。本项目IR设计为**基于虚拟寄存器的三地址码**形式,每条IR指令类似于`dest = op(arg1, arg2)`的结构。主要实现位于`org.jcnc.snow.compiler.ir`包下,包括IR指令类、值类和IR构建器。 @@ -99,6 +87,46 @@ Parser采用**递归下降**和**运算符优先解析**相结合的方法:顶 IR生成完毕后,`IRProgram`中汇集了所有函数的IR表示。调用`IRProgram.toString()`可以打印出IR的简要文本表示,例如变量寄存器通常显示为`%0, %1`等格式,指令形如`%2 = %0 + %1`。在SnowCompiler主程序中,会打印IR用于调试。IR作为中间产物,一方面可以进行优化(当前未实现显式优化流程,仅留下IROptimizer接口作为扩展点【17†output】),另一方面便于进行下一阶段目标码生成。 + +上面是IR相关介绍 + +## 需要你完成的 + +### 项目IR模块当前存在的具体问题(需o3模型重点关注并后续解决) + +1. **对不同数据类型的支持不完整:** + + * 目前IR主要支持32位整数(I32)操作,虽然IR指令类和IROpCode中有为其他类型(如F32/long)做准备,但实际没有实现完整的数据类型区分和处理。 + * 所有算术IR指令和常量均以I32为主,浮点和长整型等数值类型的IR指令并未落地实现,导致类型语义丢失或错误处理。 +2. **控制流语句IR生成未实现:** + + * StatementBuilder没有对IfNode、LoopNode等控制流AST节点进行IR生成,遇到这些节点会抛出异常“Unsupported statement”。 + * 项目虽然有IfNode、LoopNode等AST及语义分析实现,并有IRJumpInstruction等IR跳转指令类,但实际IR生成阶段完全未用到这些,无法编译任何含条件或循环语句的代码。 + +3. **赋值与变量声明实现方式存在改进空间:** + + * 目前每次赋值都会分配新虚拟寄存器,实现类似SSA(静态单赋值)风格,但没有对寄存器生命周期和优化做进一步处理。 + * 声明语句没有生成独立IR指令,初始化部分处理不够灵活。 + +4. **缺少优化与扩展机制实际落地:** + + * 项目虽有IROptimizer接口,但并未实现具体优化逻辑。 + * 没有常用中间代码优化(如常量合并、死代码删除、寄存器重命名等),IR只是简单直译AST。 + +5. **全局常量池和模块/函数关系维护较为简单:** + + * IRProgram目前仅维护函数列表,全局常量池等设计未实际细化或应用。 + +6. **对表达式、函数调用、返回值处理等边界情况的健壮性需增强:** + + * 对无返回值、错误类型、特殊字面量等情况未见详细处理和报错。 + +--- + +**请针对以上问题结合项目实际代码帮我解决以上问题,确保修改后和后面模块兼容,画布给我修改后的代码和新增的代码 + + + ## 目标代码生成与虚拟机指令集 **代码生成(Code Generation)** 负责将IR翻译为虚拟机能够执行的指令序列。SCompiler的目标指令集是定制的Snow虚拟机字节码(文本形式表示),设计思想接近JVM:采用操作数栈+局部变量槽模型,并区分不同数据类型的操作。代码生成主要分两步:**寄存器分配**和**指令序列生成**。