ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:66.39KB ,
资源ID:29630478      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29630478.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(完整word版编译原理实验LL1文法的判断及转换word文档良心出品.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

完整word版编译原理实验LL1文法的判断及转换word文档良心出品.docx

1、完整word版编译原理实验LL1文法的判断及转换word文档良心出品2016.11.30LL(1)文法的判断及转换 一、实验名称 LL(1)文法的判断及转换二、实验目的输入:任意一个文法输出:(1)是否为LL(1)文法 (2)若是,给出每条产生式的select集 (3)若不是,看看是否含有左公共因子或者含有左递归,并用相应的方法将非LL(1)文法变成LL(1)文法,并输出新文法中每条产生式的select集。三、实验原理1、First集定义令X为一个文法符号(终止符或非终止符)或,则集合First(X)有终止符组成,此外可能还有,它的定义如下: 1.若X是终止符或,则First(X)=X。 2.

2、若X是非终结符,则对于每个产生式XX1X2Xn,First(X)包含了First(X1)-。 若对于某个iA,则First()- 在Follow(A)中。3. 若存在产生式BA,且在First()中,则Follow(A)包括Follow(B)。3、Select集定义 对于产生式A。集合select(A)定义如下:1. 若不能推出,则select(A) = first()。2. 若能推出,则select(A)= first() follow(A)。4、含左递归文法一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。 左递归分为直接左递归和间接左递归。

3、直接左递归经过一次推导就可以看出文法存在左递归,如PPab。 间接左递归侧需多次推导才可以看出文法存在左递归,如文法:SQcc,QRbb,RSaa有S =Qc =Rbc =Sabc四、实验思路 本次实验采用python完成。 1、求非终结符是否能导出空 a. 第一轮扫描。当前的产生式还没被删除,非终结符lp可以导出空,将以该非终结符为左部的产生式标记为要删除的。产生式右部分解,若该产生式右部包含终结符,删除该产生式因为由它不会导出空。判断没有被删除的产生式中是否还有以该非终结符为左部的产生式。 b. 第二轮扫描。逐一扫描每一条产生右部的每一个符号,循化直至每个非终结符的状态都确定下来。 2、求

4、First集算法 存储每一个非终结符对应的First集,扫描每一条产生式,记录每一轮扫描是每个非终结符First集是否增大过。全部初始化为没有增大的状态,对于课本的五种类型依次求解,每次将结果加入对应的集合中,若一次扫描First集没有增大,则说明循环结束。 3、求Follow集算法 存储每一个非终结符对应的Follow集,将#加入文法的开始符号的Follow集合中,记录每一轮扫描是每个非终结符Follow集合是否增大过,全部初始化为没有增大的状态,扫描每一条产生式的右部,扫描到非终结符,判断在该非终结符之后的子串能否推导空,若该符号串可以推导出空,还要将Follow(lp)加入到里面。4、求

5、Select集算法 初始化每条产生式对应的Select集合为空,若产生式右部不能推导出空,则将右部的First集加入Select集,如果可以推出空,则需要同时将左部的Follow集合右部的First集去掉空的部分加入Select集。五、实验小结 通过本次实验,知道了如何判断一个文法是不是LL(1)文法,同时对于First、Follow以及Select集的求解原理变得更加熟悉,并且知道了如何用计算机语言求解First,Follow以及Select集。不足之处是,没有完成判断文法是否为左递归文法以及左递归文法的转换部分。六、附件1、源代码class Gw: def _init_(self): wi

6、th open(Gw.txt) as f: content = f.readlines() content = line.strip() for line in content self.Vn = content0.split( ) self.Vt = content1.split( ) self.start = content2 self.produce = self.left = self.right = for i in range(3,len(content): self.produce.append(contenti) self.left.append(contenti.split(

7、-)0) self.right.append(contenti.split(-)1) def showGw(self): print(非终结符:,self.Vn) print(终 结 符:,self.Vt) print(开始符号:,self.start) print(产生式如下:) for l,r in zip(self.left,self.right): print(l+-+r) def canEmpty(self): self.isEmpty = dict() for i in range(len(self.Vn): self.isEmptyself.Vni = -1 print(self

8、.isEmpty) temp = self.produce: deleteIndex= pointer = 0 while pointer)0 rp = temppointer.split(-)1 if rp=!: self.isEmptylp = 1 for i in range(len(temp): if tempi.split(-)0=lp and i not in deleteIndex: deleteIndex.append(i) l = list(rp) isContainVt = i in self.Vt for i in l if True in isContainVt: de

9、leteIndex.append(pointer) for k in range(len(temp): if k not in deleteIndex: if tempk.split(-)0=lp: break else: self.isEmptylp = 0 pointer = pointer+1 while -1 in self.isEmpty.values(): for i in range(len(temp): if i not in deleteIndex: lp = tempi.split(-)0 rp = tempi.split(-)1 rlsit = list(rp) for

10、j in range(len(rlsit): if self.isEmptyrlsitj=1: if j=len(rlsit)-1: self.isEmptylp=1 elif self.isEmptyrlsitj=0: deleteIndex.append(i) for k in range(len(temp): if k not in deleteIndex: if tempk.split(-)0=lp: break else: self.isEmptylp = 0 else: continue def show(self): print(非终结符能否推导出空的信息:) for v in

11、self.Vn: if self.isEmptyv=1: yon = 是 else: yon = 否 print(%s:%s%(v,yon) def getFirst(self): self.First = dict() for i in self.Vn: self.Firsti = list() isChange = dict() while True: for k in self.Vn: isChangek = 0 for i in range(len(self.produce): lp = self.producei.split(-)0 rp = self.producei.split(

12、-)1 rlist = list(rp) if rlist0=! or rlist0 in self.Vt: if rlist0 not in self.Firstlp: self.Firstlp.append(rlist0) isChangelp=1 else: for j in rlist: if j in self.Vn: if self.isEmptyj=1: oldsize = len(self.Firstlp) templist = self.Firstj: if ! in templist: templist.remove(!) for x in templist: if x n

13、ot in self.Firstlp: self.Firstlp.append(x) if rp.endswith(j) and ! not in self.Firstlp: self.Firstlp.append(!) newsize = len(self.Firstlp) if oldsize!=newsize: isChangelp=1 else: oldsize = len(self.Firstlp) if j in self.Vn: templist = self.Firstj: for x in templist: if x not in self.Firstlp: self.Fi

14、rstlp.append(x) else: if j not in self.Firstlp: self.Firstlp.append(x) newsize = len(self.Firstlp) if oldsize!=newsize: isChangelp=1 break if 1 not in isChange.values(): print(First集合不在增大!) break else: print(First集合有增大!) pass def showFirst(self): print(First集合信息:) for v in self.Vn: print(v,self.Firs

15、tv) def canCauseEmpty(self,plist): first = list() if len(plist)=0: first.append(!) else: for i in plist: if i in self.Vn: if self.isEmptyi=1: t = self.Firsti: if ! in t: t.remove(!) for k in t: if k not in first: first.append(k) if .join(plist).endswith(i) and ! not in first: first.append(!) else: f

16、or k in self.Firsti: if k not in first: first.append(k) break else: if i not in first: first.append(i) break return first def getFollow(self): self.Follow = dict() for i in self.Vn: self.Followi = list() self.Followself.start.append(#) isChange = dict() while True: for k in self.Vn: isChangek = 0 fo

17、r i in range(len(self.produce): lp = self.producei.split(-)0 rp = self.producei.split(-)1 rlist = list(rp) for j in range(len(rlist): if rlistj in self.Vn: reslist = self.canCauseEmpty(rlistj+1:) if ! in reslist: oldsize = len(self.Followrlistj) for y in self.Followlp: if y not in self.Followrlistj:

18、 self.Followrlistj.append(y) newsize = len(self.Followrlistj) if oldsize!=newsize: isChangerlistj = 1 else: pass oldsize = len(self.Followrlistj) for x in reslist: if x!=! and x not in self.Followrlistj: self.Followrlistj.append(x) newsize = len(self.Followrlistj) if oldsize!=newsize: isChangerlistj

19、 = 1 if 1 not in isChange.values(): break def showFollow(self): print(Follow集合信息:) for key in self.Vn: print(key,self.Followkey) def getSelect(self): self.Select = dict() for i in self.produce: self.Selecti = list() for i in range(len(self.produce): lp = self.producei.split(-)0 rp = self.producei.sp

20、lit(-)1 rlist = list(rp) if rlist0=!: for v in self.Followlp: if v not in self.Selectself.producei: self.Selectself.producei.append(v) elif rlist0 in self.Vt: self.Selectself.producei.append(rlist0) else: res = self.canCauseEmpty(rlist) if ! not in res: for v in res: if v not in self.Selectself.prod

21、ucei: self.Selectself.producei.append(v) else: for v in res: if v not in self.Selectself.producei and v!=!: self.Selectself.producei.append(v) for v in self.Followlp: if v not in self.Selectself.producei: self.Selectself.producei.append(v) def showSelect(self): print(Select集合信息:) for key in self.pro

22、duce: print(key,self.Selectkey) def isLLone(self): isright = for k in self.Vn: tset = set() tset.add(#) tset = tset | set(self.Vt) for l,r in zip(self.left,self.right): if k=l: p = l+-+r tset = tset & set(self.Selectp) if len(tset)=0: isright.append(1) else: isright.append(0) if 0 in isright: print(不是LL(1)文法!) self.isll1 = False else: print(是LL(1)文法!) self.isll1 = True print(isright)if _name_=_main_: w = Gw() w.showGw() w.canEmpty() w.show() w.getFirst() w.showFirst() w.getFollow() #res = w.canCauseEmpty(A,D) #print(res=,res) w.showFollow() w.getSelect() w.showSelect() w.isLLone()2、运行结果截图

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1