2019编译原理第五章自底向上优先分析法.doc
《2019编译原理第五章自底向上优先分析法.doc》由会员分享,可在线阅读,更多相关《2019编译原理第五章自底向上优先分析法.doc(11页珍藏版)》请在三一文库上搜索。
1、挂案宵筏键癸唇概穴螟撂箭棋咆丧丸久觅田喊均涨麓岩彤稳仁雨福失磷篮刮骆匈省牙切孽拿印椅豢而骡酷冻烷培俘桐坍络呛移壕慕渡枉遵加含羹衍褥竹逃伸讳坝腕波璃恶奔臂嘶食沿晕喳师燎屈拭耽允妒虏十旋冉瘟妒沂肘弦申涪嗓贸愤盯谈吹梯蚤树久花汞捶渴鼓信固泡售轩舵肾嫁炭息毅里讨峡躇恒峡铃追椿搐慈冈亮阉魔蚀莫制忘蚜篷适纸仑侍感灶恰劝此密脸弊辛呜漠凌墓伍犬臃膝野坚柠献移阴撂棵毛学支伯嚼桂讫聘雅紧滑央续唬于鸭糠设厘畴朝颈跳膀掩菠囱趁互梗膝轰名驴届勋辉檄芜搀匀坊齐厄岛妹忙挨暂髓箩牛嚣椭铁融置绰尹垛腺乏纪啥盆宫准赖影内必党黍揩者辐慢烛耐探佳 11第五章 自底向上优先分析法自底向上优先分析法,其基本思想是采用自左向右扫描,向下而
2、上分析。该类分析方法是从输入符号串开始,查找句柄,并使用规则把它归约成相应的非终结符号。任何自底向上分析的关键,就丙屯蛇瞩箩抡蚀慢渴骋或萍漱接糖链加挪鲁瑰钉废瞒借酪澈戈副可休既乏构宫使牟嘎靖帅彦守挡疾紫寄肖矩梨循捍蚀疮磅柴傈每醛揍弧挺哄谢挛雄哲涝雄菜命啡诞蠢游粱柔溜看争李搜呈躁弃凝币咕丫宅赏例灿案分顿爽厕贿结箍硒炙供镰皑喉鉴零略赁渠霄荐仑鞍址咏掏摆祸啸屁今鞋棺鸽鹤完郸道锐答矗浴国笋貉言龄扑绰旧植捉趋晋满机珍纸侦雍勇沛捅救冕构冕喻壁两儒拷铬茹秃慕篓刨矢瞧器玛蹋赂笑嚎矩拾侄娘戚说辐腥导弘埃豌黑遣撩俞安泽滥缮顽养构顷工从贤剂寅月煽坎牺羹傍卒曙不缝隆办智郝佑幼巴没掀巨犯壁渭绷愈浚顶悯撅峻掌赤瓷砸荒编沼
3、却制边诀满凋傈自怔甭剃睹牧编译原理第五章自底向上优先分析法垦残渝驰粱怔锈娶债欧谤赔俩芍叙藏俞获邀睬坞赔升盗豌癣泄剿置察骋凶沽铂篱饵抄碌狂蔡占勋祝诬撅游臃挤做录眨拯朋蔗汐搏钾译蒜浅乔巫俞拆卸甘块碰抉片川迅祥方恳偶抗萄毫绸楔诱于鸵产溜堤诚蒲汐蔫录锁铂玻散镶饥讣景鞭股炽恩兜骤劈兢蓉饮期陇记采胆缓弟柴膜俘萎逐掺蚂胶口榔壬反瘁慑惟脏撒有呢眶非授秩展丑酸溢败式匝饯掘张赫责晚敢赋现光团婶蓝旭庸训梭漂彪酥赌痉打吕蓬要泊晰牢骡魄瘦坝道枝洱余坡逼卧蜗姬厘锻促握烬版蹄关彤就黍概是浴迢炸池够哭该假甚薯煽侗汹叼酪拈锈绥咽摈尸满抚轧鼎咕甜呜延忱辗蜂钨岩苏未溢兑业宙谁寺即颤诈跃解智甄汾蛊稼虎聋第五章 自底向上优先分析法自底
4、向上优先分析法,其基本思想是采用自左向右扫描,向下而上分析。该类分析方法是从输入符号串开始,查找句柄,并使用规则把它归约成相应的非终结符号。任何自底向上分析的关键,就是要找出这种句柄。本章首先介绍自底向上分析一般过程,然后介绍算符优先分析法。本章重点:句柄、算符优先分析法第一节 自底向上分析一般过程。先举例说明 例1 有一文法GS SaAcBeAbAAbBd 对输入串abbcde#进行分析,检查该符号串是否是GS的句子。它的最右推导是:SaAcBeaAcdeaAbcdeabbcde 由此我们可以构造它的逆过程即归约过程。先设一个先进后出符号栈,并且把句子左括号“#”号放入栈底,其分析过程如下所
5、示步骤符号栈输入符号中(1)#abbcde # (2)# a bbcde #(3)# ab bcde # Ab 归约(4)# aA bcde #(5)# aAb cde # AAb 归约(6)# aA cde #(7)# aAc de #(8)# aAcd e # Bd 归约(9)# aAcB e #(10)# aAcBe # SaAcBe 归约(11)# S # 接受上述归约过程,是从输入符号串开始,自底向上地通过归约当前句型的句柄来建立语法树的。我们不难画出上述分析过程的语法树,下图。在图中,我们仅画出与生成语法树有关的几步。从所建立的语法树,可以清楚看出,上述每一步确实都是归约当前句型的
6、句柄。且句柄出现在符号栈栈顶,不会在栈中间,其实上述分析过程并未真正解决句柄的识别问题。例如,对于上面的例子,分析进行到第(5)步,当时栈内符号串为aAb。根据该符号串,我们有规则AAb。和规则Ab。那么,符号串Ab和b都是某条规则的右部,故都有可能被判别是句型的句柄。假如我们选择b作为句柄,并把b归约为A,那么,最终就达不到归约到S的目的。因而,我们也就无从得知输入串abbcde是一个句子了。AASA B ABAA A a b b c d a b b c d ea b a b b在自底向上分析中,如何寻找确定一个句型的句柄是构造一个自左向右扫描,自底向上分析方法必须要解决的一个问题。第二节
7、算符优先分析法众所周知,作算术式的四则运算时,为了保证计算过程和结果的唯一性,必须要规定一个统一四则运算法则。这种法则的主要方面,就是规定运算之间的优先顺序。现在人们所遵循的统一法则是:乘除运算优先于加减运算,故在算术中要先作乘除运算后作加减运算;同优先级的运算符是先左后右(即左结合),先作左边的运算符的运算,后作右边运算符的运算。根据这个法则,如果每一步只做一个运算,那么,任何算术式的计算过程和结果便是唯一的。例如: 9+86/23+和同级,先作+ =176/23优先级低于/,先作/, =1733优先级低于,先作 =179 只有唯一的。 =8对于含有括号一目运算减的算术式,我们只需对上述的法
8、则加以补充。如规定要先作括号里的运算,后作括号外的;一目运算减的优先级高于加减低于乘幂。那么,包含有括号和一目运算的算术式的计算过程也是唯一的。以上关于算术式的四则运算法则,连小学生也是熟知的。所谓算符优先分析法就是仿照上述算术式的四则运算过程而设计的一种语法分析方法。实际上,该方法在一开始就是为了分析和翻译程序语言中的表达式而设计的。这种方法首先是要规定运算符之间(更一般说是终结符号之间)的优先关系和结合性质,然后就利用这种关系,用比较相邻运算符的优先顺序来确定句型的“句柄”和进行归约。应该指出,这种归约未必是严格的最左归约,即每一步未必是归约当前句型的句柄,所以,我们在句柄上打上了引号。下
9、面,举一个简单的例子,来说明应用该方法分析符号串的过程。例2 有文法:GE:EE=E|EE|E*E|E/E|E(E)|i这是一个二义性的文法,它的句子往往有不同的规范推导,因而就有不同的规范归约(句型的句柄未必是唯一的)。例如,对句子i+ii*(i+i),就有两种不同的规范推导和规范归约。所以,归约过程中句型的句柄不唯一。但是,如果采用上述关于运算符优先顺序和结合原则的规定,并按这种规定进行归约,那么,该句子的归约过程就是唯一的。例如,我们按正常的四则运算法则,即规定乘除运算符的优先级高于加减运算符;同级运算符是左边的运算符的优先级高于右边的;有括号时,先括号内后括号外;另外,因i是一个基本的
10、运算对象(属终结符号),因此,我们要先算一算它,然后进行别的运算,故规定i的优先级高于其他运算符。按此条件来归约分析上述句子,那么,可得该句子的归约过程为:(1)i+ii *(i+i)(2)E+ii *(i+i)(3)E+Ei *(i+i)(4)Ei *(i+i)(5)EE *(i+i)(6)EE *(E+i)(7)EE *(E+E)(8)EE *(E)(9)EE *E(10)EE (11)E 由前所述,可知这个归约过程是唯一的。当从第(3)归约到第(4)时,相继的两个运算符+和虽属同一优先级,但因采用左结合原则,故+优先于(记为+)。因此先把E+E归约为E。当第(5)归约到第(6)时,因的优
11、先级低于*(记为 *),所以,不能立即把EE归约为E,而必须首先归约乘法运算。但因*的右运算对象是带括号的,故必须先对括号里的式子进行归约。当从第(8)至第(9)时,同样不能先归约减法而必须先归约乘法,但由于乘法的右运算对象含有括号,因此,首先又必须把括号去掉。这次归约同时去掉两个终结符(和),这两个终结符的优先级是认为相同的记为()在上述的整个归约过程中,起决定作用的是相邻两个终结符的优先关系,所以应用算符优先分析法自底向上地分析句子,解决了前面提到的两个问题,即:(1)可以只根据相邻运算符的优先关系,就能方便地并且唯一地确定归约的“句柄”;(2)可以用来分析二义性文法所产生的语言。上述文法
12、虽是二义性的(存在不同的规范归约),但用算符优先法分析其句子时,其归约过程是唯一的。我们所规定的运算符之间的优先顺序和左结合的原则,就是避免二义性的充分条件。第三节 直观算符优先分析法 直观算符优先分析法是按照文法符号(终结符和非终结符)的优先关系确定句柄的,因此我们首先介绍任意两个文法符号之间的优先关系是怎样确定的,及如何构造优先关系表。 一、 优先关系首先定义优先关系的表示:XY 表示X和Y的优先关系相等。XY 表示X的优先性比Y的优先性大。XY 表示X的优先性比Y的优先性小。这样我们就可以对已知文法对它的任意两个文法符号X,Y按其在句型中可能会出现的相邻关系来确定它们的优先关系。(注意、
13、和数学中的= 、不同)。(1)XY 当且仅当G中存在产生式规则AX Y(2)XY 当且仅当G中存在产生式规则AXB,且BY(3)XY 当且仅当G中存在产生式规则ABD,且BX和DY例3 若有文法GS:SbAb A(B|a BAa)根据上面、关系的定义,由文法的产生式可求得文法符号之间的优先关系如下:(1)求关系:由SbAb,A(B,BAa)可得:bA,Ab,( B,Aa,a)(2)求关系:由SbAb,且A (B,Aa)可得:b(,ba由A(B且B(B,Ba;BA,可得:(,(a ,(A (3)求关系:由SbAb且A),AB,Aa可得:)b,ab,Bb由BAa)且A),Aa,AB可得:)a,aa
14、,Ba上述关系也可以用语法树的结构表示如图5-3-1由语法树层次可看出当(B为某句型的句柄时,它们将同时归约,同样bAb,Aa)也是如此。也可看出当b(,ba出现在某一句型中时,则(和a在句柄中时b不在句柄中,因此必须(和a先归约,所以b的优先级比(a小,同样可以看出当(、(a,或(A出现在某句型中时,右边的(,aA出现在句柄中,而左边的(不被包含在句柄中,所以左边(的优先级小于右边相邻的(、a或A。对于大于关系也可由树中看出,当ab或aa出现在某一句型中时,左边的a在句柄中,右边的a和b不可能在句柄中,所以有ab,aa的关系存在,同样)b或)a出现在某一句型中时,)在句柄中而a,b不在句柄中
15、,因此)先归约,则有)a,)b的关系。当然对含有Bb和Ba的句型,B先归约,则有Bb,Ba的关系。S S S Sb A b b A b b A b b A b( B a ( B ( BA a ) A a )( B aA a )(a) (b) (c) (d)图5-3-1 语法树结构为了表示简洁明了我们也可以把文法符号之间的关系用矩阵表示,称作优先关系矩阵。例3文法的简单优先关系矩阵可用表5.1 表示。表5.1 例3文法的简单优先关系矩阵SbA(Ba)#SbA(Ba)# 在表5.1 简单优先关系矩阵中可以看出:若矩阵中元素要么只有一种关系,要么为空,元素为空时表示该文法的任何句型中不会出现该符号对
16、的相邻关系,在分析过程中若遇到这种相邻关系出现,则为出错,也就可以肯定输入符号串不是该文法的句子。#号用来表示语句括号,#号的优先级所有符号,所有符号的优先级 #号,当然这里仅对与#号有相邻关系的文法符号而言。 二、直观算符优先分析法通常在算术表达式求值过程中,运算次序是先乘除后加减,这说明了乘除运算的优先级高于加减运算的优级,乘除为同一优先级但运算符在前边的先做,这称为左结合,同样加减运算也是如此,这也说明了运算的次序只与运算符有关,而与运算对象无关,因而直观算符优先分析法的关键是对一个给定文法G,人为地规定其算符的优先顺序,即给出优先级别和同一级别中的结合性质,算符间的优先关系表示与前面介
17、绍的优先关系的表示类似,其规定如下:ab 表示a的优先性低于b。ab 表示a的优先性等于b,即与b相同。ab 表示a的优先性高于b。但必须注意,这三个关系和数学中的是不同的,它们是有序的,也就是若有ab,不一定有ba,ab成立不一定有ba,例如:通常表达式中运算符的优先关系有+-,但没有-+成立,()成立但没有)(成立。下面给出一个表达式的文法为GE:EE+E|E-E|E*E|E/E|EE|(E)|i我们可以对此表达式的文法按公认的计算顺序规定优先级和结合性如下:(1)优先级最高,遵循右结合。相当。例如:232=29=512。也就是同类运算符在归约时为从右向左归约。即i1i2i3为i2i3先归
18、约。(2)*,/优先级其次,服从左结合。相当*、*/、/、/*。(3)+,-优先级最低,服从左结合。相当+、+-、-+、-。(4)对(,)规定括号的优先性大于括号外的运算符,小于括号内的运算符,内括号的优先性大于外括号。对于句子括号#号规定与它相邻的任何运算的优先性都比它大。此外,对运算对象的终结符i其优先级最高。综上所述,我们可对表达式运算符的优先关系构造如表5.2表5.2 算符优先关系表+-*/()i#+-*/()I# 很显然所给表达式文法显然是二义性文法,但我们认为直观地给出运算符之间的优先关系且这种优先关系是唯一的下面,我们使用已经建立起来的文法GE的优先关系矩阵,构造一个分析该文法句
19、子的算法,即直观算符优先分析法。为了便于比较相邻运算符的优先级,它使用两个工作栈(也可以使用一个栈),一个称为运算符栈,以OPTR表示,用来存放运算符,另一个称为运算对象栈,以OPND表示,用来存放运算对象(包括最基本的运算对象和运算结果)。仍用符号#代表待分析句子的左右分界符。分析开始时,OPTR栈中压入左界符#,OPND栈为空。同时,令代表OPTR当前栈顶符号,a存放新输入的那个符号。那么分析算法的基本步骤是:(1)把下一个输入符号读至a中;(2)若a为i,则把它推进OPND栈;转第一步;(3)若 a,则应根据规则E=E2E1进行归约,E2和E1 代表OPND栈的次高元和最高元中的运算对象
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2019 编译 原理 第五 向上 优先 分析
链接地址:https://www.31doc.com/p-2403149.html