




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上 编译原理实验报告实验名称 自动生成LR(0)分析表 实验时间 2011年6月13日 院系 计算机科学与技术 班级 08计算机科技一班 学号 E 姓名 王全鸿 1. 试验目的输入:任意的压缩了的上下文无关文法。输出:相应的LR(0)分析表。2. 实验原理在LR分析工作过程中的任何时候,栈里的文法符号(自栈底而上)X1X2Xm应该构成活前缀,把输入串的剩余部分配上之后即应成为规范句型(如果整个输入串确实构成一个句子)。因此,只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部分没有错误。构造识别文法活前缀DFA有3种方法:(1)根据形式定义求出活前缀的正
2、则表达式,然后由此正则表达式构造NFA再确定为DFA;(2)求出文法的所有项目,按一定规则构造识别活前缀的NFA再确定化为DFA;(3)使用闭包函数(CLOSURE)和转向函数(GO(I,X)构造文法G的LR(0)的项目集规范族,再由转换函数建立状态之间的连接关系来得到识别活前缀的DFA。对于LR(0)文法,我们可以直接从它的项目集规范族C和活前缀识别自动机的状态转换函数GO构造出LR分析表。下面是构造LR(0)分析表的算法。假定C=I0, I1,,In,令每个项目集Ik的下标k为分析器的一个状态,因此,G'的LR(0)分析表含有状态0,1,n。令那个含有项目S'S的Ik的下标
3、k为初态。ACTION子表和GOTO子表可按如下方法构造:(1)若项目A.a属于Ik且GO (Ik, a)= Ij, a为终结符,则置ACTIONk, a为“把状态j和符号a移进栈”,简记为“sj”;(2)若项目A属于Ik,那么,对任何终结符a,置ACTIONk,a为“用产生式A进行规约”,简记为“rj”;其中,假定A为文法G'的第j个产生式;(3)若项目S'S属于Ik, 则置ACTIONk, #为“接受”,简记为“acc”;(4)若GO (Ik, A)= Ij, A为非终结符,则置GOTOk, A=j;(5)分析表中凡不能用上述1至4填入信息的空白格均置上“出错标志”。按上述
4、算法构造的含有ACTION和GOTO两部分的分析表,如果每个入口不含多重定义,则称它为文法G的一张LR(0)分析表。具有LR(0)表的文法G称为一个LR(0)文法,LR(0)文法是无二义的。3. 实验内容(1) 实现计算闭包closure(I)的算法;(2) 实现转向函数Go(q,a)的算法;(3)构造文法项目集函数CreateProjectSet();定义数据结构:专心-专注-专业typedef struct SElemType *base,*top; int stacksize; SqStack;struct grammer char *g; char vt127; char vn27;
5、char s; int line;typedef struct prjsetint id;/项目集编号,从10000开始,与项目编号(从0开始)区别struct prjset *next;/指向下个项目集char prjtPROJECT_SET_SIZE+1;/PROJECT_SET_SIZE个单元,存储项目的编号,prjt0项目编号的个数char pointafterPROJECT_SET_SIZE+1;/圆点后的字符,pointafter0字符个数struct prjset *actorgoPROJECT_SET_SIZE;char pointbefore;prjset,*pprjset;
6、4.实验心得通过这次实验我对LR(0)语法分析有了一个更熟悉的掌握,对预先定义的文法规则,并集成词法分析、符号表管理等程序来生成LR(0)分析表有了清醒的认识,并且对高级程序语言一般结构和主要共同特征有了全面的认识和理解.5.实验代码void CreateProjectSet()/构造文法的项目集int i;int j;int k;int id = ID;pprjset p,q;root.I = root.tail = NULL;if(p = (pprjset)malloc(sizeof(prjset) = NULL) exit(1);p->id = id;p->next = NU
7、LL;p->prjt0 = 0;p->pointafter0 = 0;p->pointbefore = '0'for(j=0; j<PROJECT_SET_SIZE; j+)p->actorgoj = NULL;for(j=0; j<PROJECT_SET_SIZE; j+)p->actorgoj = NULL;root.I = p;root.tail = p;root.size = 1;for(i=0; i<project.line; i+)if(project.s=project.gpiGRAMMER_START_CHAR_P
8、OS&&DOT= project.gpiGRAMMER_START_CHAR_POS+1)JoinSet(root.I->prjt, project.gpiPROJECT_ID_POS);JoinSet(root.I->pointafter, project.gpiAFCHAR_POS);break;/if/forClosure(root.I);int pos;for(q=root.I; q!=NULL; q=q->next)for(i=1; i<=q->pointafter0; i+)pos = i;pos-;if(p = (pprjset)ma
9、lloc(sizeof(prjset) = NULL) exit(1);p->next = NULL;p->prjt0 = 0;p->pointafter0 = 0;p->pointbefore = q->pointafteri;for(j=0; j<PROJECT_SET_SIZE; j+)p->actorgoj = NULL;for(j=1; j<=q->prjt0; j+)if(project.gpq->prjtjAFCHAR_POS = p->pointbefore)go(q->prjtj, p);/forClos
10、ure(p);/判断p指向的项目集是否已存在pprjset ptr;int flag;int flagsame;flagsame = 1;flag = 1;for(ptr=root.I; ptr!=NULL; ptr=ptr->next)flag = 1;if(p->prjt0 = ptr->prjt0)for(k=1; k<=p->prjt0; k+)if(!IsInSet(ptr->prjt, p->prjtk)flag = 0;break;/if/for/ifelseflag = 0;/elseif(flag = 0)flagsame = 0;e
11、lseflagsame = 1;break;/forif(flagsame)/flagsame = 1 , 有与*p相同的项目集,删除*pq->actorgoi-1 = ptr;free(p);else/将p挂到root.tailq->actorgoi-1 = p;p->id = +id;root.tail->next = p;root.tail = p;root.size+;/for/for/CreateProjectSetvoid Closure(prjset *pset)/rk 为项目的编号,prjset指向项目集int i;int j;int rk;for(i=
12、1; i<=pset->prjt0; i+)rk = pset->prjti;if(IsInSet(g.vn, project.gprkAFCHAR_POS)/若圆点后字符为vnfor(j=0; j<project.line; j+) if(project.gpjGRAMMER_START_CHAR_POS=project.gprkAFCHAR_POS && project.gpjGRAMMER_START_CHAR_POS+1 = DOT)JoinSet(pset->prjt, project.gpjPROJECT_ID_POS);JoinSet
13、(pset->pointafter, project.gpjAFCHAR_POS);/if/for/if/for/Closureint go(int rk, pprjset prjset)/rk为项目编号,将rk的去向加入prjset指向的项目集中,返回项目编号,若无返回-1int i;int j;int rksize;char rkS;char rkpointafter;if(rkpointafter = project.gprkAFCHAR_POS) = '0')return -1;int pointpos;pointpos = IsInSet(&projec
14、t.gprkPROJECT_LEN_POS, DOT);pointpos += PROJECT_LEN_POS;rksize = project.gprkPROJECT_LEN_POS;rkS = project.gprkGRAMMER_START_CHAR_POS;for(i=0; i<project.line; i+) if(project.gpiGRAMMER_START_CHAR_POS=rkS&&project.gpiPROJECT_LEN_POS = rksize && project.gpiBFCHAR_POS = rkpointafter)int flag;flag = 1;for(j=pointpos+2;j<=project.gpiPROJECT_LEN_POS+PROJECT_LEN_POS; j+)if(project.gpij != project.gprkj)flag = 0;break;/forif(flag)JoinSet(prjset->prjt, project.gpiPROJECT_ID_POS);/将项目加入项目集if(project.gpiAFCHAR_POS != '0')JoinSet(prjset
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 种子批发市场客户关系维护与提升考核试卷
- 取暖初二语文作文
- 看花灯初三语文作文
- 发酵豆酱的抗氧化能力研究考核试卷
- 生态系统稳定性监测与预警考核试卷
- 水电工程案例分析与启示考核试卷
- 煤炭批发市场供需平衡分析考核试卷
- 2-15逻辑函数的化简-卡诺图法4
- 山西农业大学《统计学B》2023-2024学年第二学期期末试卷
- 丽江文化旅游学院《数据描述与可视化》2023-2024学年第二学期期末试卷
- 【《新能源汽车行业融资模式探析:以蔚来汽车为例》11000字(论文)】
- 超聚变 FCIA 考试题库
- 劳动实践烹饪课程设计
- 第十七章 勾股定理 -利用勾股定理求最短路径问题(教案)-2023-2024学年人教版数学八年级下册
- 2024年社区工作者面试题库与答案
- 销售人员工资方案底薪+提成+奖金
- DB34∕T 3221-2018 火灾高危单位消防安全评估规程
- 地震监测设备维护保养手册
- 上海市市辖区(2024年-2025年小学四年级语文)统编版期中考试((上下)学期)试卷及答案
- 【部编版道德与法治六年级下册】全册测试卷(含答案)
- 专业劳务派遣服务行业发展方向及匹配能力建设研究报告
评论
0/150
提交评论