详细代码下载地址:http://download.csdn.net/detail/qdbszsj/9331155
编译原理 LR(0)项目集规范族的构造
http://blog.csdn.net/qdbszsj
经过若干天的编写与调试,我们终于实现了老师布置的作业,输出了LR(0)分析表,并且可以判断一个语句是否符合文法。整个过程我是使用codeblocks的c++编写的,其中用了一下STL标准库中的队列、映射,本来还用了链表,最后舍弃掉了,待我细细道来。
整个assignment可以分为2个part:1、分析表的构造2、判断一个语句是否符合文法
PART1
首先我要说明一下我采用的数据结构,这点非常重要。
struct node{//结点
int id;//编号
int num;//包含的推导式个数
char s[20][50];
};
这样的一个结点,封装了一个状态,s[20][50]存储的是一个结点里面包含的若干个语句。
然后我从初始状态开始,挪动“.”的位置,不断用bfs(宽度优先搜索)向外搜索(其实这里用dfs深搜也可以,看个人爱好了,效率和复杂度都差不多)并且生成一个新的状态。每搜索到一个新的状态&#