fix(frontend): 修复部分实现

This commit is contained in:
jing
2026-03-09 15:37:36 +08:00
parent 8aec500b5b
commit e01995a33d
21 changed files with 321 additions and 165 deletions

View File

@@ -8,12 +8,12 @@
Lexer / ParserANTLR
AST 构建 + 语义分析Sema
语法树构建 + 语义分析Sema
AST带类型 / 符号 / 常量
语法树(附加语义信息
[ 中端 Middle-end ]
AST
语法树
IR 构建(平台无关 IRLLVM 风格)
@@ -51,10 +51,7 @@
│ │ └── SysY.g4
│ ├── frontend/
│ │ ├── AntlrDriver.cpp
│ │ └── AstBuilder.cpp
│ ├── ast/
│ │ ├── AstNodes.cpp
│ │ └── AstPrinter.cpp
│ │ └── SyntaxTreePrinter.cpp
│ ├── sem/
│ │ ├── Sema.cpp
│ │ ├── SymbolTable.cpp
@@ -103,7 +100,6 @@
│ └── CLI.cpp
├── include/
│ ├── frontend/
│ ├── ast/
│ ├── sem/
│ ├── irgen/
│ ├── ir/
@@ -154,36 +150,28 @@
- `SysYBaseVisitor.cpp/.h``SysYVisitor.cpp/.h`
- `*.tokens``*.interp`
#### 3.2.3 `src/frontend/`ANTLR 调用与 AST 构建
#### 3.2.3 `src/frontend/`语法解析与语法树输出
- `src/frontend/AntlrDriver.cpp`
- 读取源代码并调用 ANTLR 生成的 lexer/parser得到 parse tree
- 读取源代码并调用解析流程,得到语法树
- 由于语法正确性由测试保证,该模块只需提供“可用的解析入口”,不需要实现复杂的语法错误报告体系。
- `src/frontend/AstBuilder.cpp`
- 将 parse tree 转换为 AST`src/ast/*`),并在 AST 节点上保留必要的定位信息(可选,用于调试/日志)
- `src/frontend/SyntaxTreePrinter.cpp`
- 语法树调试打印:用于验证语法规则与前端解析行为是否符合预期
#### 3.2.4 `src/ast/`抽象语法树AST
- `src/ast/AstNodes.cpp`
- AST 节点定义与实现:表达式、语句、声明、函数、类型等。
- AST 节点应当能够承载后续阶段附加信息(类型、符号绑定、常量值等)。
- `src/ast/AstPrinter.cpp`
- AST 调试打印:用于验证 AST 构建是否符合预期,便于定位前端/语义阶段问题。
#### 3.2.5 `src/sem/`语义分析Sema
#### 3.2.4 `src/sem/`语义分析Sema
- `src/sem/Sema.cpp`
- 语义分析主流程:符号解析、类型检查、控制流规则检查、必要的隐式转换插入/记录等。
- 输出为“带类型 / 符号 / 常量信息”的 AST可通过在 AST 节点上附加属性实现)
- 在语法树基础上完成语义检查,并为后续 IR 生成提供约束
- `src/sem/SymbolTable.cpp`
- 符号表与作用域管理:支持嵌套作用域、变量/函数/参数/常量的注册与查找。
- `src/sem/ConstEval.cpp`
- 常量求值:用于数组维度、全局初始化、`const` 表达式等需要编译期计算的场景。
#### 3.2.6 `src/irgen/`AST → IR平台无关LLVM 风格)
#### 3.2.5 `src/irgen/`语法树 → IR平台无关LLVM 风格)
- `src/irgen/IRGenDriver.cpp`
- 驱动 Visitor 遍历 AST,调度各子模块完成翻译。
- 驱动语法树遍历,调度各子模块完成翻译。
- `src/irgen/IRGenFunc.cpp`
- 函数翻译:函数定义、参数列表与返回值翻译;创建对应 IR 函数对象。
- `src/irgen/IRGenStmt.cpp`
@@ -193,7 +181,7 @@
- `src/irgen/IRGenDecl.cpp`
- 声明翻译:处理全局变量、局部变量、数组初始化与空间分配等。
#### 3.2.7 `src/ir/`LLVM 风格 IR 核心
#### 3.2.6 `src/ir/`LLVM 风格 IR 核心
- `src/ir/Context.cpp`
- IR 上下文:管理类型/常量创建与复用、字符串/符号等公共资源。
@@ -228,7 +216,7 @@
- `src/ir/passes/CFGSimplify.cpp`
- CFG 简化:删除不可达块、合并空块、简化分支等。
#### 3.2.8 `src/mir/`Machine IR
#### 3.2.7 `src/mir/`Machine IR
- `src/mir/MIRContext.cpp`
- MIR 上下文:保存目标约束、指令集信息等。
@@ -254,7 +242,7 @@
- `src/mir/passes/Peephole.cpp`
- 窥孔优化:删除冗余 move、合并常见指令模式提升最终汇编质量。
#### 3.2.9 `src/utils/`:日志与命令行
#### 3.2.8 `src/utils/`:日志与命令行
- `src/utils/Log.cpp`
- 日志输出:统一调试信息、阶段信息与错误信息输出。