本项目实现了C语言中 struct/union/enum/typedef 以及全局变量的定义与声明的词法分析与语法分析。
- struct/union 的声明与字段定义
- enum 和 enum 常量的声明
- 基于 typedef 的类型定义
- 变量、函数、指针、数组的声明
cs2612-project-programming/
├── build/ # 构建输出目录
├── resource/
│ └── test/ # 测试文件夹
│ ├── test-enum # enum 测试文件
│ ├── test-identifier-predeclared # 前向声明测试文件
│ ├── test-<feature-1> # 更多测试样例
│ ...
├── doc/ # 文档
├── main # 可执行文件
└── src/ # 源代码
提供了一个简单的 Makefile,可以直接执行 make 来构建项目。
注意:构建过程在MacOS、Ubuntu、mingw上测试通过,但是不能在Windows原生环境上运行。
本项目准备了一个devcontainer,基于Ubuntu20.04提供了所需的bison,flex等依赖。
如果要使用该环境,使用vscode打开文件夹后,选择右下角弹窗“在容器中重新打开”(或者Ctrl-Shift-P搜索命令)以直接使用该环境。
gccbison: 3.8.2flex: 2.6.4
在开发过程中使用了特定的bison和flex版本。在其他版本的运行行为应该不会有太大影响。
请查看Makefile。
make这将会在 build/ 目录下生成中间文件,在当前目录下生成可执行文件 main。
要清除构建文件,可以执行make clean。
可执行文件 main 接受一个参数,为需要进行语法分析的文件路径。将语法/词法分析结果输出到标准输出。
./main <path-to-file>main检测环境变量PARSER_VERBOSE。如果设置了PARSER_VERBOSE(整数值)且值不为0,则会输出更多的调试信息。
例如:
export PARSER_VERBOSE=1
./main <path-to-file>或
PARSER_VERBOSE=1 make test_all随项目提供了batchtest.sh脚本,可以批量测试给定目录下的所有文本文件。
要查看用法,可以运行:
bash batchtest.sh在 resource/test 目录下提供了一些测试文件。在batchtest.mk中,调用了batchtest.sh脚本,可以批量测试resource/test目录下的所有测试文件。
运行resource/test下的所有测试案例:
make test_all输出结果将会在输入文件的同一目录下生成.out文本文件。
清除所有.out文件:
make clean_test_all要查阅测试案例的相关内容,可以查看resource/test/readme.md,以及查看测试输入文件的内容与注释
请查看doc/目录下的文档。
- 理论上不用 devcontainer 也可以跑
- 稍微配置了一下 clang-format,但是devcontainer里的clangd版本太老了,读不懂配置文件
- 有三个移入/规约冲突(关于
annon-right-type) 这些冲突是因为这个标注类型可能为空导致的。 - 利用
lib.h给的哈希表存放一些类型前置定义- 检查在全局变量/Struct/Union/Enum/Typedef声明中出现的标识符是否已经在全局出现过
- 检查Struct/Union/Enum/Typedef被使用时是否已经有前置定义
- 检查Struct/Union的字段内是否有变量名重复
- 指出检查的完备性(没有遗漏检查)
- 完善build、test、使用文档