fix(frontend): 修复部分实现
This commit is contained in:
@@ -8,12 +8,12 @@
|
||||
↓
|
||||
Lexer / Parser(ANTLR)
|
||||
↓
|
||||
AST 构建 + 语义分析(Sema)
|
||||
语法树构建 + 语义分析(Sema)
|
||||
↓
|
||||
AST(带类型 / 符号 / 常量)
|
||||
语法树(附加语义信息)
|
||||
|
||||
[ 中端 Middle-end ]
|
||||
AST
|
||||
语法树
|
||||
↓
|
||||
IR 构建(平台无关 IR,LLVM 风格)
|
||||
↓
|
||||
@@ -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`
|
||||
- 日志输出:统一调试信息、阶段信息与错误信息输出。
|
||||
|
||||
Reference in New Issue
Block a user