本文是编译原理C语言LR语法分析器的简单实现项目。
一、需求
拓展需求:除题目的基础要求外,还额外实现了对任意SLR1文法,自动生成拓广文法,且求该文法的first集和follow集,并且自动生成LR0项目集规范簇和识别该文法所有活前缀的DFA,然后根据该DFA自动生成SLR1分析表。
二、运行环境
电脑硬件配置:
处理器:Intel i7 7700HQ
显卡:NVIDIA GeForce GTX 1050 Ti
内存:16GB
软件:
编程语言:C++
IDE:Microsoft Visual Studio 2019
Windows SDK版本:10.0
平台工具集:Visual Studio 2019(v142)
三、核心算法
1、整个程序的模型如图所示
手动分析:
首先对文法进行拓广,求first集和follow集,发现该文法是一个SLR1文法。
构造LR0项目集规范簇及识别该文法所有活前缀的DFA
构造识别该文法的SLR0分析表
整个程序的模型如图所示
预测分析控制程序算法
6、输入形式:
文件输入,格式为:
产生式个数n
{
……
第i(1<=i<=n)个产生式(例如A->a,按照输入顺序分别从1到n编号,拓广产生式为0号,规定终结符和非终结符都是一个字符且非终结符都为大写字母)
……
}
要分析的字符串个数n
{
……
第i(1<=i<=n)个要分析的字符串(要求以$结尾)
……
}
7、输出形式:
先输出该文法的拓广文法,再输出该拓广文法的first集和follow集,再输出SLR0分析表,然后输出用户输入的待分析字符串的分析过程。
四、变量和函数
1、类和枚举:
点击查看代码
1 | enum RS//动作的枚举 |
2、全局变量
点击查看代码
1 | vector<PF> PF_vector;//产生式 |
3、函数
点击查看代码
1 | ITEM::ITEM()//默认构造函数 |
PS:关于每个函数内部详细实现详见main.cpp中写好了详细的注释,我几乎对每一步操作的目的和函数的目的都写了详细的注释。
五、测试样例:
六、项目地址
本项目的源码、可执行程序均已经存放于我的Github,欢迎下载查看: