这个项目实现了一个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文件夹内,它们分别表示正常情况和异常情况。