编译第五章08本cp.ppt
《编译第五章08本cp.ppt》由会员分享,可在线阅读,更多相关《编译第五章08本cp.ppt(190页珍藏版)》请在三一办公上搜索。
1、第五章 自下而上 语法分析,语法分析推导:自上而下的语法分析过程预测分析程序,递归下降分析法(最左推导)注:要求文法是LL(1)文法归约:自下而上的语法分析过程简单优先分析法,算符优先分析法、LR分析法,5.1 自下而上分析的基本问题,自下而上的语法分析过程,1.自下而上的语法分析过程思想自下而上的语法分析过程是一个最左归约的过程,从输入串开始。朝着文法的开始符号进行归约,直到到达文法的开始符号为止的过程注意:输入串在这里是指从词法分析器送来的单词符号组成的二元式的有限序列2.自下而上分析的PDA,a+b#,语法分析程序 语法表,输出带,#,工作方式:“移进归约”方式即:自左至右把输入串的符号
2、一个一个移进栈,在移进过程中不断查看栈顶符号串,一旦形成某个句型的句柄时,就将此句柄用相应的产生式左部替换(归约),若再形成句柄,就继续替换,直到栈顶不再形成句柄为止,然后继续移进符号,重复上面的过程直到栈顶只剩下文法的开始符号,输入串读完为止,这样就认为识别了一个句子。,注:1)初态时栈内仅有栈底符“#”,读头指在最左边的单词符号上.2)语法分析程序执行的动作:a)移进:读入一个单词并压入栈内,读头后移;b)归约:检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号.c)识别成功:移进归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符.d)识
3、别失败.,一、自下而上的语法分析过程,自下而上分析的中心问题:怎样判断栈顶的符号串的可归约性,以及如何归约。这是5.2节(算符优先分析)和5.3节(LR分析法)将讨论的问题。,各种不同的自下而上分析法的一个共同特点:边输入单词符号(移进符号栈),边归约。也就是在从左到右移进输入串的过程中,一旦发现栈顶呈现可归约串就立即进行归约。,例如:有文法如下:(1)S aAcBe(2)A b(3)A Ab(4)B d 问语句abbcde是否是该文法的合法语句?,举例,S,a A c B e,A b,d,b,5.1.2 规范规约简述,令G是一个文法,S是文法的开始符号,假定是文法G的一个句型,如果有 S A
4、且A 则称是句型相对于非终结符A的短语。特别是,如果有 A 则称是句型相对于规则A的直接短语,一个句型的最左直接短语称为该句型的句柄。,*,+,规范归约是关于的一个最右推导的逆过程。因此,规范归约也称最左归约。S aAcBe aAcde aAbcde abbcde 注:文法是无二义的,(1)SaAcBe(2)Ab(3)AAb(4)Bd,(1),(4),(3),(2),句柄与归约,修剪子树过程,二、自下而上语法分析方法,1.优先分析器(Precedence Parser)简单优先分析法 算符优先分析法2.LR分析器,一、简单优先分析法,基本思想1.确定相邻文法符号之间的优先关系在句型中,句柄内各
5、相邻符号之间具有相同的优先级,相同优先级用“”由于句柄要先归约,所以规定句柄两端符号的优先级要比位于句柄之外的相邻符号的优先级高,优先级低于表示为“”,优先级高于表示为“”某句型中:N1.Ni-1 Ni Nj Nj+1.Nn,.,5.2 算符优先分析法,.,.,.,.,注:句型中的Ni.Nj是句柄,语法分析程序通过寻找 Ni-1Ni和Nj Nj+1来确定句柄的头尾,从而确定句柄进行归约。,.,.,.,.,二、简单优先文法,1.定义:一个文法G,如果它不含e产生式,也不含任何右部相 同的不同产生式,并且它的任何符号对(X,Y)X,Y是终结符或非终结符 或者没有关系,或者存在优先级相同或低于、高于
6、等关系之一,则这是一个简单优先文法。,2.优先级别定义:X Y 当且仅当G中含有形如P.XY.X Y当且仅当G中含有形如P.XQ.的产生式,其中Q Y X Y,当且仅当Y为文法G的终结符,G中P QR,且Q.X,Yfirst(R),.,对任何X,若文法开始符号S X,则#X;若有S.X,则X#,+,+,三、简单优先矩阵1、简单优先矩阵:根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵,二、简单优先文法,PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到
7、句柄就继续读入,直到最后栈内只剩下开始符号,输入串读到“#”为止,此时识别正确。,四、简单优先分析法实现过程,五、简单优先分析法的优缺点优点:算法理解简单,技术简单缺点:适用范围小,分析表尺寸太大,5.2 算符优先分析法一、什么是算符优先分析法,1.算符优先分析法:所谓算符优先分析法是仿效四则运算的计算过程而构造的一种语法分析方法.2.算符优先分析法的特点:简单直观,特别方便于表达式分析,易于手工实现,是自下而上的归约过程,但未必按照句柄归约.3.算符优先分析法的关键:规定算符(终结符)的优先级及结合性质例如:8+7-6*5/3的运算,5.2 算符优先分析法,例:表达式文法:E E+E|E-E
8、|E*E|E/E|(E)|i 对这个二义文法可能会有好几个规范推导和归约,真正运算时也有几种不同结果,但若按算符优先顺序和结合规则的规定进行归约,句子的归约过程就是唯一的,运算结果也唯一.,注:对所有的终结符定义某种优先关系,借助这种关系找出可归约的串,进行归约,达到自下而上分析的目的.,如:i+i-i*(i+i)归约过程如下:1)i+i-i*(i+i)设算数级别最高,最先归约2)E+i-i*(i+i)3)E+E-i*(i+i)+,-同级,先归约左边“+”4)E-i*(i+i)5)E-E*(i+i)-,不同级,先归约右边“”6)E-E*(E+i)7)E-E*(E+E)先算括号内,再算括号外8)
9、E-E*(E)9)E-E*E 先归约“”,再归约“+”10)E-E11)E,直观算符分析法,5.2 算符优先分析法,a+b#,直观算符优先程序 优先表,OPND操作数,Q,#,OPTR操作符,p,下推栈,直观算符分析法1)直观算符分析法使用两个工作栈:一个算符栈(OPTR)存放运算符和括号,一个算量栈(OPND)用于存放操作数和运算结果;OPTR的栈顶符号用Q表示,OPND的栈顶符号用p表示2)初态时,OPND为空,OPTR只有”#“,5.2 算符优先分析法,OPND=“”;OPTR=“#”flag=true;advance;/*读入一个单词*/While flagIf Q=“#”and SY
10、M=“#”then flag=false/*成功*/else if Q=“(“and SYM=“)”then/*匹配括号对*/OPTR栈顶出栈;advanceelse if SYM是算量 then/*移进算量*/,直观算符分析算法如下:,SYM入OPND栈;advance;else if Q SYM then/*移进算符*/SYM入OPTR栈;advance;else if Q SYM then/*归约*/OPND栈顶两个元素p1,p2弹出;弹出OPTR栈顶元素Q;将p1Qp2的结果入OPND栈;else ERROR,此算法的优缺点:优点:1)简单明了,易于手工实现,适于分析各种算术表达式 2
11、)使用此算法可以很方便地把表达式译成目标指令,只要在归约时把计算p1Qp2值改为生成相应指令(Q,p1,p2,T)即可缺点:1)算法采用两个栈,有时会把错误句子当成合法句子;而且,它也无法指出输入串出错位置 2)对于含有单目正负号的算术表达式不好处理。因为负号的优先级高于加减法,低于乘除法,但负号的形式与减号相同,不容易识别。,1、确定运算符的优先级算符优先分析法的关键是比较两个相继出现的终结符的优先级而决定应采取的动作要完成运算符间优先级的比较,可以先定义各种可能相继出现的运算符的优先级,并表示为矩阵的形式,使得能够在分析中通过查询矩阵元素而得到算符之间的优先关系,5.2.1 算符优先分析技
12、术的改进,2.对于任何两个可能相继出现的终结符a,b,若具有以下形式:“.ab.”,“.aQb.”,其中Q是某非终结符,则a,b之间的关系为:1)a b,a的优先级低于b2)a b,a的优先级等于b3)a b,a的优先级高于b4)若a,b在任何情况下都不可能相继出现,则a,b无关系,.,5.2.1 算符优先分析技术的改进,5.2 算符优先分析,右符,左符,.,注:)在此表中,包括,包括,“”是一个特殊符号,用于语句的开始符号和结束符号。)这张表满足是通常数学上的习惯约定,值得注意的是:运算量i的优先级高于算符 语句开始和结束符号“”与终结符a相继出现时,应该有 a或a#,以此来保证语句内先归约
13、。()表示括号是成对归约的 优先关系和代数中的大于小于关系不同,a b并不意味着b a,与终结符所处的左右位置很重要.,.,1.算符文法的定义给定上下文无关文法G,若G中所有产生式右部都不包含两个相继的非终结符,则G为算符文法注:算符文法保证了两个运算符之间只有一个操作数2.算符优先文法定义:设G是一个不含有空串产生式的算符文法,并设a,bVT;P.Q,RVN 对于任何一对终结符有如下几种关系:,5.2.2 算符优先文法及优先表的构造,2.算符优先文法定义:a b 当且仅当G中含有形如P.ab.产生式,或者P aQb.产生式;a b 当且仅当G中含有形如P.aR产生式,其中R b.或R Qb.
14、;a b 当且仅当G中含有形如 P Rb,产生式,其中R.a,或R.aQ.若G中任何终结符序偶(a,b)至多满足上述关系之一,则称G为算符优先文法(OPG),.,+,+,+,+,3.算符文法和算符优先文法定义的意义这两个定义相当于对文法的句型和可归约的短语做了如下规定:设A1A2Ai-1AiAi+1An是文法G的一个句型.1.若AiVN,则Ai-1,Ai+1VT,即不允许出现相继两个非终结符;2.若B1B2Bm是当前可归约短语,并可归约为Ai,则:,a)B1B2Bm中不能有相继两个非终结符且相邻的终结符优先级全相等;b)对于B1B2Bm中首终结符b有Ai-1 bc)对于B1B2Bm中尾终结符b
15、有b Ai+1注:实际上,可归约短语是某产生式右部符号串,所以通过检查G的每一个产生式的每个候选式。可以查找出任意优先级相同的终结符序偶,要找出所有满足关系 和 的终结符序偶,就要找出各非终结符P的首终结符集和尾终结符集。,4.求各非终结符P的首终结符集和尾终结符集1)定义:首终结符集FIRSTVT(P)=a|P a.或P Qa.,aVT;P,QVN尾终结符集LASTVT(P)=a|P.a或P.aQ,aVT;P,QVN有了这两个集合后,就可以通过检查每个产生式的每个候选式,确定满足关系 和 的所有终结符序偶,+,+,+,+,例:假定产生式右部有形如:.aP串,则对于任何bFIRSTVT(P),
16、有a b;假定产生式右部有形如:.Pb.的串,则 对于任何aLASTVT(P),有a b;例:设文法G的产生式为:S aAcBe A Ab|b B d 计算每个非终结符的FIRSTVT与LASTVT及所有终结符之间的关系,解:FIRSTVT(S)=a LASTVT(S)=e FIRSTVT(A)=b LASTVT(A)=b FIRSTVT(B)=d LASTVT(B)=d,左,右,.,.,5.构造算法1)构造集合FIRSTVT(P)的算法a)方法1:根据FIRSTVT(P)的定义,按下面的规则来构造:(1)若有产生式P a.或P Qa.,则aFIRSTVT(P)(2)若aFIRSTVT(Q),
17、且有产生式P Q则 aFIRSTVT(P).注:规则1是求FIRSTONE a的关系;规则2是求P FIRST*Q的关系.,5.构造算法1)构造集合FIRSTVT(P)的算法b)方法2:在此算法中使用了两个数据结构一个是二维布尔矩阵F,行标为非终结符P,列标为终结符a;FP,a=true,当且仅当aFIRSTVT(P);另一个是堆栈STACK;栈中动态存放曾在FP,a中为真的序偶(P,a).算法如下:,(1)初始化:将布尔矩阵F中各元素置为假;栈清空;(2)按规则1,查看产生式,对于形如P a或 P Qa.的产生式,置相应的FP,a为真,并将序偶(P,a)入栈;(3)按规则2,对栈施加如下操作
18、:弹出栈顶序偶并记为(Q,a),查看所有产生式,看有无形如P Q.的产生式,若有,且aFIRSTVT(P)(即FP,a为假),则将FP,a置为真,并把(P,a)入栈;(4)重复步骤3,直到栈空为止.那么,在FP,a中,凡是“真”的元素即属于P的首终结符集,1)构造算符优先表算法算法过程:FOR 每条产生式P X1X2.Xn DO FOR(i=1,i=n-1,i+)if Xi 和Xi+1均为终结符 then置Xi Xi+1 if i=n-2 and Xi和Xi+2均为终结符 and Xi+1为非终结符 then置Xi Xi+2 if Xi为终结符而Xi+1为非终结符 then FOR FIRST
19、VT(Xi+1)中的每个a DO 置Xi a if Xi为非终结符而Xi+1为终结符 then FOR LASTVT(Xi)中的每个a DO 置a Xi+1,.,.,算符优先文法的另一个定义:如果文法G按此算法构造出的优先表没有重定义项,则文法G是一个算符优先文法,例:构造下面文法的算符优先表S if Eb then E else E E E+T|TT T*F|F F i Eb b,解:1)求各非终结符的首终结符和尾终结符集,为了考虑语句的开始和结束符号“#”,对文法拓广,加一个产生式 S#S#FIRSTVT(S)=if LASTVT(S)=else,+,*,iFIRSTVT(E)=+,*,i
20、 LASTVT(E)=+,*,iFIRSTVT(T)=*,i LASTVT(T)=*,iFIRSTVT(F)=i LASTVT(F)=iFIRSTVT(Eb)=b LASTVT(Eb)=b 2)填写算符优先表,左,右,.,.,5.2.3 算符优先分析算法,1.优先表构造算法的讨论构造优先表的算法仅仅反因反映文法符号间关系,并不反映附加条件,对二义性文法构造算符优先表。可能会出现多重定义项。2.非规范分析(1).规范规约严格按照句柄进行归约,终结符和非终结符一起考虑,只要栈顶形成句柄。不管句柄是否包含终结符都要进行归约。,5.2 算符优先分析法,例:考虑非二义的表达式文法G(E):E E+T|T
21、 T T*F|F F(E)|i 识别句子i+i*i的过程(1)规范归约 i+i*i#1.F+i*i#2.T+i*i#3.E+i*i#4.E+F*i#5.E+T*i#,6.E+T*F#7.E+T#8.E#,2.非规范分析(2).算符优先分析在算符优先分析,仅研究终结符之间的优先关系,而不考虑非终结符之间的优先关系;但句柄是由终结符和非终结符一起构成的,所以算符优先分析相对来说是非规范的分析。对上题的分析过程:i+i*i#1.E+i*i#2.E+T*i#3.E+T*F#,4.E+T#5.E#,两种分析的语法树对比:,E,E+T,T,F,i,T*F,F,i,i,E,E+T,i,T*F,i,i,2.非
22、规范分析(2).算符优先分析注:在算符优先分析中,可归约的短语不再称为句柄,而称为最左素短语,素短语是指这样一个短语,至少含有一个终结符,且除它自身外不再包含其它素短语,最左边的素短语称为最左素短语。例:考虑非二义的表达式文法G(E):E E+T|T T T*F|F F(E)|i 句型#T+T*F+i#的素短语,为什么?,E,E+T,E+T,T*F,T,F,i,由定义可知,素短语:T*F,i 最左素短语:T*F,3.通用算符优先分析(1)最左素短语的判断假定文法的句型的一般形式为:#N1a1N2a2.NnanNn+1#其中ai是终结符,Ni是可有可无的非终结符,设最左素短语为ajNiaiNi+
23、1,则必有:aj-1 aj ai+1.ai ai+1 则,ajNiaiNi+1一定能归约为某非终结符 注意:在程序设计语言中会经常看到这种素短语(如:S for(i=E,i=E,i+),当栈顶形成某素短语时就可以进行归约,算符优先分析中也要考虑到这种归约),.,.,.,3.通用算符优先分析(2).通用算符优先分析算法注:1).算法结束时,若栈内只有“#”和某非终结符,读头下为“#”,则表示分析成功,否则输入串有错。2).在进行最左素短语归约时,只要能找出产生式,其右部的终结符与栈顶的若干终结符有一一对应的关系,当名称相同,位置也相同时即可进行归约,由于最左素短语不考虑非终结符,所以归约成什么符
24、号无关紧要。,例如:根据下面文法及其算符优先表,按通用通用算符优先分析的算法分析语句 if b then i else i#S if Eb then E else E E E+T|TT T*F|F F i Eb b,左,右,4.算符优先分析的优缺点:A.算符优先分析比规范规约要快得多,因为它跳过了许多单非终结符的归约,但是,由于忽略了非终结符在归约中的作用,它可能会把错误的输入串误认为是合法的句子。B.算符优先文法适用范围比简单优先文法大得多 许多程序设计语言都可以用它来分析,算符优先分析表构造简单。甚至可以用手工构造。C.缺点在于有些文法不满足算符优先文法,必须先改写,有些甚至无法改写,若终
25、结符数目多,优先表可能会占有太多空间,5.2.4 算符优先分析中的出错处理,使用算符优先分析法时,可在两种情况下,发现语法错误:(1)若在栈顶终结符号与下一输入符号之间不存在任何优先关系;(2)若找到某一“句柄”(此处“句柄”指素短语),但不存在任一产生式,其右部为此“句柄”。,本节介绍上下文无关文法的LR分析方法及分析程序的自动构造LR:自左至右扫描,最右推导的逆过程一、LR方法1.基本思想 在规范归约过程中,一方面记住已移进和归约的整个符号串,另一方面根据当前所用的产生式推测未来可能碰到的输入符号.,5.3 LR分析法,一、LR方法概述,2.优缺点优点:与其它技术相比,适应文法范围更广。能
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 第五 08 cp
链接地址:https://www.31ppt.com/p-6113481.html