LR 分析方法程序设计原理与实现技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LR 分析方法程序设计原理与实现技术1
郑杰09274053
本实验程序中的一些约定:在工程文件main.h中定义所有函数,和数据结构。在
符号方面,$S定义为拓广文法的新引入的起始符号,$START不能和$S一样,并
且,为了方便,在原来的产生式上强行加上这么一条产生式$S $START,这一点
在main.c中定义文法可以看出来,并且该产生式加在产生式集的首要位置。
状态栈的设计引用以前程序中的数据结构,但是栈操作在本程序中有所扩展。
下面按照程序编写过程顺序介绍各个模块:
一.文法产生式扩展
由原来的产生式拓展成为加’.’的文法,并且在这个过程中要引入新的起始符号,但是在程序中并没有在这个过程中这么做,原因是因为在原来的产生式集中已经引入新的符号以及产生式,根据原始产生式集计算所需要存储新的拓展产生式集的所需要的产生式个数,然后动态开辟内存空间,再对每个原始产生式的各个位置加'.'。
在本次程序中用来产生拓展文法产生式集的函数定义如下:
PPRO ParseProArray(
PPRO lpPriProArr,
int iProLen,
int *iParsedLen)
//参数说明:
lpPriProArr:PPRO原始产生式集
iProLen:int原始产生式个数
iParsedLen:int*;拓展产生式集的个数返回值
//返回值:拓展产生式集的首地址
二.CLOSURE闭包求取
在介绍求一个项目集的闭包前,先介绍程序中存储项目集(状态)的数据结构:
typedef struct _ITEM_COLLOECTION
{
int iCount;//项目集合中的产生式个数
int iSeqNumber;//项目集合(状态)的状态号
PPRO ProCollection[MAX_ITEM_COUNT];//产生式集合的引用数组
struct _ITEM_COLLOECTION * nextCollection;//由于程序中项目集合之间存储组织是单向链表,因此有这个域
struct _GO{//GOTO映射数组,
byte Symbol;//经历当前符号
struct _ITEM_COLLOECTION * DestStatus;//跳转的下一个状态(项目集合)的引用
}GO_MAP[SYMBOL_COUNT];//由符号个数来定义这个数组的长度
}ITEM_COLL,*PITEM_COLL;
1编译原理第五次实验报告.
求解一个项目集合的CLOSURE闭包的具体方法是
1.对于给定的项目集I,对于I中的的每一个产生式属于
2.对于现有的闭包集合中的产生式A-->a.Xb,其中X是非终结符,那么对于文法拓展的产生式X-->.Y均属于CLOSURE(I)。迭代这个过程直到收敛为止。
程序中沿用之前程序中收敛方式,引入一下函数:
int AddPro(PITEM_COLL pColl,PPRO ppro,int *iVar)
//这个函数往项目集中加入产生式
//iVar的值为在函数成功调用的时候返回加入产生式前后的变化
//iVar==0说明这个函数在此次调用中并没有加入新的产生式,即该产生式重复
//iVar==1说明加入的产生式为之前不存在的
在上述求闭包的过程中进行一次完整的查找遍历时候,每次调用AddPro的时候,若都iVar==0,则说明可以收敛了。
产生CLOSURE闭包的函数定义如下:
PITEM_COLL GetClosure(
PPRO lpProArray,
PITEM_COLL lpSrcColl,
int iProLen)
//参数说明:lpSrcColl:PPRO ,拓展文法产生式数组
//lpSrcColl:PITEM_COLL源状态
//iProLen:int
//返回值:闭包集
三.创建项目集规范族
创建项目集规范族的过程也是一个收敛迭代过程,以状态(项目集)为单位,对于每一个符号S,在这个项目集中查找右部形如-->.Sb的产生式,获取其后继项目2,,对于所有满足条件的后继项目所组成的集合,当这个项目集不为空时,再获取其闭包,这个闭包就是项目集合,但是这个项目集合有可能与之前的项目集合重复3,因此不能在没有判断是否重复的情况下加入的项目集规范族。
程序中构建项目集规范族的函数在程序中如下定义:
void ConstructItemCollFamily(
PITEM_COLL lpCollHeader,
PPRO lpProArray,
int iProLen,
PITEM_COLL lpInitStatus)
//lpCollHeader:PITEM_COLL:项目族的链表头
//lpProArray:PPRO原始产生式数组
//iProLen:int 原始产生式数组长度
//lpInitStatus:PITEM_COLL:初始状态
函数返回后,以lpCollHeader为首的状态链表中蕴含了能够识别所有活前缀的有穷自动机。状态变迁隐含在项目集族的每一个项目集中GO_MAP:struct _GO数组域中,数组的长度为
2程序中获取后继项目的函数在程序中定义为:
PPRO GetSubSeqItem(PPRO lpProArray,int iProLen,PPRO lpCurPro)
3程序中判断项目集合产生式相等的函数定义:
int BeEqualColl(PITEM_COLL Coll1,PITEM_COLL Coll2);
int beEqualPro(PPRO lpPro1,PPRO lpPro2);