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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

LL1语法分析器B1921.docx

1、LL1语法分析器B1921实验报告(2014/2015学年第二学期)课程名称编译原理实验名称语法分析器的构造实验时间2015年5月29日指导单位计算机学院软件工程系指导教师蒋凌云学生姓名Cjj班级学号B-学院(系)计算机学院专业NIIT成绩批阅人日期实验报告实验名称语法分析器的构造指导教师蒋凌云实验类型上机实验学时4实验时间2015-5-14一、 实验目的和要求设计、编制、调试一个LL(1)语法分析程序,利用语法分析器对符号串进行识别,加深对语法分析原理的理解。要求设计并实现一个LL(1)语法分析器,实现对算数文法E-E+T|T T-T*F|F F-(E)|i所定义的符号串进行识别。二、 实验

2、环境(实验设备)Mac OS X + Python三、 实验原理及内容AnalyseMachine:Load()方法载入文法规则,自动求出First集,Follow集,分析表Judge( )方法 判断某一字符串是否为当前文法的句子程序代码#coding:utf-8#LL(1)分析法#By:Importcjj#由于仓促,代码有很多地方不是科学,但是基本功能已经实现#2015-6-15classAnalyseMachine(object): def _init_(self): pass def load(self, Grammers): 载入文法规则 参数 Grammers: 文法的规则列表 se

3、lf.Grammers = Grammers self.noLeftRecursionGrammers = self._NoLeftRecursion(self.Grammers) self.start = self.Grammers00 self.nChars = self._GetVn(self.noLeftRecursionGrammers) self.tChars = self._GetVt(self.noLeftRecursionGrammers) self.firstSet = self.FirstSet(self.noLeftRecursionGrammers) self.fol

4、lowSet = self.FollowSet(self.noLeftRecursionGrammers) self.analyseTable = self.AnalyseTable(self.noLeftRecursionGrammers, self.firstSet, self.followSet) def Judge(self, string): 判断字符串是否为当前文法的句子 isMatch = False analyseStack = #, self.start StringStack = list(string) + # print u=*25,u判断字符串=%s%string,u

5、=*25 print %-30s%-12s%s%(u分析栈,u余留输入串,u所用生成式) try: while analyseStack: xm = analyseStack-1 ai = StringStack0 print %-20s%20s%10s%(.join(analyseStack),.join(StringStack), ), if xm in self.nChars: analyseStack.pop() expression = self.analyseTablexmai if expression = ERROR: print raise ValueError print

6、expression, index = expression.find(:=) + 3 ifself._Split(expressionindex:):-1 != : analyseStack += self._Split(expressionindex:):-1 #逆序加入 elifxm = ai and xm != #: analyseStack.pop() StringStack.pop(0) elifxm = ai and xm = #: analyseStack.pop() isMatch = True print except Exception as e: pass result

7、 = u%s为文法定义的句子 if isMatch else u%s不是文法定义的句子 print result%string print u=*25,u判断字符串=%s%string,=*25 return isMatch defFirstSet(self, Grammers): 构造文法的First集 speSymbol = := Vn = self.nChars Vt = self.tChars First = self._SubExpressions(Grammers) #新建一个以所有非终结符作为键,以空列表作为值的字典 FirstDict = for nChar in Vn: Fi

8、rstDictnChar = lock = 1 while First and lock= 0: char = expressionindex if char = nChar: break elif char in Vt: break elif char not in nilChar: followLink2char.append(nChar) # print 1 add %s to follow %s%(nChar, char) break else: followLink2char.append(nChar) # print 2 add %s to follow %s%(nChar, ch

9、ar) index -= 1 # print followLink2 hasFollowChar = notFollowChar = for nChar, links in followLink2.items(): if not links: hasFollowChar.append(nChar) else: notFollowChar.append(nChar) # print hasFollowChar # print notFollowChar lock = 1 while notFollowChar and lock 100: delChar = for nChar in notFol

10、lowChar: # print nChar is %s%nChar if set(followLink2nChar).issubset(set(hasFollowChar): for link in followLink2nChar: FollowDictnChar += FollowDictlink delChar.append(nChar) # print delChar, delChar # print hasFollowChar, hasFollowChar # print notFollowChar, notFollowChar for char in delChar: hasFo

11、llowChar.append(char) notFollowChar.remove(char) lock += 1 if lock = 100: print Warning! The loop lock is walking. for nChar in Vn: FollowDictnChar = list(set(FollowDictnChar) return FollowDict defAnalyseTable(self, Grammer, firstSet, followSet): 建立文法的分析表 Table = tChars = self.tChars nChars = self.n

12、Chars for n_char in nChars: Tablen_char = for t_char in tChars: Tablen_chart_char = ERROR subRules = for rule in Grammer: left_char = rule.split(:=)0 rightExpressions = rule.split(:=)1 subRules += left_char +:=+right_expression for right_expression in rightExpressions.split(|) for sub_rule in subRul

13、es: left_char, meetChars = self._ExpressionAnalyse(sub_rule, firstSet, followSet) for meet_char in meetChars: Tableleft_charmeet_char=sub_rule return Table def _NoLeftRecursion(self, Grammers): 消除文法规则的左递归 RightFirstIndex = 4 noLeftRecursionGrammers = for rule in Grammers: # print rule index = rule.f

14、ind(:=) #左边终结符号的终止位置 leftSymbol = rule:index #获取左边的非终结符 rightFirstSymbol = ruleRightFirstIndex #获取右边的第一个符号 if rightFirstSymbol = leftSymbol: #如果左边的非终结符与右边第一个符号相等,则进行消除左递归 resultOne = symbol for symbol in ruleRightFirstIndex:.split(|) if leftSymbol not in symbol #单独取出含左非终结符的子表达式 resultTwo = symbol fo

15、r symbol in ruleRightFirstIndex:.split(|) if leftSymbol in symbol #单独取出不含左非终结符的子表达式 # print resultTwo newLeftSymbol = leftSymbol+ #引入一个新终结符 resultOne = symbol + newLeftSymbol for symbol in resultOne rightExpressionOne = |.join(resultOne) expressionOne = rule0:RightFirstIndex+rightExpressionOne # pri

16、nt expressionOne resultTwo = symbol.replace(leftSymbol, )+newLeftSymbol for symbol in resultTwo resultTwo.append() rightExpressionTwo = |.join(resultTwo) expressionTwo = newLeftSymbol+rule1:RightFirstIndex+rightExpressionTwo # print expressionTwo noLeftRecursionGrammers += expressionOne,expressionTw

17、o #返回经过改写法消除直接左递归后的文法规则 # print rule else: noLeftRecursionGrammers += rule #如果不含直接左递归,则直接返回 return noLeftRecursionGrammers def _GetVt(self, Grammer): 获取文法中的终结符号 Vt = speSymbol = := Vn = self._GetVn(self.noLeftRecursionGrammers) Vn.append(speSymbol) Vn.append() Vn.append(|) for grammer in Grammer: fo

18、r symbol in Vn: grammer = grammer.replace(symbol,) for char in grammer: if char not in Vt: Vt.append(char) # for char in Vt: # print char return Vt def _GetVn(self, Grammer): 获取文法中的非终结符号 Vn = for grammer in Grammer: index = grammer.find(:=) #左边终结符号的终止位置 char = grammer:index if char not in Vn: Vn.app

19、end(char) return Vn def _SubExpressions(self, Grammer): 获取文法的子规则集 形如左边非终结符: 对应的右边的所有文法子规则 speSymbol = := _Grammer = for grammer in Grammer: _grammer = grammer.split(speSymbol) _Grammer_grammer0 = _grammer1 #新建一个字典subExpressions形如非终结符: 所有文法子规则 subExpressions = for nChar, rightExpression in _Grammer.items(): subExpressionsnChar = subExpression for subExpression in rightExpression.split(|) # print subExpressions return subExpressions def _Split(self, Expression): 将一个文法规则按单个字符切分 char_list = length = len(Expression) for _ in xrange(length): char = Expression_ if char = :

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

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