




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2016.11.30LL(1)文法的判断及转换目录一、实验名称2二、实验目的2三、实验原理21、First集定义22、Follow集定义23、Select集定义34、含左递归文法3四、实验思路31、求非终结符是否能导出空32、求First集算法33、求Follow集算法34、求Select集算法4五、实验小结4六、附件41、源代码42、运行结果截图10一、实验名称LL(1)文法的判断及转换二、实验目的输入:任意一个文法输出:(1)是否为LL(1)文法 (2)若是,给出每条产生式的select集 (3)若不是,看看是否含有左公共因子或者含有左递归,并用相应的方法将非LL(1)文法变成LL(1)文
2、法,并输出新文法中每条产生式的select集。三、实验原理1、First集定义令X为一个文法符号(终止符或非终止符)或,则集合First(X)有终止符组成,此外可能还有,它的定义如下: 1. 若X是终止符或,则First(X)= X。 2. 若X是非终结符,则对于每个产生式X>X1X2Xn,First(X)包含了First(X1)-。 若对于某个i < n,所有的集合First(X1),. ,First(Xi)都包含了,则First(X)也包 括了First(Xi+1)- 。若所有集合First(X1)
3、,.,First(Xn)都包括了,则First(X)也包括了。2、Follow集定义给出一个非终结符A,那么集合Follow(A)则是由终结符组成,此外可能还含有#(#是题目约定的字符串结束符)。集合Follow(A)的定义如下:1. 若A是开始符号,则#在Follow(A)中。2. 若存在产生式B>A,则First()- 在Follow(A)中。3. 若存在产生式B>A,且在First()中,则Follow(A)包括Follow(B)。3、Select集定义对于产生式A>。集合select(A>)定义如下:1. 若不能推出,则select(A>) = first
4、()。2. 若能推出,则select(A>)= first() follow(A)。4、含左递归文法一个文法G,若存在P经过一次或多次推导得到Pa(即能推导出以P开头的式子), 则称G是左递归的。 左递归分为直接左递归和间接左递归。 直接左递归经过一次推导就可以看出文法存在左递归,如PPab。 间接左递归侧需多次推导才可以看出文法存在左递归,如文法:SQcc,QRbb,RSaa有S =>Qc =>Rbc =>Sabc四、实验思路本次实验采用python完成。1、求非终结符是否能导出空a. 第一轮扫描。当前的产生式还没被删除,非终结符lp可以导出空,将以该非终结符为左部的
5、产生式标记为要删除的。产生式右部分解,若该产生式右部包含终结符,删除该产生式因为由它不会导出空。判断没有被删除的产生式中是否还有以该非终结符为左部的产生式。b. 第二轮扫描。逐一扫描每一条产生右部的每一个符号,循化直至每个非终结符的状态都确定下来。2、求First集算法存储每一个非终结符对应的First集,扫描每一条产生式,记录每一轮扫描是每个非终结符First集是否增大过。全部初始化为没有增大的状态,对于课本的五种类型依次求解,每次将结果加入对应的集合中,若一次扫描First集没有增大,则说明循环结束。3、求Follow集算法存储每一个非终结符对应的Follow集,将'#'加
6、入文法的开始符号的Follow集合中,记录每一轮扫描是每个非终结符Follow集合是否增大过,全部初始化为没有增大的状态,扫描每一条产生式的右部,扫描到非终结符,判断在该非终结符之后的子串能否推导空,若该符号串可以推导出空,还要将Follow(lp)加入到里面。4、求Select集算法初始化每条产生式对应的Select集合为空,若产生式右部不能推导出空,则将右部的First集加入Select集,如果可以推出空,则需要同时将左部的Follow集合右部的First集去掉空的部分加入Select集。五、实验小结通过本次实验,知道了如何判断一个文法是不是LL(1)文法,同时对于First、Follow
7、以及Select集的求解原理变得更加熟悉,并且知道了如何用计算机语言求解First,Follow以及Select集。不足之处是,没有完成判断文法是否为左递归文法以及左递归文法的转换部分。六、附件1、源代码class Gw: def _init_(self): with open('Gw.txt') as f: content = f.readlines() content = line.strip() for line in content self.Vn = content0.split(' ') self.Vt = content1.split('
8、') self.start = content2 duce = self.left = self.right = for i in range(3,len(content): duce.append(contenti) self.left.append(contenti.split('->')0) self.right.append(contenti.split('->')1) def showGw(self): print('非终结符:',self.Vn) print('终 结 符:&
9、#39;,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.isEmpty) temp = duce: deleteIndex= pointer = 0
10、while pointer<len(temp): if pointer not in deleteIndex: lp = temppointer.split('->')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
11、) isContainVt = i in self.Vt for i in l if True in isContainVt: deleteIndex.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
12、 in deleteIndex: lp = tempi.split('->')0 rp = tempi.split('->')1 rlsit = list(rp) for 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
13、.split('->')0=lp: break else: self.isEmptylp = 0 else: continue def show(self): print('非终结符能否推导出空的信息:') for v in 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.Firs
14、ti = list() isChange = dict() while True: for k in self.Vn: isChangek = 0 for i in range(len(duce): lp = ducei.split('->')0 rp = ducei.split('->')1 rlist = list(rp) if rlist0='!' or rlist0 in self.Vt: if rlist0 not in self.Firstlp: self.Firstlp.a
15、ppend(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 not in self.Firstlp: self.Firstlp.append(x) if rp.endswith(j) and '!' not
16、 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.Firstlp.append(x) else: if j not in self.Firstlp: self.Firstlp
17、.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.Firstv) def canCauseEmpty(self,pli
18、st): 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: fir
19、st.append('!') else: for 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
20、True: for k in self.Vn: isChangek = 0 for i in range(len(duce): lp = ducei.split('->')0 rp = ducei.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 =
21、 len(self.Followrlistj) for y in self.Followlp: if y not in self.Followrlistj: 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.Fol
22、lowrlistj.append(x) newsize = len(self.Followrlistj) if oldsize!=newsize: isChangerlistj = 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 duce: self.Sel
23、ecti = list() for i in range(len(duce): lp = ducei.split('->')0 rp = ducei.split('->')1 rlist = list(rp) if rlist0='!': for v in self.Followlp: if v not in self.Sducei: self.Sducei.append(v) elif rlist0 in self.Vt: self.
24、Sducei.append(rlist0) else: res = self.canCauseEmpty(rlist) if '!' not in res: for v in res: if v not in self.Sducei: self.Sducei.append(v) else: for v in res: if v not in self.Sducei and v!='!': self.Sducei.append(v) for v in self.Followlp: if v not in self.Select
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业生物技术研发及应用推广合同书
- 软件设计类合同协议
- 遗产放弃协议书范本
- 农业合作社种植与养殖一体化协议
- 运动馆经营合同协议
- 文员劳动用工合同
- 网络舆情监测与应对措施制定指南
- 音乐史与音乐欣赏能力测试
- 婚姻抚养费协议书
- 灯具维修协议书
- 2025年医保知识考试题库:医保基金监管案例及答案解析试卷
- 2024年湖南省普通高中学业水平合格性考试历史试题(原卷版+解析版)
- 《建设工程施工合同(示范文本)》(GF-2017-0201)条款
- 新版人教版七年级下册地理课件 第九章 东半球其他的地区和国家 第四节 澳大利亚
- 《水门事件简介》课件
- 《建筑CAD 》课程标准
- 《抖音竞品分析》课件
- 医院药学 课件全套 陈菲 模块1-12 医院药学认知-临床药学进展
- 医保知识及政策培训课件
- 印染行业安全培训
- 2024年中考二轮专题复习道德与法治主观题答题技巧(小论文)之演讲稿
评论
0/150
提交评论