diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0ff3fc6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# 忽略构建产物与中间文件: +# - build/ 等构建目录 +# - ANTLR 自动生成文件(若产生在源码树中应忽略) +# - test/test_result/ 等测试输出目录 + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..8fdd1c8 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +# 工程构建入口: +# - 配置 C/C++ 编译器与标准、编译选项、输出目录等 +# - 添加 src/ 子目录并链接生成最终可执行文件 +# - 集成 ANTLR4 C++ runtime(通过系统依赖或第三方源码),并将构建目录下的 ANTLR 生成代码纳入编译 + diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b9cf62 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..22066d4 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,4 @@ +# src/ 子目录构建脚本: +# - 收集并编译各子模块源文件(frontend/ast/sem/irgen/ir/mir/utils) +# - 生成库或目标对象并链接到最终可执行文件 + diff --git a/src/antlr4/SysY.g4 b/src/antlr4/SysY.g4 new file mode 100644 index 0000000..ec0eef2 --- /dev/null +++ b/src/antlr4/SysY.g4 @@ -0,0 +1,3 @@ +// SysY 语法定义(lexer + parser rules)的占位文件。 +// 注意:ANTLR 生成的 C++ 源码/头文件不进入仓库,统一放在构建目录(例如 build/generated/antlr4/)。 + diff --git a/src/ast/AstNodes.cpp b/src/ast/AstNodes.cpp new file mode 100644 index 0000000..39c5b37 --- /dev/null +++ b/src/ast/AstNodes.cpp @@ -0,0 +1,4 @@ +// AST 节点定义与实现: +// - 表达式、语句、声明、函数、类型等节点 +// - 支持后续阶段在节点上附加信息(类型、符号绑定、常量值等) + diff --git a/src/ast/AstPrinter.cpp b/src/ast/AstPrinter.cpp new file mode 100644 index 0000000..1e37684 --- /dev/null +++ b/src/ast/AstPrinter.cpp @@ -0,0 +1,4 @@ +// AST 调试打印: +// - 以可读形式打印 AST 结构 +// - 用于验证 AST 构建与语义分析结果,便于定位问题 + diff --git a/src/frontend/AntlrDriver.cpp b/src/frontend/AntlrDriver.cpp new file mode 100644 index 0000000..571511a --- /dev/null +++ b/src/frontend/AntlrDriver.cpp @@ -0,0 +1,5 @@ +// 前端解析驱动: +// - 读取源代码 +// - 调用 ANTLR 生成的 lexer/parser 得到 parse tree +// - 对外提供“可用的解析入口”(语法正确性由测试保证) + diff --git a/src/frontend/AstBuilder.cpp b/src/frontend/AstBuilder.cpp new file mode 100644 index 0000000..e57235e --- /dev/null +++ b/src/frontend/AstBuilder.cpp @@ -0,0 +1,4 @@ +// AST 构建: +// - 将 ANTLR parse tree 转换为 AST(对应 src/ast/*) +// - 在 AST 节点上保留必要的定位信息(可选,用于调试/日志) + diff --git a/src/ir/BasicBlock.cpp b/src/ir/BasicBlock.cpp new file mode 100644 index 0000000..822e987 --- /dev/null +++ b/src/ir/BasicBlock.cpp @@ -0,0 +1,4 @@ +// IR 基本块: +// - 保存指令序列 +// - 维护或可计算前驱/后继关系,用于 CFG 分析与优化 + diff --git a/src/ir/Context.cpp b/src/ir/Context.cpp new file mode 100644 index 0000000..d71a481 --- /dev/null +++ b/src/ir/Context.cpp @@ -0,0 +1,4 @@ +// IR 上下文: +// - 管理类型与常量的创建/复用 +// - 保存字符串常量、符号等公共资源(按需要扩展) + diff --git a/src/ir/Function.cpp b/src/ir/Function.cpp new file mode 100644 index 0000000..88d2427 --- /dev/null +++ b/src/ir/Function.cpp @@ -0,0 +1,4 @@ +// IR Function: +// - 保存参数列表、基本块列表 +// - 记录函数属性/元信息(按需要扩展) + diff --git a/src/ir/IRBuilder.cpp b/src/ir/IRBuilder.cpp new file mode 100644 index 0000000..554f2f6 --- /dev/null +++ b/src/ir/IRBuilder.cpp @@ -0,0 +1,4 @@ +// IR 构建工具: +// - 管理插入点(当前基本块/位置) +// - 提供创建各类指令的便捷接口,降低 IRGen 复杂度 + diff --git a/src/ir/IRPrinter.cpp b/src/ir/IRPrinter.cpp new file mode 100644 index 0000000..fddaf43 --- /dev/null +++ b/src/ir/IRPrinter.cpp @@ -0,0 +1,4 @@ +// IR 文本输出: +// - 将 IR 打印为 .ll 风格的文本 +// - 支撑调试与测试对比(diff) + diff --git a/src/ir/Instruction.cpp b/src/ir/Instruction.cpp new file mode 100644 index 0000000..c8e0e24 --- /dev/null +++ b/src/ir/Instruction.cpp @@ -0,0 +1,4 @@ +// IR 指令体系: +// - 二元运算/比较、load/store、call、br/condbr、ret、phi、alloca 等 +// - 指令操作数与结果类型管理,支持打印与优化 + diff --git a/src/ir/Module.cpp b/src/ir/Module.cpp new file mode 100644 index 0000000..9d7fc51 --- /dev/null +++ b/src/ir/Module.cpp @@ -0,0 +1,4 @@ +// IR Module: +// - 保存全局变量与函数列表 +// - 维护与目标相关的模块级信息(如需要)与符号表 + diff --git a/src/ir/Type.cpp b/src/ir/Type.cpp new file mode 100644 index 0000000..ac51dba --- /dev/null +++ b/src/ir/Type.cpp @@ -0,0 +1,4 @@ +// IR 类型系统: +// - i32/f32/void、指针、数组、函数类型等 +// - 按 SysY 支持范围裁剪并逐步补齐 + diff --git a/src/ir/Value.cpp b/src/ir/Value.cpp new file mode 100644 index 0000000..bd73cc7 --- /dev/null +++ b/src/ir/Value.cpp @@ -0,0 +1,4 @@ +// SSA 值体系抽象: +// - 常量、参数、指令结果等统一为 Value +// - 提供类型信息与使用/被使用关系(按需要实现) + diff --git a/src/ir/analysis/DominatorTree.cpp b/src/ir/analysis/DominatorTree.cpp new file mode 100644 index 0000000..eaf7269 --- /dev/null +++ b/src/ir/analysis/DominatorTree.cpp @@ -0,0 +1,4 @@ +// 支配树分析: +// - 构建/查询 Dominator Tree 及相关关系 +// - 为 mem2reg、CFG 优化与循环分析提供基础能力 + diff --git a/src/ir/analysis/LoopInfo.cpp b/src/ir/analysis/LoopInfo.cpp new file mode 100644 index 0000000..9793dc6 --- /dev/null +++ b/src/ir/analysis/LoopInfo.cpp @@ -0,0 +1,4 @@ +// 循环分析: +// - 识别循环结构与层级关系 +// - 为后续优化(可选)提供循环信息 + diff --git a/src/ir/passes/CFGSimplify.cpp b/src/ir/passes/CFGSimplify.cpp new file mode 100644 index 0000000..3779397 --- /dev/null +++ b/src/ir/passes/CFGSimplify.cpp @@ -0,0 +1,4 @@ +// CFG 简化: +// - 删除不可达块、合并空块、简化分支等 +// - 改善 IR 结构,便于后续优化与后端生成 + diff --git a/src/ir/passes/ConstFold.cpp b/src/ir/passes/ConstFold.cpp new file mode 100644 index 0000000..19f2d43 --- /dev/null +++ b/src/ir/passes/ConstFold.cpp @@ -0,0 +1,4 @@ +// IR 常量折叠: +// - 折叠可判定的常量表达式 +// - 简化常量控制流分支(按实现范围裁剪) + diff --git a/src/ir/passes/DCE.cpp b/src/ir/passes/DCE.cpp new file mode 100644 index 0000000..5a0db91 --- /dev/null +++ b/src/ir/passes/DCE.cpp @@ -0,0 +1,4 @@ +// 死代码删除(DCE): +// - 删除无用指令与无用基本块 +// - 通常与 CFG 简化配合使用 + diff --git a/src/ir/passes/Mem2Reg.cpp b/src/ir/passes/Mem2Reg.cpp new file mode 100644 index 0000000..0b052ba --- /dev/null +++ b/src/ir/passes/Mem2Reg.cpp @@ -0,0 +1,4 @@ +// Mem2Reg(SSA 构造): +// - 将局部变量的 alloca/load/store 提升为 SSA 形式 +// - 插入 PHI 并重写使用,依赖支配树等分析 + diff --git a/src/ir/passes/PassManager.cpp b/src/ir/passes/PassManager.cpp new file mode 100644 index 0000000..d08d611 --- /dev/null +++ b/src/ir/passes/PassManager.cpp @@ -0,0 +1,4 @@ +// IR Pass 管理: +// - 按优化级别组织优化 pipeline +// - 统一运行 pass、统计与调试输出(按需要扩展) + diff --git a/src/irgen/IRGen.cpp b/src/irgen/IRGen.cpp new file mode 100644 index 0000000..98a6076 --- /dev/null +++ b/src/irgen/IRGen.cpp @@ -0,0 +1,5 @@ +// AST -> IR(平台无关、LLVM 风格): +// - 将带语义信息的 AST 翻译为 src/ir/* 中的 IR 结构 +// - 负责控制流结构化翻译(基本块、分支、循环) +// - 生成函数与全局对象,翻译表达式求值与调用等 + diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..e9e3ea1 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,5 @@ +// 编译器入口: +// - 解析命令行参数(输入源文件、输出路径、输出类型、优化级别等) +// - 驱动完整流水线:Frontend -> Middle-end -> Backend +// - 统一管理阶段产物输出(例如 .ll/.s 的输出开关) + diff --git a/src/mir/AsmPrinter.cpp b/src/mir/AsmPrinter.cpp new file mode 100644 index 0000000..4e12e63 --- /dev/null +++ b/src/mir/AsmPrinter.cpp @@ -0,0 +1,4 @@ +// 汇编打印: +// - 将最终机器指令(MIR)打印为 ARMv8-A / AArch64 汇编(.s) +// - 负责标签、伪指令、段信息等输出(按需要实现) + diff --git a/src/mir/FrameLowering.cpp b/src/mir/FrameLowering.cpp new file mode 100644 index 0000000..6f6997c --- /dev/null +++ b/src/mir/FrameLowering.cpp @@ -0,0 +1,4 @@ +// 栈帧构建与序言尾声插入: +// - 计算栈大小与对齐需求,分配栈槽 +// - 插入 prologue/epilogue,保存/恢复 callee-saved 等 + diff --git a/src/mir/Lowering.cpp b/src/mir/Lowering.cpp new file mode 100644 index 0000000..a27b7b4 --- /dev/null +++ b/src/mir/Lowering.cpp @@ -0,0 +1,4 @@ +// IR -> MIR(AArch64 指令选择): +// - 将平台无关 IR 翻译为 AArch64 的机器指令序列 +// - 初始阶段使用虚拟寄存器,生成 MIRFunction/MIRBasicBlock/MIRInstr + diff --git a/src/mir/MIRBasicBlock.cpp b/src/mir/MIRBasicBlock.cpp new file mode 100644 index 0000000..6be9d50 --- /dev/null +++ b/src/mir/MIRBasicBlock.cpp @@ -0,0 +1,4 @@ +// 机器基本块(MIRBasicBlock): +// - 维护机器指令列表 +// - 记录或可计算机器级 CFG 前驱/后继信息 + diff --git a/src/mir/MIRContext.cpp b/src/mir/MIRContext.cpp new file mode 100644 index 0000000..5b548c1 --- /dev/null +++ b/src/mir/MIRContext.cpp @@ -0,0 +1,4 @@ +// MIR 上下文: +// - 保存目标约束、指令集信息等(面向 AArch64) +// - 为后端 Lowering/RegAlloc/FrameLowering 提供公共信息 + diff --git a/src/mir/MIRFunction.cpp b/src/mir/MIRFunction.cpp new file mode 100644 index 0000000..5533f22 --- /dev/null +++ b/src/mir/MIRFunction.cpp @@ -0,0 +1,4 @@ +// 机器函数(MIRFunction): +// - 包含机器基本块列表与 CFG 信息 +// - 维护栈帧信息、虚拟/物理寄存器使用情况等 + diff --git a/src/mir/MIRInstr.cpp b/src/mir/MIRInstr.cpp new file mode 100644 index 0000000..c648179 --- /dev/null +++ b/src/mir/MIRInstr.cpp @@ -0,0 +1,4 @@ +// 机器指令(MIRInstr): +// - opcode + operands(寄存器/立即数/栈槽/符号/标签等) +// - 支撑指令选择、寄存器分配与汇编打印 + diff --git a/src/mir/RegAlloc.cpp b/src/mir/RegAlloc.cpp new file mode 100644 index 0000000..75e1ac7 --- /dev/null +++ b/src/mir/RegAlloc.cpp @@ -0,0 +1,4 @@ +// 寄存器分配: +// - 将虚拟寄存器分配到物理寄存器 +// - 处理 spill/reload,并为后续栈帧布局提供栈槽需求信息 + diff --git a/src/mir/Register.cpp b/src/mir/Register.cpp new file mode 100644 index 0000000..32feb7a --- /dev/null +++ b/src/mir/Register.cpp @@ -0,0 +1,4 @@ +// 寄存器表示: +// - 区分虚拟寄存器与物理寄存器,提供编号/属性等 +// - 寄存器类(RegClass):GPR/FPR 等分类与可分配集合描述(供 RA 使用) + diff --git a/src/mir/passes/PassManager.cpp b/src/mir/passes/PassManager.cpp new file mode 100644 index 0000000..c510460 --- /dev/null +++ b/src/mir/passes/PassManager.cpp @@ -0,0 +1,4 @@ +// MIR Pass 管理: +// - 组织后端 pass 的运行顺序(PreRA/PostRA/PEI 等阶段) +// - 统一运行 pass 与调试输出(按需要扩展) + diff --git a/src/mir/passes/Peephole.cpp b/src/mir/passes/Peephole.cpp new file mode 100644 index 0000000..c6d9ab7 --- /dev/null +++ b/src/mir/passes/Peephole.cpp @@ -0,0 +1,4 @@ +// 窥孔优化(Peephole): +// - 删除冗余 move、合并常见指令模式 +// - 提升最终汇编质量(按实现范围裁剪) + diff --git a/src/sem/ConstEval.cpp b/src/sem/ConstEval.cpp new file mode 100644 index 0000000..3e2f66e --- /dev/null +++ b/src/sem/ConstEval.cpp @@ -0,0 +1,4 @@ +// 常量求值: +// - 处理数组维度、全局初始化、const 表达式等编译期可计算场景 +// - 为语义分析与 IR 生成提供常量折叠/常量值信息 + diff --git a/src/sem/Sema.cpp b/src/sem/Sema.cpp new file mode 100644 index 0000000..f25fab6 --- /dev/null +++ b/src/sem/Sema.cpp @@ -0,0 +1,5 @@ +// 语义分析主流程: +// - 符号解析与绑定、类型检查、控制流规则检查 +// - 记录/插入必要的隐式转换(或在节点上标注) +// - 输出为“带类型 / 符号 / 常量信息”的 AST + diff --git a/src/sem/SymbolTable.cpp b/src/sem/SymbolTable.cpp new file mode 100644 index 0000000..3d3327e --- /dev/null +++ b/src/sem/SymbolTable.cpp @@ -0,0 +1,4 @@ +// 符号表与作用域管理: +// - 支持嵌套作用域(块/函数/全局) +// - 变量/函数/参数/常量的注册、查找与遮蔽规则 + diff --git a/src/utils/CLI.cpp b/src/utils/CLI.cpp new file mode 100644 index 0000000..6e84a34 --- /dev/null +++ b/src/utils/CLI.cpp @@ -0,0 +1,5 @@ +// 命令行参数解析: +// - 解析输入/输出路径 +// - 解析输出类型(IR/MIR/ASM)与优化级别等选项 +// - 将参数传递给 main.cpp 的编译流水线驱动 + diff --git a/src/utils/Log.cpp b/src/utils/Log.cpp new file mode 100644 index 0000000..4cb15da --- /dev/null +++ b/src/utils/Log.cpp @@ -0,0 +1,4 @@ +// 日志模块: +// - 统一输出调试信息、阶段信息与错误信息 +// - 提供可配置的日志级别与输出位置(按需要实现) + diff --git a/sylib/sylib.c b/sylib/sylib.c new file mode 100644 index 0000000..7f26d0b --- /dev/null +++ b/sylib/sylib.c @@ -0,0 +1,4 @@ +// SysY 运行库实现: +// - 按实验/评测规范提供 I/O 等函数实现 +// - 与编译器生成的目标代码链接,支撑运行时行为 + diff --git a/sylib/sylib.h b/sylib/sylib.h new file mode 100644 index 0000000..502d488 --- /dev/null +++ b/sylib/sylib.h @@ -0,0 +1,4 @@ +// SysY 运行库头文件: +// - 声明运行库函数原型(供编译器生成 call 或链接阶段引用) +// - 与 sylib.c 配套,按规范逐步补齐声明 + diff --git a/test/run_tests.sh b/test/run_tests.sh new file mode 100644 index 0000000..d5d64d0 --- /dev/null +++ b/test/run_tests.sh @@ -0,0 +1,5 @@ +# Bash 测试脚本: +# - 批量编译 test/test_case/ 下的 *.sy 用例 +# - 将产物与日志写入 test/test_result/(例如 .ll/.s、运行输出、diff 结果) +# - 汇总通过/失败信息并给出统计 +