You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nudt-compiler-cpp/work-summary-2026-04-02.md

3.6 KiB

今日工作总结2026-04-02

1. 今天做了什么

  • 核查语义分析实现与当前 SysY.g4 的兼容性。
  • 重构语义分析流程,使其对齐当前语法节点(如 blockstmtlVal 等)。
  • 实现并接入编译期常量求值模块(ConstEval),覆盖常量表达式与 const 初始化列表展平。
  • 将符号表升级为 IR 导向的 SymbolEntry 结构,并支持作用域查找。
  • 增加语义绑定上下文,支持左值使用点与函数调用使用点绑定。
  • 分别验证了子模块构建状态与完整 IRGen 链路构建状态。
  • 定位了为何 sem 目标通过但全量构建失败。

2. 已实现内容

语义分析(sema

  • 函数预声明与函数体语义检查流程。
  • 赋值、返回、条件表达式、一元/二元运算的类型检查。
  • 变量/常量/形参的作用域检查。
  • break / continue 的循环上下文合法性检查。
  • main 函数存在性与签名检查。

符号表

  • 作用域栈(EnterScope / ExitScope)。
  • 当前作用域与嵌套作用域查找逻辑。
  • IR 导向符号信息(kinddata_type、数组维度、常量初始化载荷)。

ConstEval

  • 常量标量求值(支持 int/float/bool 转换)。
  • 常量表达式访问器求值。
  • 数组维度合法性校验(必须为整数且大于 0
  • const 初始化列表展平(支持嵌套花括号和零填充)。

3. 今日验证与排查结果

  • cmake --build build --target sem -j4:通过。
  • cmake --build build --target irgen -j4:失败。

已定位根因:

  • include/ir/IR.hsrc/ir/*.cpp 尚未完全对齐(函数签名不一致、重复定义、内联方法中的不完整类型使用)。
  • IRGen 仍在使用旧 parser 上下文与旧语义接口(ResolveVarUse),而当前 sema 接口是 ResolveLValUse / ResolveCallUse

4. 今天修改的文件

核心代码变更

  • include/sem/Sema.h
  • include/sem/SymbolTable.h
  • include/sem/ConstEval.h(新增)
  • src/sem/Sema.cpp
  • src/sem/SymbolTable.cpp
  • src/sem/ConstEval.cpp

观察到的其他仓库变更

  • scripts/lab1_build_test.sh(文件权限位变化)
  • 介绍.md(新增)
  • Lab1 输出文件变更:
    • output/lab1/01_mm2.tree
    • output/lab1/02_mv3.tree
    • output/lab1/03_sort1.tree
    • output/lab1/05_arr_defn4.tree
    • output/lab1/09_func_defn.tree
    • output/lab1/11_add2.tree
    • output/lab1/13_sub2.tree
    • output/lab1/15_graph_coloring.tree
    • output/lab1/2025-MYO-20.tree
    • output/lab1/22_matrix_multiply.tree
    • output/lab1/25_scope3.tree
    • output/lab1/29_break.tree
    • output/lab1/36_op_priority2.tree
    • output/lab1/95_float.tree
    • output/lab1/fft0.tree
    • output/lab1/gameoflife-oscillator.tree
    • output/lab1/if-combine3.tree
    • output/lab1/large_loop_array_2.tree
    • output/lab1/simple_add.tree
    • output/lab1/transpose0.tree
    • output/lab1/vector_mul3.tree

5. 当前阻塞点

  • IR 核心实现尚未与最新 IR.h 契约完全同步。
  • IRGen 适配层尚未迁移到当前 grammar / API 契约。
  • include/sem/ConstEval.h 中目前存在错误 include 记号(<str ing>),在全链路稳定前需要修复。

6. 下一步建议

  1. include/ir/IR.h 逐项对齐 src/ir/BasicBlock.cppsrc/ir/Function.cppsrc/ir/Module.cpp
  2. IR.h 中依赖完整 BasicBlock / Function 类型的高风险内联方法迁移到 .cpp(如有必要)。
  3. 迁移 IRGen 访问器与语义绑定调用到当前 parser 与 sema API。
  4. 重新执行全量构建,再跑 lab1 / lab2 脚本做端到端验证。