基于 Flex、Bison 和 C 实现的 C-- 编译器课程项目。
Stage 02:已完成类型系统、符号表和错误类型 1--17 的语义检查,并已接入解析器;符号表还支持选做 2.2 的嵌套作用域。
默认调用 parser 执行实验二语义检查:正确程序不输出,错误程序只输出对应的 Error type 信息。传入 --tree 时保留实验一行为,按先序遍历打印语法树。
当前实现覆盖基础文法,并实现八/十六进制整数、指数形式浮点数及 //、/* ... */ 注释支持。
- C 编译器:
gcc - 词法分析器生成器:
flex - 语法分析器生成器:
bison - 构建工具:
make
make该命令生成 build/parser,并在项目根目录创建 ./parser 入口。
./parser path/to/source.cmm
./parser --tree path/to/source.cmm默认模式执行语义分析;--tree 模式按先序遍历输出实验一语法树。
make test-01 # 实验一:词法、语法与语法树测试
make test-02 # 实验二:类型、符号表与语义检查测试
make test # 运行全部阶段测试各目标的职责如下:
| 命令 | 测试范围 | 说明 |
|---|---|---|
make test-01 |
Stage 01 样例 | 词法、语法与语法树输出 |
make test-02 |
Stage 02 单元测试与样例 | 类型、符号表与语义检查 |
make test |
全部测试 | 依次运行两个阶段 |
| 模块 | 主要职责 | 说明文档 |
|---|---|---|
src/frontend/lexer.l |
将字符流转换为 token,处理数值、注释与词法错误 | 词法分析器 |
src/frontend/syntax.y |
按文法归约、处理优先级和语法错误恢复 | 语法分析器 |
src/frontend/tree.c、tree.h |
创建、连接、打印和释放语法树 | 语法树 |
src/driver/main.c |
打开输入文件、驱动解析并决定输出与退出码 | 语法分析器中的流程说明 |
src/semantic/type.c、type.h |
表示基础类型、数组、结构体和函数类型,并判断类型等价 | 类型系统 |
src/semantic/symbol.c、symbol.h |
维护变量、函数和结构体符号,支持嵌套作用域 | 符号表 |
src/semantic/semantic.c、semantic.h |
遍历 AST、进行类型检查并输出错误类型 1--17 | 语义分析 |
tests/run_tests.sh |
执行清单中的端到端样例,并校验退出码与输出 | 测试说明 |
tests/stage-01/ |
保存实验一样例、清单与说明 | 实验一测试 |
tests/stage-02/ |
运行类型、符号表和端到端语义回归测试 | 实验二测试 |