编译原理词法分析程序实验,编译原理实验1词法分析器的设计

  编译原理词法分析程序实验,编译原理实验1词法分析器的设计

  《LL1语法分析器_B12040921》 可供会员共享,在线阅读更多相关《LL1语法分析器_B12040921(15页珍藏版)》 请在人人文库网搜索

  1、实验报告(2014/2015学年第二学期)课程名称编译原理实验名称句法分析器的结构实验时间2015年5月29日指导机关计算机学院软件工程系指导教师拉德西班级学生名称城市绿地分类标准班级学生名称B-学院(系) ) ) ) ) ) ) )的结构导师拉德西实验类型实验时间2015-5-14一、实验目的与要求设计、编写、调试法律专业人员(1)句法分析程序,利用句法分析器识别符号串,加深对句法分析原理的理解为了实现对算术语法e-ettt-t*fff-(e ) I定义的符号串的识别,要求设计并实现ll )1)句法分析器二、实验环境

  2、实验设备)Mac OS X Python三、实验原理及内容分析机器:装载)方法加载语法规则,自动求第一集、跟随集分析表法官(方法判断某字符串是否为当前语法的语句程序代码#编码:utf-8#LL(1)1分析法#By:Importcjj#)由于时间仓促,代码中有很多不科学的地方但是,基本功能已经由# 2015-6-15类分析机(对象)3:def _ init _(self):passdefload(self,Grammers)构成

  3、am mers=grammers selfnoleftrecursiongrammers=self ._ _ noleftrecursion(selfgrammers))自我开始=自我grammers 00自我nchars=self ._ getvn(selfnoleftrecursiongrammers)自己tch ars=self .(nolf)f .第一集(selfnoleftrecursiongrammers)自己遵循set=

  4、自我跟随set(selfnoleftrecursiongrammers)自己分析表=自己分析表)自我noleftrecursiongrammers字符串):判断字符串是否是当前语法的语句isMatch=FalseanalyseStack=#,self.startstringstack=list))

  5 %- 12% s %分析堆栈,u剩余输入串,u使用的生成表达式)try:whileanalysestack:XM=analyse stack-1ai=string stack 0 print ifxminselfnchars:分析堆栈pop))表情=自我analysetablexmaifeexpression=

  6、n发现(:=)3自我. split(表达式索引:):1!=:分析堆栈=自我. split(表达式索引:)3360-1#elifXM=aiandXM按相反顺序放入!=# 3360分析堆栈pop(字符串堆栈pop)0)elif XM=aian dxm=#:分析堆栈pop)是否匹配=真实打印xxxxx

  xexm

  7、非语法定义的语句的打印结果%stringprint u=*25,u判断字符串=%s%string,=* 25 returnismatchdeffirstset(self,grammers(:结构语法的第一集SPE符号=:=VN=self。nchars vt=self。tcharsfirst=self ._ _子表达式)语法

  8,0:char=expressionindexfcha

  r=nChar:break elif char in Vt:break elif char not in nil char:follow link 2 char。append(nChar)# print 1添加% s以跟随% s %(nChar,char)break else:跟随链接2 char。append(nChar)# print 2将% s添加到follow % s %(nChar,char)index-=1 # print follow link 2 has follow char=not follow。

  9、Char=对于nChar,followLink2.items()中的链接:如果不是链接:hasFollowChar。append(nChar)else:notFollowChar。append(nChar)# print has follow char # print not follow char and lock 100:delChar=for nChar in not follow char:# print nChar是%s%nCharif集合(followLink2nChar).issubset(se。

  10、t(hasFollowChar):for follow link 2 nChar:FollowDictnChar=followdictlinkdelchar。append(nChar)# print delChar,delChar# print hasFollowChar,hasFollowChar # print notFollowChar,notFollowChar for delChar:hasFollowChar。append(char)notFollowChar。如果lock=100,则remove(char)lock=1:print War。

  11、壮观的滑板!循环锁正在遍历,对于Vn中的nChar:FollowDictnChar=list(set(FollowDictnChar)返回FollowDictdef分析表(self,Grammer,firstSet,followSet):建立文法的分析表table=tChars=self。tcharsnchars=self。nChars中n _ char的n chars:Tablen _ char=t chars中t _ char的n chars:Tablen _ chart _ char=error sub。

  12、规则=语法中的规则:left _ char=规则。split(:=)0右表达式=规则。split(:=)1 subRules=left _ char:=right _ expression for right _ expression in right expressions。split()for subRules:left _ char,meetChars=self .中meet_char的__ExpressionAnalyse(sub_rule,firstSet,followSet)。

  13、meet chars:table left _ charmeet _ char=sub _ rule return Tabledef _ _ NoLeftRecursion(self,Grammers):消除文法规则的左递归RightFirstIndex=4 noleftrecursiongrammers=for rule in Grammers:# print rule index=rule。查找(:=)#左边终结符号的终止位置leftSymbol=rule:索引#获取左边的非终结符右首符号=ruleRightFirstIndex #获取右边的第一个符号我。

  14、f rightFirstSymbol=leftSymbol: #如果左边的非终结符与右边第一个符号相等,则进行消除左递归结果一=ruleRightFirstIndex中符号的符号:如果左符号不在符号#中,则拆分()单独取出含左非终结符的子表达式结果二=ruleRightFirstIndex中符号的符号:如果左符号在符号#中,则拆分()单独取出不含左非终结符的子表达式# print resultTwonewLeftSym。

  15、bol=leftSymbol #引入一个新终结符resultOne=resultOnerightExpressionOne中符号的symbol新左符号= .join(结果一)表达式一=规则0:右首索引右表达式一#打印表达式oner结果二=符号。replace(左符号,)result two . append()right中符号得newLeftSymbol。

  16、tExpressionTwo= join(结果二)expression two=newLeftSymbol规则1:RightFirstIndex rightExpressionTwo# print expression twonoleftrecursiongrammers=expression one,expression two #返回经过改写法消除直接左递归后的文法规则#打印rule else:noLeftRecursionGrammers=rule #如果不含直接左递归,则直接返回返回noLeftRecursionGrammersdef。

  17、GetVt(self,Grammer):获取文法中的终结符号Vt=speSymbol=:=Vn=self ._ _ GetVn(self。noleftrecursiongrammers)Vn。追加(SPE符号)Vn。append()Vn。为Grammer中的Grammer追加():为Vn中的符号追加:Grammer=Grammer。如果字符不在Vt:Vt中,则用(符号,)替换字符。在Vt:# print char中为char追加(char)#。

  18、turn Vtdef __GetVn(self,Grammer):获取文法中的非终结符号VN=for Grammer in Grammer:索引=Grammer。查找(:=)#左边终结符号的终止位置char=grammer:indexif char不在Vn:Vn。append(char)return Vn def _ _ sub表达式(self,grammer):获取文法的子规则集形如左边非终结符:对应的右边的所有文法子规则SPE symbol=:=_ Grammer=for Grammer in Grammer:_ Grammer=g。

  19、夯锤。split(SPE符号)_ Grammer _ Grammer 0=_ Grammer 1 #新建一个字典子表达式形如非终结符:所有文法子规则subExpressions=for nChar,right expression in _ grammer。items():子表达式nChar=右表达式中子表达式的子表达式。Split()# print子表达式return子表达式def _ _ Split(self,express。

  20、会话):将一个文法规则按单个字符切分char _ list=len(Expression)for _ in xrange(length):char=Expression _ if char=:char _ list _-1=char else:char _ list。append(char)return char _ listdef _ _ Expression analyse(self,Expression,firstSet,followSet):建立分析表时,判断某个表达式应该填入分析表的哪一个位置tChars=self。

  21、Charsleft_char,right chars=expression。split(:=)meet chars=for right _ char in right chars:if right _ char=:meet chars=follow set left _ charbreakelif right _ char in tChars:meet chars。append(right _ char)break else:meet chars=first set right _ char if not in first set right _ char:break else:meet chars。移除()返回。

  22、n left_char,meet charsif _ _ name _ _=_ _ main _ _:import pprint # grammer _ list=A:=BCc gDB,B:=bCDE,C:=DaBca,D:=dD,E:=gAfcgrammer_list=E:=E TT,T:=T*FF,F:=(E) I # grammer _ list=S:=iCtSS A,S:=eS,C:=bll1am=AnalyseMachine消除文法左递归打印ll1am.noLeftRecursionGra。

  23.mersprint u非终端字符打印ll1am.nCharsprint u终端字符打印ll1am . tcharsprint u first set pprint . pprint(ll1am . first set)up follow set pprint . pprint(ll1am . follow set)print ull(1)分析表pprint . pprint(ll1am . analyse table)string 1=ii * il1am . judge(string 1)string 2=I *(ii)1AM。judge(string 2)string 3=ii(I * I)ill凌晨1点。判断(string3)实验结果:IV。实验总结通过这个实验,我们基本掌握了语法分析的原理,LL(1)的语法分析方法和预测分析表的构造,了解了语法分析的过程。因为一开始不知道具体的解决方法,所以觉得有点麻烦。但是仔细看了书,学习了具体的分析方法,感觉手到擒来。但是,程序写的很匆忙。虽然程序可以随意输入语法规则进行分析,但在一些小问题上可能还需要改进。如果你有时间,你会改进它。

编译原理词法分析程序实验,编译原理实验1词法分析器的设计