### 人员 1：基础表达式与赋值支持（lc，已完成）

- 任务 1.1：支持更多二元运算符（Sub, Mul, Div, Mod）
- 任务 1.2：支持一元运算符（正负号）
- 任务 1.3：支持赋值表达式
- 任务 1.4：支持逗号分隔的多个变量声明

### 人员 2：控制流支持（lyy,已完成）

- 任务 2.1：支持 if-else 条件语句
- 任务 2.2：支持 while 循环语句
- 任务 2.3：支持 break/continue 语句
- 任务 2.4：支持比较和逻辑表达式

### 人员 3：函数与全局变量支持

- 任务 3.1：支持全局变量声明与初始化
- 任务 3.2：支持函数参数处理
- 任务 3.3：支持函数调用生成
- 任务 3.4：支持 const 常量声明

## 人员 1 完成情况详细说明（更新于 2026-03-30）

### ✅ 已完成任务

人员 1 已完整实现 Lab2 IR 生成的基础功能模块，包括：

1. **二元运算符**（任务 1.1）
   - 实现 `Sub`, `Mul`, `Div`, `Mod` 四种运算符
   - 修改文件：`include/ir/IR.h`, `src/ir/IRBuilder.cpp`, `src/ir/IRPrinter.cpp`, `src/irgen/IRGenExp.cpp`
2. **一元运算符**（任务 1.2）
   - 实现正负号运算符（`+`, `-`）
   - 新增 `UnaryInst` 类支持一元指令
   - 负号生成 `sub 0, x` 指令（LLVM IR 标准形式）
3. **赋值表达式**（任务 1.3）
   - 实现变量赋值语句的 IR 生成
   - 修改文件：`src/irgen/IRGenStmt.cpp`
4. **多变量声明**（任务 1.4）
   - 支持逗号分隔的变量声明（如 `int a, b, c;`）
   - 支持带初始化的多变量声明（如 `int a = 1, b = 2;`）

### 🧪 测试验证

- **Lab1 语法分析**：✅ 通过（10/11 functional 测试，1 个数组测试超出范围）
- **Lab2 语义分析**：✅ 通过（6 正例 + 4 反例）
- **IR 生成测试**：✅ 通过（7/7 自定义测试用例）
  - 测试脚本：`./scripts/test_lab2_ir1.sh`
  - 测试用例目录：`test/test_case/irgen_lab1_4/`

### 📝 代码质量

- 所有修改已通过编译测试
- 未影响原有 Lab1 和 Lab2 Sema 功能
- 代码风格与项目保持一致
- 关键函数添加了注释说明

### 🔄 协作接口

人员 1 的实现为后续任务提供了以下接口：

- **表达式生成**：`visitAddExp`, `visitMulExp`, `visitUnaryExp`
- **语句生成**：`visitStmt`（支持赋值和 return）
- **变量管理**：`storage_map_` 维护变量名到栈槽位的映射
- **IR 构建**：`IRBuilder::CreateBinary`, `IRBuilder::CreateNeg`, `IRBuilder::CreateStore`

后续人员可以在此基础上扩展更复杂的功能（控制流、函数调用等）。

## 人员 2 完成情况详细说明（更新于 2026-03-31）

### ✅ 已完成任务

人员 2 已完整实现 Lab2 IR 生成中涉及的控制流支持，包括：

1. **IR 结构与底层辅助拓展**
   - 补充 `Int1` 基础类型以及 `Value::IsInt1()`。
   - 新增 `CmpInst`, `ZextInst`, `BranchInst` 以及 `CondBranchInst` 以支持关系计算和跳转逻辑。
   - 在 `IRBuilder` 中补齐创建此类指令的便捷接口与 `IRPrinter` 适配，并修复了 `IRPrinter` 存在的块命名 `%%` 重复问题。
   - 优化 `Context::NextTemp` 分配命名使用 `%t` 前缀，解决非线性顺序下纯数字临时变量引发 `llc` 后端词法顺序验证失败问题。
2. **比较和逻辑表达式**（任务 2.4）
   - 新增实现 `visitRelExp`、`visitEqExp`。
   - 实现条件二元表达式全链路短路求值 (`visitLAndExp`、`visitLOrExp`)。短路时通过控制流跳转+利用局部栈变量分配并多次赋值记录实现栈传递，规避了 `phi` 的麻烦。
   - 利用 `visitCondUnaryExp` 增加逻辑非 `!` 判定。
3. **控制流框架支持**（任务 2.1 - 2.3）
   - 在 `visitStmt` 中完美实现了 `if-else` 条件语句（自动插入无条件跳合块）、`while` 循环语句。
   - 在 `IRGen` 实例中通过 `current_loop_cond_bb_` 等维护循环栈，实现了 `break` 与 `continue`。
   - 修复了此前框架在 `IRGenDecl.cpp` 的 `visitBlock` 中缺少终结向上传递导致的 `break` 生成不匹配死块 BUG 及重复 `Branch` 问题。
4. **关键前序 Bug 修复**
   - 发现了在原框架里 `src/sem/Sema.cpp` 进行 AST 解析时 `RelExp` 和 `EqExp` 对于非原生底层变量追踪由于左偏漏调规则导致 `null_ptr` (`变量使用缺少语义绑定：a`) 报错的问题，并做出了精修复。

### 🧪 测试验证

- **Lab2 语义分析**：修复后所有已有的语义正例验证正常。
- **IR 生成与后端执行**：✅ 自建嵌套含复合逻辑循环脚本测试通过。
- **验证命令**（运行含 break 和 while 的范例文件）：
  ```bash
  cd build && make -j$(nproc) && cd .. && ./scripts/verify_ir.sh test/test_case/functional/29_break.sy --run
  ```

  **完整测试脚本**
  ```bash
  for f in test/test_case/functional/*.sy; do echo "Testing $f..."; ./scripts/verify_ir.sh "$f" --run > /dev/null || echo "FAILED $f"; done
  ```

## 人员 3 完成情况详细说明（更新于 2026-04-06）

### ✅ 已完成任务

人员 3 (hp) 已完整实现 Lab2 IR 生成中函数及常量的扩展支持，包括：

1. **支持全局变量声明与初始化**（任务 3.1）
   - 在 `IRGenDecl.cpp` 中通过判断 `func_ == nullptr` 区分全局和局部作用域。
   - 扩充了 `Float` / `PtrFloat` 及 `ConstantFloat` 等浮点数支持，补充 `GlobalVariable` 派生类。
   - 正确调用 `module_.CreateGlobalVariable` 处理整型和浮点型全局初始化，维护在 `storage_map_` 中。
2. **支持函数参数处理**（任务 3.2）
   - 在 `IR.h` 的 `Value` 体系中增加 `Argument` 类。
   - 在 `IRGenFunc.cpp` 中实现对 `funcFParams` 的处理。
   - 在入口块为每个参数 `alloca` 栈槽，通过 `store` 存入形参初值，并绑定至 `storage_map_` 供内部读取。
3. **支持函数调用生成**（任务 3.3）
   - 在 `IR.h` 与 `IRBuilder.cpp` 补充 `Opcode::Call` 与 `CallInst` 及其打印逻辑。
   - 在 `IRGenExp.cpp` (`visitUnaryExp`) 支持 `funcCallExp` 解析。
   - 提取计算所有的实参表达式 (`funcRParams`) 后生成 `call` 指令；对于库函数支持基于 `Sema` 的占位符签名构建。
4. **支持 const 常量声明**（任务 3.4）
   - 在 `IRGenDecl.cpp` 新增 `visitConstDecl` 和 `visitConstDef` 实现。
   - 维护独立的 `const_values_` 映射表记录 `ConstantValue*`。
   - 在 `visitLVal` 时如果检测到是已定义的常量，直接嵌入常量值完成折叠，省去内存的 `load` 开销。

### 🧪 测试验证

- **全局/局部变量、常量引用测试**：✅ IR 输出正确（通过访问 `storage_map_` 和 `const_values_` 获取数据）。
- **参数传递与函数调用链路测试**：✅ 多参数函数（包含返回值）和调用外部 `putint` 的样例生成的 LLVM IR 结构清晰、运行正确。
- **集成测试验证**：✅ 能完美与人员 1 和人员 2 的前置工作合并通过，确保了控制流、运算体系与函数调用的兼容。

### 🔄 协作接口

人员 3 的实现对全局体系及调用链路做出了以下约定：
- **常量折叠访问机制**：扩展引入了 `const_values_` 映射机制，允许表达式树中的左值在编译期直接折叠为字面量常量。
- **参数栈操作模型**：统一了函数的栈变量调用约定（将传参全统一按 Alloca 栈分配处理），这为后续实验中后端进行简单且一致的寄存器/栈映射及死代码消除等数据流分析提供了稳定基础。