编译原理实验自动生成LR(0)分析表.doc
《编译原理实验自动生成LR(0)分析表.doc》由会员分享,可在线阅读,更多相关《编译原理实验自动生成LR(0)分析表.doc(12页珍藏版)》请在咨信网上搜索。
1、2016.12.14自动生成LR(0)分析表目录一、实验名称2二、实验目的2三、实验原理21、闭包closure(I)22、转换函数GO(I,X)23、ACTION子表和GOTO子表的构造2四、实验思路31、输入32、建立项目33、closure算法34、转向函数GO(I,X)的算法35、建立状态及对应的项目集36、ACTION子表的构造47、GOTO子表的构造4五、实验小结4六、附件51、源代码52、运行结果截图9一、实验名称自动生成LR(0)分析表二、实验目的1、实现计算闭包函数CLOSURE的算法。2、实现转向函数GO(I,X)的算法。 3、实现ACTION子表和GOTO子表的构造算法。
2、4、输入任意的压缩了的上下文无关文法,输出相应的LR(0)分析表(以表格形式输出)。三、实验原理1、闭包closure(I)若文法G已拓广为G,而S为文法G的开始符号,拓广后增加产生式S-S。如果I是文法G的一个项目集,定义和构造I的闭包closure(I)如下:a.I的项目在closure(I)中。b.若A-B属于closure(I),则每一形如B-的项目也属于closure(I)。c.重复b直到不出现新的项目为止。即closure(I)不再扩大。2、转换函数GO(I,X)GO(I,X)=closure(J)其中:I为包含某一项目集的状态。X为一文法符号,XVnVtJ=任何形如A-X的项目|
3、A-X属于I3、ACTION子表和GOTO子表的构造a.若项目A.a属于Ik且GO (Ik, a)= Ij, a为终结符,则置ACTIONk, a为“把状态j和符号a移进栈”,简记为“sj”; b.若项目A属于Ik,那么,对任何终结符a,置ACTIONk,a为“用产生式A进行规约”,简记为“rj”;其中,假定A为文法G的第j个产生式c.若项目SS属于Ik, 则置ACTIONk, #为“接受”,简记为“acc”; d.若GO (Ik, A)= Ij, A为非终结符,则置GOTOk, A=j; e.分析表中凡不能用上述1至4填入信息的空白格均置上“出错标志”。 按上述算法构造的含有ACTION和G
4、OTO两部分的分析表,如果每个入口不含多重定义,则称它为文法G的一张LR(0)分析表。具有LR(0)表的文法G称为一个LR(0)文法,LR(0)文法是无二义的。四、实验思路本次实验采用python完成。1、输入构造一个LR类,输入非终结符,终结符,开始符以及产生式分别存于LR类的成员:Vn,Vt,start,production。2、建立项目构造函数Project,根据产生式建立项目,对每一条产生式的右部进行处理,依次在右部的每个终结符和非终结符前添加原点,并在最后添加原点。3、closure算法构造函数closure,求一个项目的闭包closure。分三种情况讨论,对于S-和E-a这两种情况
5、,返回自身。对于E-bB这种情况,对项目的右部进行处理,继续求B-r闭包,因此这是一个递归函数。最终函数以列表的形式返回每个项目集。4、转向函数GO(I,X)的算法构造函数GO,求一个项目集的GO(I,X)。建立字典go存放最终结果,对不是S-a形式的项目进行讨论,对项目的右部进行处理,将原点后移一位,利用closure函数得到圆点后移得到的项目的项目集,加入go中。直到处理完该项目集的所有项目。5、建立状态及对应的项目集构造函数createDFA,建立状态及对应的项目集。首先,从拓广文法的第一个项目开始,建立初态,定义number存放状态编号,初始值为0。设立字典status存放状态编号及对
6、应的项目集。将初态加入一个队列qu中。每次从qu中取出一个状态,求该状态的项目集的Go(I,x),再对得到的项目集进行判断,若该项目集是已知的状态,则不做处理,若该项目集是新的状态,则将其加入队列qu中,number加1。每次从qu中取出一个状态重复上述操作,直到队列为空,说明已求得所有状态。6、ACTION子表的构造分两种情况讨论:项目集只有一个项目和项目集不止一个项目。对于第一种情况,再分两种情况,看该项目是否对应了初态,若是,则将#对应为acc,其余终结符对应为error,若不是,则求得该项目去掉圆点之后的产生式的编号i,终结符合#对应为ri。对于项目集不止一个项目的情况,依次对终结符和
7、#寻找在该状态的的GO(I,X)下是否有所对应,有则求得编号对应为Si,没有则对于error。7、GOTO子表的构造对于每个状态的GO(I,X)函数进行遍历,寻找是否有对应的终结符,若有则返回对应的项目集的编号,若没有则返回error。五、实验小结通过本次实验,了解了LR(0)分析表的构造,对于构造过程所需要的一些算法有了深入的了解,通过实际的编写程序代码完成LR(0)分析表的构造,对于程序的编写能力有了一定的提升。在实验过程中,主要对于closure闭包函数的构造以及状态的设置有问题。Closure闭包函数用了递归的结构,因此对于递归的结束条件需要标注清楚。对于状态的建立,需要注意每次通过G
8、O(I,X)得到的新的项目集是否是已经存在的状态,若是则不做处理。对于状态的遍历使用队列来完成,每次新的状态都加入队列中,队列为空说明状态遍历完毕。有一点问题值得注意,由于状态编号的项目集的存储结构使用了字典,字典是无序的结构,因此每次遍历得到的状态编号都不同,程序的每次运行得到的最终LR(0)分析表不唯一。六、附件1、源代码import copyimport queueclass LR: def _init_(self): self.Vn = self.Vt = self.start = None # 开始符号 self.production = # 产生式 self.project = #
9、 项目 self.status = # 存放状态编号及对应的项目集 self.goto = # 存放goto表 0:E:1,A:error,B:error self.action = # 存放action表 0:a:S2,b:S3 def setVn(self): Vn = input(输入非终结符(以空格区分, 回车结束):) self.Vn = Vn.split( ) def setVt(self): Vt = input(输入终结符(以空格区分, 回车结束):) self.Vt = Vt.split( ) def setS(self): S = input(输入开始符号(以回车结束):)
10、 self.start = S def setf(self): # 生成产生式 n = int(input(输入产生式数目:) print(输入产生式(以回车区分):) for i in range(n): f = input() self.production.append(f) def Project(self): # 建立项目 for f in self.production: temporary = copy.deepcopy(f) # temporary与f相同 temporary = temporary.split(-) l = temporary0 # 产生式左部 r = lis
11、t(temporary1) # 产生式右部 for i in range(len(r)+1): # 对产生式右部处理 temporary1 = copy.deepcopy(r) temporary1.insert(i,) newf = l+-+.join(temporary1) self.project.append(newf) def closure(self, pro): # 求一个项目pro的闭包 E- E-b E-bB 返回列表 temporary = # 最终返回的结果 temporary.append(pro) # 将pro自身加入 l1 = pro.split(-)0 # 左部
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 自动 生成 LR 分析
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【人****来】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【人****来】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。