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.
3.6 KiB
3.6 KiB
今日工作总结(2026-04-02)
1. 今天做了什么
- 核查语义分析实现与当前
SysY.g4的兼容性。 - 重构语义分析流程,使其对齐当前语法节点(如
block、stmt、lVal等)。 - 实现并接入编译期常量求值模块(
ConstEval),覆盖常量表达式与 const 初始化列表展平。 - 将符号表升级为 IR 导向的
SymbolEntry结构,并支持作用域查找。 - 增加语义绑定上下文,支持左值使用点与函数调用使用点绑定。
- 分别验证了子模块构建状态与完整 IRGen 链路构建状态。
- 定位了为何
sem目标通过但全量构建失败。
2. 已实现内容
语义分析(sema)
- 函数预声明与函数体语义检查流程。
- 赋值、返回、条件表达式、一元/二元运算的类型检查。
- 变量/常量/形参的作用域检查。
break/continue的循环上下文合法性检查。main函数存在性与签名检查。
符号表
- 作用域栈(
EnterScope/ExitScope)。 - 当前作用域与嵌套作用域查找逻辑。
- IR 导向符号信息(
kind、data_type、数组维度、常量初始化载荷)。
ConstEval
- 常量标量求值(支持 int/float/bool 转换)。
- 常量表达式访问器求值。
- 数组维度合法性校验(必须为整数且大于 0)。
- const 初始化列表展平(支持嵌套花括号和零填充)。
3. 今日验证与排查结果
cmake --build build --target sem -j4:通过。cmake --build build --target irgen -j4:失败。
已定位根因:
include/ir/IR.h与src/ir/*.cpp尚未完全对齐(函数签名不一致、重复定义、内联方法中的不完整类型使用)。IRGen仍在使用旧 parser 上下文与旧语义接口(ResolveVarUse),而当前 sema 接口是ResolveLValUse/ResolveCallUse。
4. 今天修改的文件
核心代码变更
include/sem/Sema.hinclude/sem/SymbolTable.hinclude/sem/ConstEval.h(新增)src/sem/Sema.cppsrc/sem/SymbolTable.cppsrc/sem/ConstEval.cpp
观察到的其他仓库变更
scripts/lab1_build_test.sh(文件权限位变化)介绍.md(新增)- Lab1 输出文件变更:
output/lab1/01_mm2.treeoutput/lab1/02_mv3.treeoutput/lab1/03_sort1.treeoutput/lab1/05_arr_defn4.treeoutput/lab1/09_func_defn.treeoutput/lab1/11_add2.treeoutput/lab1/13_sub2.treeoutput/lab1/15_graph_coloring.treeoutput/lab1/2025-MYO-20.treeoutput/lab1/22_matrix_multiply.treeoutput/lab1/25_scope3.treeoutput/lab1/29_break.treeoutput/lab1/36_op_priority2.treeoutput/lab1/95_float.treeoutput/lab1/fft0.treeoutput/lab1/gameoflife-oscillator.treeoutput/lab1/if-combine3.treeoutput/lab1/large_loop_array_2.treeoutput/lab1/simple_add.treeoutput/lab1/transpose0.treeoutput/lab1/vector_mul3.tree
5. 当前阻塞点
- IR 核心实现尚未与最新
IR.h契约完全同步。 - IRGen 适配层尚未迁移到当前 grammar / API 契约。
include/sem/ConstEval.h中目前存在错误 include 记号(<str ing>),在全链路稳定前需要修复。
6. 下一步建议
- 按
include/ir/IR.h逐项对齐src/ir/BasicBlock.cpp、src/ir/Function.cpp、src/ir/Module.cpp。 - 将
IR.h中依赖完整BasicBlock/Function类型的高风险内联方法迁移到.cpp(如有必要)。 - 迁移 IRGen 访问器与语义绑定调用到当前 parser 与 sema API。
- 重新执行全量构建,再跑
lab1/lab2脚本做端到端验证。