编译原理及其习题解答课件chap6-7.ppt
《编译原理及其习题解答课件chap6-7.ppt》由会员分享,可在线阅读,更多相关《编译原理及其习题解答课件chap6-7.ppt(203页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译原理编译原理CompilerPrinciples第六章第六章 自底向上优先分析法自底向上优先分析法编译原理CompilerPrinciples第六章第六章 自底向上优先分析法自底向上优先分析法自底向上的分析方法,也称移进自底向上的分析方法,也称移进-归约分析法。它的归约分析法。它的实实现思想现思想是:是:对输入符号串自左向右进行扫描,并将输入符逐个移对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,成某个句型的句柄时,(该句柄对应某产生式的右部该句柄对应某产生式的右部),就,
2、就用该产生式的左部非终结符代替相应右部的文法符号串,用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。重复这一过程直到归约到栈中只剩文法这称为一步归约。重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,也就确认输入串是文法的句的开始符号时则为分析成功,也就确认输入串是文法的句子。子。确定的自底向上的分析方法分为两大类:确定的自底向上的分析方法分为两大类:优先分析法优先分析法和和LR分析方法分析方法。本章将在介绍自底向上分析思想基础上,。本章将在介绍自底向上分析思想基础上,着重介绍算符优先分析法。着重介绍算符优先分析法。编译原理CompilerPrinciples6.1
3、 短语、直接短语、句柄1、短语:、短语:令文法令文法G,开始符号为开始符号为S,xAy是是G的句型的句型(即(即SxAy),),如果如果SxAy且且A,则称则称是句型是句型xy相对于非终结符相对于非终结符A的的短语。短语。2、直接短语(简单短语)、直接短语(简单短语)如短语中有如短语中有A=,则称则称是句型相对于规则是句型相对于规则A的直的直接短语。接短语。3、句柄(、句柄(Handle)一个句型的最左直接短语称为该句型的句柄。一个句型的最左直接短语称为该句型的句柄。(可规约(可规约串)串)编译原理CompilerPrinciples例例6.1例:文法例:文法G数数:|0|1|2|3|4|5|
4、6|7|8|9=1所以,所以,1是一个句型。下面结论是否正确?是一个句型。下面结论是否正确?1.1是句型是句型1相对于相对于的短语。的短语。2.1是句型是句型1相对于相对于的短语。的短语。3.是句型是句型1相对于相对于的短语。的短语。编译原理CompilerPrinciples语法树与短语的关系语法树与短语的关系1.每个句型(句子)都对应有一棵语法树;每个句型(句子)都对应有一棵语法树;2.每棵语法树的叶子结点从左到右、从上到下构成一个句每棵语法树的叶子结点从左到右、从上到下构成一个句型(句子);型(句子);3.每棵子树的叶子结点从左到右、从上到下构成一个短语;每棵子树的叶子结点从左到右、从上
5、到下构成一个短语;4.每棵子树的直接叶子结点从左到右、从上到下构成一个每棵子树的直接叶子结点从左到右、从上到下构成一个直接短语;直接短语;5.最左简单子树的直接叶子结点从左到右、从上到下构成最左简单子树的直接叶子结点从左到右、从上到下构成一个句柄。一个句柄。编译原理CompilerPrinciples例例6.11编译原理CompilerPrinciples解题方法解题方法例例2例:文法例:文法GE:ET|E+TTF|T*FF(E)|i证明证明i+i*i是是G的一个句型,并指出这个句型的所有短语、直的一个句型,并指出这个句型的所有短语、直接短语、句柄。接短语、句柄。证明:证明:EE+TE+T*F
6、E+T*iE+F*iE+i*iT+i*iF+i*ii+i*i编译原理CompilerPrinciples接上例接上例语法树:EE+TTT*FFFi3i1i2第1层 i1+i2*i3 相对于E第2层 i1 相对于E;i2*i3 相对于T第3层 i1,i2 相对于T;i3 相对于F第4层 i1,i2 相对于F(F i直接短语)第5层 i+i*i是G的一个句型,其中i1,i2,i3,i2*i3,i1+i2*i3 都是句型i1+i2*i3 的短语,且i1,i2,i3 为直接短语,i1为句柄编译原理CompilerPrinciples分析说明分析说明(2)作为“短语”的两个条件是不可缺少的,仅仅有A ,
7、未必意味着就是句型的一个短语,因为还需要有S 这个条件。例如:上例中有E i1+i2,但i1+i2并不是该句型的一个短语,因为不存在从E(开始符号)到E*i3的推导。(1)短语、直接短语、句柄是针对某一句型(S )而言的;编译原理CompilerPrinciples解题方法解题方法 先证明前提(如证明i+i*i是G的一个句型)给出语法树(注意文法是否是二义性的)如题文法GE:E E+E|E*E|(E)|i 所以:证明i+i*i是G的一个句型,并指出这个句型的所有短语、直接短语、句柄。根据每颗语法树得出短语、直接短语、句柄例课本P143例6.3编译原理CompilerPrinciples练习练习
8、1题目题目文法GT:T F|T*F F F P|P P(T)|i 证明T*P(T*F)是文法G的一个句型,并指出这个句型的所有短语、直接短语、句柄。编译原理CompilerPrinciples练习解答练习解答证明:T T*F T*FP T*F(T)T*F(T*F)T*P(T*F)语法树:TT*FFPPT()T*F第1层 T*P(T*F)相对于T第2层 P(T*F)相对于F;第3层 P 相对于F;(T*F)相对于P第4层 T*F 相对于T第5层 T*P(T*F)是G的一个句型,其中T*F,P,(T*F),P(T*F),T*P(T*F)都是该句型的短语,且T*F,P 为直接短语,P为句柄编译原理C
9、ompilerPrinciples练习2题目设有文法设有文法GS:SV1V1V2|V1iV2V2V3|V2+V3V3)V1*|(1)给出给出(+(i(的最右推导,并画出相应的语法树;的最右推导,并画出相应的语法树;(2)证明证明V2+V3i(是文法的一个句型,并指出这个句型的短语、直接是文法的一个句型,并指出这个句型的短语、直接短语、句柄。短语、句柄。编译原理CompilerPrinciples练习解答()练习解答()(1)解:解:SV1V1iV2V1iV3V1i(V2i(V2+V3i(V2+(i(V3+(i(+(i(语法树:语法树:V1V1iV2(SV2V2+V3V3V3(编译原理Compi
10、lerPrinciples练习解答()练习解答()(2)证明:证明:SV1V1iV2V1iV3V1i(V2i(V2+V3i(V2+V3i(是文法的一个句型是文法的一个句型短语:短语:V2+V3,(,V2+V3i(直接短语:直接短语:V2+V3,(句柄:句柄:V2+V3编译原理CompilerPrinciples算法应考虑的问题算法应考虑的问题n算法是否能够终止?n算法是否快速?n算法是否能够处理所有的情况?n在每一步中如何选择子串进行归约?编译原理CompilerPrinciples文法文法GS:(1)S aAcBe(2)A b(3)A Ab(4)B da b b c de步骤步骤符号栈符号栈
11、输入符号串输入符号串动作动作 1)#abbcde#移进移进 2)#a bbcde#移进移进A 3)#ab bcde#归约归约(Ab)4)#aA bcde#移进移进A 5)#aAb cde#归约归约(AAb)6)#aA cde#移进移进 7)#aAc de#移进移进B 8)#aAcd e#归约归约(Bd)9)#aAcB e#移进移进11)#S#接受接受S10)#aAcBe#归约归约(SaAcBe)分析符号串abbcde是否GS的句子对输入串abbcde#的移进-规约分析过程SaAcBe aAcde aAbcde abbcde编译原理CompilerPrinciples自下而上分析法存在的问题自下
12、而上分析法存在的问题可归约串的问题可归约串的问题;(;(该分析的每一步就是从当前串中找一该分析的每一步就是从当前串中找一个子串(称个子串(称“可归约串可归约串”),将它归约到某个非终结符号),将它归约到某个非终结符号)自下而上分析法的自下而上分析法的关键关键就是找哪个子串是就是找哪个子串是“可归约串可归约串”,哪个不是哪个不是“可归约串可归约串”。例如上例中的。例如上例中的(3)abbcdeA A(3)用产生式用产生式(2)而非而非(3),否则不能归约到,否则不能归约到S因此必须精确定义因此必须精确定义“可归约串可归约串”,事实上存在着种种不同的,事实上存在着种种不同的方法刻画方法刻画“可归约
13、串可归约串”,对这个概念的不同定义,形成了不,对这个概念的不同定义,形成了不同的自下而上的分析法。在同的自下而上的分析法。在“规范归约规范归约”的分析中,用的分析中,用“句句柄柄”来刻画来刻画“可归约串可归约串”。编译原理CompilerPrinciples课本例课本例6.4例例6.4 设文法设文法GZ:(1)Z-AB(2)A-aAb(3)A-ab(4)B-bB(5)B-c对输入符号串对输入符号串aabbbc进行移进进行移进-归约分析。归约分析。分析过程在分析过程在p146.编译原理CompilerPrinciples非确定的自下而上的分析器非确定的自下而上的分析器 非确定的自下而上的分析器,
14、是一般移进非确定的自下而上的分析器,是一般移进-归约方法归约方法的抽象模型,可识别任何上下文无关语言。给定一个上下的抽象模型,可识别任何上下文无关语言。给定一个上下文无关文法,可构造一个自下而上的分析器。文无关文法,可构造一个自下而上的分析器。非确定的自下而上的分析器与非确定的自上而下的分非确定的自下而上的分析器与非确定的自上而下的分析器的不同之处:析器的不同之处:课本课本P147编译原理CompilerPrinciples非确定的自下而上的分析器形式定义非确定的自下而上的分析器形式定义 非确定的自下而上的分析器,是一个七元组。非确定的自下而上的分析器,是一个七元组。课本课本P147-148编
15、译原理CompilerPrinciples6.2 自底自底向上优先分析方法概述向上优先分析方法概述优先分析方法可分为简单优先分析法和算符优先分析法。优先分析方法可分为简单优先分析法和算符优先分析法。1、简单优先分析法的基本思想、简单优先分析法的基本思想对一个文法按一定原则求出该文法所有符号(终结符对一个文法按一定原则求出该文法所有符号(终结符和非终结符)之间的优先关系,并按照这种关系来确定归约和非终结符)之间的优先关系,并按照这种关系来确定归约过程中的句柄。它的归约过程是一种规范归约。过程中的句柄。它的归约过程是一种规范归约。2、算符优先分析法的基本思想、算符优先分析法的基本思想只规定算符之间
16、的优先关系(即只考虑终结符之间的只规定算符之间的优先关系(即只考虑终结符之间的优先关系),在规约过程中,只要找到句柄就规约,不考虑优先关系),在规约过程中,只要找到句柄就规约,不考虑归约到哪个非终结符,不是规范归约。归约到哪个非终结符,不是规范归约。编译原理CompilerPrinciples两种优先分析方法的比较两种优先分析方法的比较3、简单优先分析法和算符优先分析法比较、简单优先分析法和算符优先分析法比较简单优先分析法准确、规范,但分析效率低,不实用;简单优先分析法准确、规范,但分析效率低,不实用;算符优先分析法不规范,但速度快,特别适用于表达式的分算符优先分析法不规范,但速度快,特别适用
17、于表达式的分析。析。编译原理CompilerPrinciples6.3 简单优先分析方法简单优先分析方法按照文法符号之间的优先关系来确定句柄。按照文法符号之间的优先关系来确定句柄。1、优先关系的表示、优先关系的表示(1)X=Y表示表示X和和Y的优先关系相等的优先关系相等(2)XY表示表示X的优先性比的优先性比Y的优先性大的优先性大编译原理CompilerPrinciples6.3 简单优先分析方法简单优先分析方法按照文法符号之间的优先关系来确定句柄。按照文法符号之间的优先关系来确定句柄。2、优先关系的确定、优先关系的确定(1)X=Y文法文法G中存在产生式中存在产生式A.XY.(2)XY文法文法
18、G中存在产生式中存在产生式A.BD.,且且B.X和和DY.编译原理CompilerPrinciples简单优先关系的确定简单优先关系的确定 例子例子文法文法GS:(1)S bAb (2)A (B|a (3)B Aa)确定优先关系:确定优先关系:(1)求)求=关系关系因为:因为:SbAb和和A(B|a和和Aa)所以:所以:b=A,A=b,(=B,A=a,a=)(2)求求关系关系因为:因为:SbAb,且且A(B,Aa所以:所以:b(,ba因为:因为:A(B,且且B(B,Ba,BA所以所以:(,(a,(关系关系因为:因为:SbAb,且且A),AB,Aa所以所以:)b,Bb,ab因为:因为:BAa),
19、且且A),AB,Aa所以所以:)a,Ba,aa编译原理CompilerPrinciples3.简单优先关系矩阵简单优先关系矩阵 及及 例子例子优先关系矩阵:把文法符号之间的优先关系用矩阵来表示。优先关系矩阵:把文法符号之间的优先关系用矩阵来表示。注意注意:1.矩阵中的元素要么只有一种优先关系,要么为空;2.#用来表示语句括号,#优先级#。相当于存在:#S#文法文法GS:(1)S bAb(2)A (B|a(3)B Aa)编译原理CompilerPrinciples4.简单优先文法的定义简单优先文法的定义若一个文法是简单优先文法,必须满足以下条件:若一个文法是简单优先文法,必须满足以下条件:(1)
20、在文法符号集)在文法符号集V中,任意两个符号序偶最多只有一种优中,任意两个符号序偶最多只有一种优先关系存在;先关系存在;(2)在文法)在文法 中,任意两个产生式没有相同的右部。(若不中,任意两个产生式没有相同的右部。(若不满足会出现归约不唯一)满足会出现归约不唯一)句柄:句柄:在句型在句型a1a2an中,中,ai-1 aj+1则则ai ai+1 aj 是是句柄。句柄。编译原理CompilerPrinciples5.简单优先分析法简单优先分析法首先首先构造优先关系矩阵;构造优先关系矩阵;其次其次将文法的产生式保存,设置符号栈等;将文法的产生式保存,设置符号栈等;然后然后,按照以下算法进行归约:,
21、按照以下算法进行归约:(1)将输入符号串)将输入符号串a1a2an#依次逐个移入符号栈中,直依次逐个移入符号栈中,直到遇到栈顶符号到遇到栈顶符号ai的优先性的优先性 下一个待输入符号下一个待输入符号aj为止;为止;(2)当前栈顶符号)当前栈顶符号ai为为句柄尾,由此向左在栈中找句柄的头句柄尾,由此向左在栈中找句柄的头符号符号ak,即找到即找到ak-1 ak为止;为止;(3)由句柄)由句柄akai在在文法的产生式中查找对应的产生式,文法的产生式中查找对应的产生式,若找到则进行归约,若找到则进行归约,akai全部出栈,将产生式右部的非全部出栈,将产生式右部的非终结符进栈;否则出错;终结符进栈;否则
22、出错;(4)重复以上步骤,直到归约完输入符号串,栈中只剩下)重复以上步骤,直到归约完输入符号串,栈中只剩下文法的开始符号。文法的开始符号。编译原理CompilerPrinciples文法文法GS:(1)S bAb(2)A (B|a(3)B Aa)步骤步骤符号栈符号栈输入符号串输入符号串动作动作 1)#b(aa)b#b,移进移进 2)#b (aa)b#b(,移进移进 3)#b(aa)b#(a,归约归约Aa 5)#b(A a)b#A=a,移进移进 6)#b(Aa )b#a=),移进移进 7)#b(Aa)b#)b,归约归约BAa)8)#b(B b#Bb,归约归约A(B 9)#bA b#A=b,移进移
23、进10)#bAb#b#,归约归约SbAb11)#S#接受接受对输入串b(aa)#的简单优先分析过程简单优先关系矩阵编译原理CompilerPrinciples简单优先分析方法的算法流程图及例子简单优先分析方法的算法流程图及例子1.流程图:流程图:P166 图图6.62.例题:例题:P167 例例6.133.优先关系矩阵的表示优先关系矩阵的表示 P1684.文法存放的数据结构文法存放的数据结构 P168编译原理CompilerPrinciples6.有关文法的一些关系有关文法的一些关系 课本课本P1511.一个一个n元关系元关系R可定义为一个有序的可定义为一个有序的n元组集合。元组集合。2.基本
24、性质:自反、对称、可传递基本性质:自反、对称、可传递3.与文法相关的一些关系:关系和、关系积、传递闭包和与文法相关的一些关系:关系和、关系积、传递闭包和自反传递闭包。自反传递闭包。4.布尔矩阵和关系布尔矩阵和关系5.Warshall算法算法 一个求关系的传递闭包的算法。一个求关系的传递闭包的算法。P1546.设设R是集合是集合A上的关系,若上的关系,若#A=n,则,则R+=R1+R2+Rn 2元关系元关系R的传递闭包的传递闭包R+的关系矩阵为:的关系矩阵为:M(R+)=M(R1)+M(R2)+M(Rk)=M(R)1+M(R)2+M(R)k其中,其中,kB其中,其中,AVN,B(VNVT),(V
25、NVT)*(2).ALASTB,当且仅当文法有如下产生式:当且仅当文法有如下产生式:A-B其中,其中,AVN,B(VNVT),(VNVT)*2.FIRST关系的传递闭包关系的传递闭包FIRST+定义为:定义为:AFIRST+B,当且仅当文法有如下产生式序列:当且仅当文法有如下产生式序列:A-B1,B1-B2,Bn-B3.FIRST关系的自反传递闭包关系的自反传递闭包FIRST*定义为:定义为:AFIRST*B,当且仅当当且仅当AFIRST0B或或AFIRST+B4.同理可定义同理可定义LAST的传递闭包和自反传递闭包。的传递闭包和自反传递闭包。编译原理CompilerPrinciples关系关
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 及其 习题 解答 课件 chap6
限制150内