版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实 验 报 告(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-15class AnalyseMachine(object):def _init_(self):passdef load(self, Grammers):载入文法规则参数Grammers: 文法的规则列表self.Gra
3、mmers = Grammersself.noLeftRecursionGrammers = self._NoLeftRecursion(self.Grammers)self.start = self.Grammers00self.nChars = self._GetVn(self.noLeftRecursionGrammers)self.tChars = self._GetVt(self.noLeftRecursionGrammers)self.firstSet = self.FirstSet(self.noLeftRecursionGrammers)self.followSet = sel
4、f.FollowSet(self.noLeftRecursionGrammers)self.analyseTable = self.AnalyseTable(self.noLeftRecursionGrammers, self.firstSet, self.followSet)def Judge(self, string):判断字符串是否为当前文法的句子isMatch = FalseanalyseStack = #, self.startStringStack = list(string) + #print u=*25,u判断字符串=%s%string,u=*25print %-30s%-12
5、s%s%(u分析栈,u余留输入串,u所用生成式)try:while analyseStack:xm = analyseStack-1ai = StringStack0print %-20s%20s%10s%(.join(analyseStack),.join(StringStack), ),if xm in self.nChars:analyseStack.pop()expression = self.analyseTablexmaiif expression = ERROR:printraise ValueErrorprint expression,index = expression.fi
6、nd(:=) + 3if self._Split(expressionindex:):-1 != :analyseStack += self._Split(expressionindex:):-1 #逆序加入elif xm = ai and xm != #:analyseStack.pop()StringStack.pop(0)elif xm = ai and xm = #:analyseStack.pop()isMatch = Trueprintexcept Exception as e:passresult = u%s 为文法定义的句子 if isMatch else u%s 不是文法定义
7、的句子print result%stringprint u=*25,u判断字符串=%s%string,=*25return isMatchdef FirstSet(self, Grammers):构造文法的First集speSymbol = :=Vn = self.nCharsVt = self.tCharsFirst = self._SubExpressions(Grammers)#新建一个以所有非终结符作为键,以空列表作为值的字典FirstDict = for nChar in Vn:FirstDictnChar = lock = 1while First and lock= 0:char
8、 = expressionindexif char = nChar:breakelif char in Vt:breakelif char not in nilChar:followLink2char.append(nChar)# print 1 add %s to follow %s%(nChar, char)breakelse:followLink2char.append(nChar)# print 2 add %s to follow %s%(nChar, char)index -= 1# print followLink2hasFollowChar = notFollowChar =
9、for nChar, links in followLink2.items():if not links:hasFollowChar.append(nChar)else:notFollowChar.append(nChar)# print hasFollowChar# print notFollowCharlock = 1while notFollowChar and lock 100:delChar = for nChar in notFollowChar:# print nChar is %s%nCharif set(followLink2nChar).issubset(set(hasFo
10、llowChar):for link in followLink2nChar:FollowDictnChar += FollowDictlinkdelChar.append(nChar)# print delChar, delChar# print hasFollowChar, hasFollowChar# print notFollowChar, notFollowCharfor char in delChar:hasFollowChar.append(char)notFollowChar.remove(char)lock += 1if lock = 100:print Warning! T
11、he loop lock is walking.for nChar in Vn:FollowDictnChar = list(set(FollowDictnChar)return FollowDictdef AnalyseTable(self, Grammer, firstSet, followSet):建立文法的分析表Table = tChars = self.tCharsnChars = self.nCharsfor n_char in nChars:Tablen_char = for t_char in tChars:Tablen_chart_char = ERRORsubRules =
12、 for rule in Grammer:left_char = rule.split(:=)0rightExpressions = rule.split(:=)1subRules += left_char +:=+right_expression for right_expression in rightExpressions.split(|)for sub_rule in subRules:left_char, meetChars = self._ExpressionAnalyse(sub_rule, firstSet, followSet)for meet_char in meetCha
13、rs:Tableleft_charmeet_char=sub_rulereturn Tabledef _NoLeftRecursion(self, Grammers):消除文法规则的左递归RightFirstIndex = 4noLeftRecursionGrammers = for rule in Grammers:# print ruleindex = rule.find(:=) #左边终结符号的终止位置leftSymbol = rule:index #获取左边的非终结符rightFirstSymbol = ruleRightFirstIndex #获取右边的第一个符号if rightFi
14、rstSymbol = leftSymbol: #如果左边的非终结符与右边第一个符号相等,则进行消除左递归resultOne = symbol for symbol in ruleRightFirstIndex:.split(|) if leftSymbol not in symbol #单独取出含左非终结符的子表达式resultTwo = symbol for symbol in ruleRightFirstIndex:.split(|) if leftSymbol in symbol #单独取出不含左非终结符的子表达式# print resultTwonewLeftSymbol = lef
15、tSymbol+ #引入一个新终结符resultOne = symbol + newLeftSymbol for symbol in resultOnerightExpressionOne = |.join(resultOne)expressionOne = rule0:RightFirstIndex+rightExpressionOne# print expressionOneresultTwo = symbol.replace(leftSymbol, )+newLeftSymbol for symbol in resultTworesultTwo.append()rightExpressi
16、onTwo = |.join(resultTwo)expressionTwo = newLeftSymbol+rule1:RightFirstIndex+rightExpressionTwo# print expressionTwonoLeftRecursionGrammers += expressionOne,expressionTwo #返回经过改写法消除直接左递归后的文法规则# print ruleelse:noLeftRecursionGrammers += rule #如果不含直接左递归,则直接返回return noLeftRecursionGrammersdef _GetVt(se
17、lf, Grammer):获取文法中的终结符号Vt = speSymbol = :=Vn = self._GetVn(self.noLeftRecursionGrammers)Vn.append(speSymbol)Vn.append()Vn.append(|)for grammer in Grammer:for symbol in Vn:grammer = grammer.replace(symbol,)for char in grammer:if char not in Vt:Vt.append(char)# for char in Vt:# print charreturn Vtdef
18、_GetVn(self, Grammer):获取文法中的非终结符号Vn = for grammer in Grammer:index = grammer.find(:=) #左边终结符号的终止位置char = grammer:indexif char not in Vn:Vn.append(char)return Vndef _SubExpressions(self, Grammer):获取文法的子规则集形如左边非终结符: 对应的右边的所有文法子规则speSymbol = :=_Grammer = for grammer in Grammer:_grammer = grammer.split(
19、speSymbol)_Grammer_grammer0 = _grammer1#新建一个字典subExpressions 形如非终结符: 所有文法子规则subExpressions = for nChar, rightExpression in _Grammer.items():subExpressionsnChar = subExpression for subExpression in rightExpression.split(|)# print subExpressionsreturn subExpressionsdef _Split(self, Expression):将一个文法规则
20、按单个字符切分char_list = length = len(Expression)for _ in xrange(length):char = Expression_if char = :char_list_ - 1 += charelse:char_list.append(char)return char_listdef _ExpressionAnalyse(self, expression, firstSet, followSet):建立分析表时,判断某个表达式应该填入分析表的哪一个位置tChars = self.tCharsnChars = self.nCharsleft_char,
21、 rightChars = expression.split(:=)meetChars = for right_char in rightChars:if right_char = :meetChars += followSetleft_charbreakelif right_char in tChars:meetChars.append(right_char)breakelse:meetChars += firstSetright_charif not in firstSetright_char:breakelse:meetChars.remove()return left_char, meetCharsif _name_ = _main_:import pprint# grammer_list = A:=BCc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 妊娠期各阶段营养管理要点
- 采购管理计划书
- 2026年成人高考土木工程专业(土力学与基础工程)真题单套
- 2026年成人高考高起专生物(理)真题单套试卷
- 哲学与人生试卷及答案
- 2025-2026学年人教版七年级音乐上册《春天的故事》单元测试卷(含答案解析)
- 阅读题库及答案初中数学
- 5.20活动主题策划方案(3篇)
- 催收过程指标管理制度(3篇)
- 医药连锁配送管理制度范本(3篇)
- 贵州源鑫矿业有限公司煤矸石洗选综合利用项目环评报告
- 八年级下册音乐复习题及答案(湘艺版)
- 高中地理(湘教版2019版)必修二 全册知识点
- 全面把握新时代的深刻内涵
- 2023年北京市各区(海淀朝阳丰台东西城等)高三下语文高考一模汇编7 基础运用含详解
- 2022年中国石油大学《化工原理二》完整答案详解
- RC512-FE(A)-用户使用手册202307
- GB/T 5153-2003变形镁及镁合金牌号和化学成分
- GB/T 4357-2022冷拉碳素弹簧钢丝
- GB/T 19326-2012锻制承插焊、螺纹和对焊支管座
- 隧道施工开挖台车验收表
评论
0/150
提交评论