这个项目实现了一个C/C++词法解析与语法分析器。词法解析生成中间结果为符号表、错误表和标识符表。语法分析使用LL(1)分析法,生成结果为文法、LL(1)分析表、First集Follow集Select集、LL(1)分析过程以及语法分析树文件。该项目同时是武汉大学编译原理课程两次实习作业。
include
:词法解析与语法分析的代码头文件REF
: 参考项目src
: 词法解析与语法分析的代码源文件test
: 用来测试词法解析与语法解析的测试文件夹production.txt
: 产生式文件,用于语法解析,可以自定义产生式,程序会自动解析生成LL(1)分析表CMakeLists.txt
: CMake配置文件
在该项目目录下创建一个build
文件夹:
mkdir build
进入build
文件夹,生成ninja配置文件:
cd build
cmake ..
使用ninja生成程序:
ninja
这样在build
文件夹下就生成了词法解析与语法分析程序LexAndParser.exe
进入test
文件夹,把需要解析的C/C++文件放入case
文件夹内
为了方便测试,这里写了Python
脚本,通过Python
调用程序并生成结果。
进入test
文件夹,如果想对所有文件都进行解析,那就使用
python test.py
如果只想针对单个文件进行解析,比如test.cpp
,那就使用
python test.py test.cpp
生成的结果会放入result
文件夹,对应文件的解析结果会放入到对应名字的文件夹内,比如test.cpp
的文件的结果就会放入result
文件夹的test
文件夹内
grammar.txt
: 根据产生式、teminal和non-terminal生成的文法文件lex.txt
: 词法解析的中间结果,包括符号表、错误表和标识符表LL(1)Table.txt
: LL(1)分析表parser.txt
: 得到的First集、Follow集和Select集ParserResult.txt
: LL(1)的分析过程和语法树结果,其中语法树同样缩进表示在语法树的同一层
这里给出了两个简单的测试文件,分别是normal.cpp和erro.cpp,位于test/case
文件夹内,生成的结果位于test/result
文件夹内,它们分别表示正常情况和异常情况。