第5章自顶向下语法分析方法.ppt
《第5章自顶向下语法分析方法.ppt》由会员分享,可在线阅读,更多相关《第5章自顶向下语法分析方法.ppt(147页珍藏版)》请在三一办公上搜索。
1、第5章自顶向下语法分析方法,语法分析(Syntax Analysis)是编译程序的核心部分。词法分析只是将字符形式的源程序中的各个单词识别出来,形成单词的机内表示形式,但是这些单词串如何构成更大的语法成分语句,那就由语法分析来完成。语法分析的主要任务就是“组词成句”,即在词法分析识别出单词串的基础上,根据语言的语法规则,识别出各类语法成分,如“语句”、“程序”等。将完成语法分析任务的程序称为语法分析程序,也称为语法分析器或简称分析器。,程序设计语言的语法结构是用上下文无关文法描述的,因此,语法分析器的实现原理就是按所给定的文法G,识别输入符号串是否为一个句子(即L(G)成立吗?),同时检查和处
2、理语法错误。语法分析的关键是句型识别问题。给定一串单词(即文法的终结符),怎样知道它是不是该文法产生的一个句子呢?可以利用推导,或者利用语法树来进行判断。一般来说,语法分析的过程就是为一个句子建立语法树的过程。,语法分析的方法很多,按照建立语法树的不同方向,通常将语法分析分为两类,一类是自顶向下分析法,另一类是自底向上分析法。本章主要介绍自顶向下分析法,自底向上分析法。,第4章教学内容,语法分析的任务;确定的自顶向下语法分析的基本思想;LL(1)文法的定义和判别方法;非LL(1)文法到LL(1)文法的等价变换;确定的自顶向下分析方法:递归下降分析法预测分析法,自底向上语法分析的基本思想;短语、
3、直接短语和句柄的定义,以及如何利用语法树寻找短语、直接短语和句柄。自底向上语法分析方法:优先分析法LR分析法,一、自顶向下的语法分析思想,【自顶向下(top-down)分析法的基本思想】自顶向下语法分析的基本思想是以文法的开始符号为树根,采用最左推导,试图自上而下地为输入的单词串构造一棵语法树。若语法树的端末节点从左向右排列恰好是输入串,则该输入串就是文法的句子,否则就不是。这种分析过程实质是一种试探过程,是反复使用不同产生式来匹配输入串的过程。,示例,【例4.1】设有以下文法G1S:SaAB AbA|c BdBe|de输入串abbcde的最左推导如下:S aAB abAB abbAB abb
4、cB abbcde因此,输入串abbcde是该文法G1的句子。,下面从建立语法树来看句子的推导过程。为了自顶向下地构造输入串abbcde的语法树,首先按文法的开始符号产生根节点S,再根据产生式规则自顶向下地生长这棵语法树。语法树的建立过程如图所示。,S,a A B,b A,b A,c,d e,自顶向下分析法也称面向目标的分析方法,在对输入串进行最左推导的过程中,在选择产生式时其实是一种试探方法,如果每一步选择产生式来匹配的时候都能够每选必中,则这种方法称为确定的分析方法;否则在选择产生式时面临多种可能,不知道选择哪一个产生式合适,就是不确定的分析方法。因此自顶向下分析法又可分为确定的和不确定的
5、两种,确定的分析方法对文法有一定的限制,但由于实现方法简单、直观,便于手工构造或自动生成语法分析器,因而仍是目前常用的方法之一。不确定的方法即带回溯的分析方法,这种方法实际上是一种穷举的试探方法,因此效率低,代价高,因而极少使用。,1.不确定的自顶向下分析,不确定的自顶向下分析法的基本思想是,对任何输入串试图用一切可能的办法,从文法的开始符号出发,自上而下的为它建立一棵语法树。如果试探成功,则为相应文法的句子,否则就不是文法句子。这种分析过程本质上是一种穷举试探过程,是反复使用不同规则,谋求匹配输入串的过程。因此这种匹配过程往往一次不能成功,需要重新匹配,称为回溯。引起回溯的原因在于文法中关于
6、某个非终结符的产生式有多个时,而根据面临的输入符无法唯一确定选择哪个产生式来匹配,从而引起回溯。,自顶向下分析法中存在的问题,回溯问题 左递归问题,回溯问题,回溯时需要恢复到出错点位置,删去曾经匹配过的符号,还包括一些语义处理。因此处理回溯是一项复杂的工作,在回溯时,要清除在回溯之前编译程序所做的大量记录工作,然后重新开始记录,这就降低了语法分析的效率。避免回溯是自顶向下语法分析中需要解决的问题之一。,回溯的具体表现,回溯具体表现为下列两种情况:1.由于相同左部的产生式的候选式的FIRST集交集不为空而引起回溯。2.由于相同左部非终结符的候选式存在能推导出的产生式,且该非终结符的FOLLOW集
7、中含有其它候选式的FIRST集的元素。,表现一示例,由于相同左部的产生式的候选式的FIRST集交集不为空而引起回溯:【例46】设有文法G6S为:SxAyA*|*,串x*y的分析过程,S,x A y,*,(S,x)选择产生式SxAy,当前要替换的非终结符,当前要匹配的输入符,(A,*)可选择两个产生式 A*或A*,回溯:回到出错点,重新选择产生式A*,成功,原因,上述文法发生回溯的原因就在于A的两个产生式的候选式的第一个符号都是*,从而根据输入符*来选择A的产生式时有多种可能,因此会引起回溯。即:关于A的产生式的可选集交集不为。SELECT(A*)SELECT(A*)=*,表现二示例,由于相同左
8、部非终结符的候选式存在能推导出的产生式,且该非终结符的FOLLOW集中含有其它候选式的FIRST集的元素。【例如】例4.5的文法G5:SaAS Sb AbA A,对输入串ab#的试探推导过程,S,a A S,S,a A S,b A,S,a A S,b,原因,上述文法发生回溯的原因就在于选择产生式A相当于与A的后随符号FOLLOEW(A)a,b匹配,但是由于A的后随符号b与A的第一个候选式的第一个符号b相同,从而根据输入符b来选择A的产生式时有多种可能,因此会引起回溯。即:关于A的产生式的可选集交集不为。SELECT(AbA)SELECT(A)=b,左递归问题,【例4.7】算术表达式的文法G7E
9、为:E ET|TT T*F|FF i|(E),对输入串i*i+i进行试探推导,结论,当一个文法是左递归的,采用自顶向下分析法会使分析过程陷入无限循环之中。回溯会使语法分析动作不确定,而左递归会使语法分析程序陷入无限循环之中,这些都使得语法分析的动作是不确定的。,不确定的语法分析方法带回溯的自顶向下分析法实际上是一种穷举的试探方法,当分析不成功时则推翻以前的分析退回到适当位置再重新试探其余候选式可能的推导,这样需要记录已选过的产生式,直到把所有可能的推导序列都试完仍不成功才能确认输入串不是该文法的句子而报错。由于在编译程序真正实现时往往是边分析边插入语义动作,因而带回溯的语法分析方法代价很高,效
10、率很低,在实用编译程序中几乎不用,因此对它实现的详细算法不做介绍。,2.确定的自顶向下的分析,确定的自顶向下分析方法,首先要解决从文法的开始符号出发,如何根据当前的输入符号(单词符号)唯一地确定选用哪个产生式替换相应非终结符往下推导,或构造一棵相应的语法树。,【例4.2】若有文法G2S:SaABAbB AcABaBd文法G2的句子acbad的自顶向下分析过程如下:,示例一,注意:#是输入结束符,以上最左推导所建立输入串acbad的语法树如图所示。,S,a A B,c A,b B,a,d,选择产生式是唯一的,在第2步推导时,当前要替换的非终结符为A,面临的输入符为c,所以选择A的产生式来推导时,
11、只能选产生式AcA,而不能选AbB。同样,在第5步推导时,当前要替换的非终结符为B,面临的输入符为d,所以选择B的产生式来推导时,只能选产生式Bd,而不能选Ba。这样就保证上述每一步推导都是确定的。,文法的特点,文法G2有以下两个特点:(1)每个产生式的右部都由终结符号开始;(2)如果两个产生式有相同的左部,那么它们的右部由不同的终结符开始。对于这样的文法显然在推导过程中完全可以根据当前要替换的非终结符和输入符号决定选择哪个产生式往下推导,因此分析过程是唯一确定的。,示例二,【例4.3】若有文法G3S为:SAaSBbAcAdABeBfB,文法G3的句子ddca的自顶向下分析过程如下:,以上最左
12、推导所建立输入串ddca的语法树如图所示。,S,A a,d A,d A,c,文法的特点,这个文法的特点是:(1)产生式的右部不全是由终结符开始。(2)如果两个产生式有相同的左部,它们的右部是由不同的终结符或非终结符开始。(3)文法中无空产生式。,讨论,对于产生式中相同左部含有非终结符开始的产生式,在推导过程中选用哪个产生式不像G2文法那样直观。对于输入串ddca,其第一个符号是d,这时从S出发选择SAa还是选择SBb时,需要知道Aa或Bb能推导出的首终结符号集合是什么(即Aad,还是Bbd)。若Aad成立,则选择SAa往下推导;若Bbd成立,则选择SBb往下推导;其它情况则为不确定推导或出错。
13、,首终结符号集,【定义4.1】设G(VN,VT,P,S)是上下文无关文法,是由非终结符与终结符组成的任意符号串,用FIRST()表示的首终结符集,则FIRST()a|a,aVT,(VNVT)*若,则规定FIRST()(空集)。,*,求符号串Aa与Bb的首终结符集:因为Aaca,AadAa,所以FIRST(Aa)=c,d。因为Bbeb,BbfBb,所以FIRST(Bb)=e,f。但是FIRST(Aa)FIRST(Bb)=因而可以根据当前的输入符号是属于哪个产生式右部的首终结符集而决定选择相应产生式进行推导,即当前要替换的非终结符为S,面临的输入符为d时,只能选择产生式SAa(因为dFIRST(A
14、a))。这样仍然是确定的自顶向下分析。,假如考虑文法中有_产生式时,将会产生什么问题呢?先看下面的例子:【例4.4】若有文法G4S:SaABAbB AcAABaBd,文法G4的句子aca的自顶向下分析过程如下:,以上最左推导所建立输入串aca的语法树如图所示。,S,a A B,c A,a,讨论,考查以上推导,在第3步到第4步的推导中,即acABacB时,因为当前要替换的最左非终结符为A,面临输入符为a,而关于A的产生式右部的首终结符集都不包含a,但有,因此对于a的匹配自然认为只能依赖于在可能的推导过程中A的后面的符号,所以这时选用产生式A往下推导,而当前A后面的符号为B,B的产生式右部的首终结
15、符集包含了a,所以可匹配。由此可以看出,当前输入符a与A后面的非终结符B匹配。,当某一非终结符的产生式中含有_产生式时,它的非空产生式右部的首终结符集两两不相交,并与在推导过程中紧跟该非终结符右边可能出现的首终结符号集也不相交,则仍可构造确定的自顶向下分析。为此,我们为非终结符引入后随符号集的概念。,后随符号集,【定义4.2】设G(VN,VT,P,S)是上下文无关文法,A是G中的非终结符,用FOLLOW(A)表示A的后随符号集,则有:FOLLOW(A)a|S Aa,aVT特别地,若有SA,则规定FOLLOW(A)。换句话说,FOLLOW(A)是指在G的各个句型中位于A后面的那些终结符或。用作为
16、输入串的结束符,或称为句子括号,如:输入串。,*,对于例4.4中的文法G4,可用观察法求得FOLLOW(A)a,d。在自顶向下分析过程中,如果当前要替换的非终结符A面临输入符a或d时,应该选择产生式A去匹配,而当面临b或c时,则分别选择产生式AbB 或AcA去匹配。,因此当文法中还有形如:AA的产生式时,其中AVN,V*,当和不同时推导出时,设,则当FIRST()(FIRST()FOLLOW(A))时,对于非终结符A的替换仍可唯一地确定产生式。,*,*,SELECT集,在自顶向下分析过程中,对每个产生式的选择都可由输入符来决定。综合以上情况,为每个产生式定义一个可选集(SELECT)如下:,可
17、选集的定义,【定义4.3】给定上下文无关文法的产生式A,AVN,V*,则定义:如果,则SELECT(A)=FIRST();如果,则SELECT(A)=FIRST()FOLLOW(A);特别地,如果,则SELECT(A)=FOLLOW(A)。,*,*,可选集的含义,可选集的含义如下:在自顶向下分析过程中,如果当前要替换的最左非终结符为A,面临输入符为aSELECT(A)时,则可以选择产生式A来匹配。因此,只要文法G的某一个非终结符A的各个可选集互不相交,则语法分析程序就可以根据当前输入符和A的可选集来唯一正确的选择A的某个产生式去匹配。,LL(1)文法,【定义4.4】一个上下文无关文法是LL(1
18、)文法的充分必要条件是关于同一非终结符的各个产生式的可选集互不相交。LL(1)文法的含义是:第一个L表明自顶向下分析过程中是从左到右扫描输入串,第二个L表明分析过程中采用最左推导,1表明只需向前查看一个输入符号便可决定选择哪个产生式(规则)进行推导。类似地,也可以有LL(k)文法,也就是需要向前查看K个符号才能够确定选择哪个产生式。通常采用K=1,个别情况采用K=2。,示例,【例4.4】文法G4S:SaABAbB AcAABaBd,计算可选集:SELECT(SaAB)aSELECT(AbB)bSELECT(AcA)cSELECT(A)FOLLOW(A)a,dSELECT(Ba)aSELECT(
19、Bd)d显然有:SELECT(AbB)SELECT(AcA)bc SELECT(AbB)SELECT(A)ba,d SELECT(AcA)SELECT(A)ca,d SELECT(Ba)SELECT(Bd)ad 所以,该文法是LL(1)文法。,示例,【例4.5】设文法G5S为:SaASSbAbAA,因为有:SELECT(SaAS)FIRST(aAS)aSELECT(Sb)FIRST(b)bSELECT(AbA)FIRST(bA)bSELECT(A)FOLLOW(A)FIRST(S)a,b所以:SELECT(SaAS)SELECT(Sb)abSELECT(AbA)SELECT(A)ba,b因此,
20、该文法不是LL(1)文法,因而也就不可能进行确定的自顶向下语法分析。,原因,从对输入串ab的下列两种不同推导过程来看:第一种推导过程可为:S aAS abAS abS 在句型abS中由于S不能推出,所以第一种推导过程推不出ab;第二种推导过程可为:S aAS aS ab 第二种推导过程推出了ab。,以上两种推导中,当第二步推导时当前输入符为b,对句型aAS中的A用哪个产生式推导不能唯一确定,也就是导致了这个文法不能进行确定的自顶向下分析。也即非LL(1)文法是不能进行确定的自顶向下分析。,结论,确定的自顶向下语法分析要求文法是LL(1)文法。,二、LL(1)文法,LL(1)文法是一类可以进行确
21、定的自顶向下语法分析的文法。根据LL(1)文法的定义,对于同一非终结符A的任意两个产生式A和A,都要满足:SELECT(A)SELECT(A)这样,当前非终结符A面临输入符a时,如果aSELECT(A),则可以选择产生式A去准确匹配,从而解决回溯问题。,LL(1)文法的判别,采用确定的自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法。因而对任何给定的文法需要计算FIRST、FOLLOW、SELECT集合,进而判别该文法是否为LL(1)文法。,1.构造FIRST集,符号串的首终结符集为FIRST(),定义:FIRST()a|a,aVT,(VNVT)*若,则规定FIRST()。,*,构
22、造FIRST集的算法,对于文法符号串(VNVT)*,构造FIRST()的算法如下:反复使用如下规则,直至FIRST集不再增大为止。若a,且a是终结符,则FIRST()a;若X,X是非终结符,且有Xb,则把b加入FIRST()中;若X1X2Xk,X1,X2,Xk都是非终结符,首先把FIRST(X1)加入FIRST()中;若X1X2Xi,则把FIRST(Xi1Xi2Xk)加入FIRST()中,其中1ik1;若X1X2Xk,则把FIRST()加入FIRST()中。,+,+,在构造FIRST集的算法中,第条规则中的情况最复杂,下面具体说明一下。设ABC,A,B,C都是非终结符,则分情况讨论:若A,则F
23、IRST()FIRST(A);若A,但B,则FIRST()FIRST(A)FIRST(BC);若AB,但是C,则FIRST()FIRST(A)FIRST(B)FIRST(C);若ABC,但是,则FIRST()FIRST(A)FIRST(B)FIRST(C)FIRST()。,+,+,+,+,+,+,+,示例一,【例4.8】若文法G8S为:SAB SbCA AbB BaDCAD CbDaS Dc,求各非终结符的FIRST集,FIRST(S)FIRST(AB)FIRST(bC)(SAB,SbC)FIRST(A)FIRST(B)b(A)b,abb,a,FIRST(A)FIRST(b)b(Ab)FIRS
24、T(B)FIRST(aD)a(BaD),FIRST(C)FIRST(AD)FIRST(b)(CAD,Cb)FIRST(A)FIRST(D)b(A)b,a,cbb,a,c,FIRST(D)FIRST(aS)FIRST(c)(DaS,Dc)aca,c,结果,所以最终求得:FIRST(S)b,aFIRST(A)bFIRST(B)aFIRST(C)b,a,cFIRST(D)a,c,2.构造FOLLOW集,非终结符A的后随符号集的定义为:FOLLOW(A)a|S Aa,aVT特别地,若有S A,则规定FOLLOW(A)。,*,*,构造FOLLOW集的算法,对文法中每一非终结符A,构造FOLLOW(A)的
25、算法如下:反复使用如下规则,直至FOLLOW集不再增大为止。若A是文法的开始符号,则把输入结束符加入FOLLOW(A)中;若BAa,a是终结符,则把a加入FOLLOW(A)中;若BAX,X是非终结符,则把FIRST(X)加入FOLLOW(A)中;若BA或BA,且,则把FOLLOW(B)加入FOLLOW(A)中。,*,注意,在构造FOLLOW集的算法中,将第条规则解释一下:如果有句型Ba,显然a是B的后随符号,aFOLLOW(B),而BA,用它往下进行推导有SBaAa,那么a也是A的后随符号,aFOLLOW(A)即FOLLOW(B)中的后随符号都是FOLLOW(A)中的后随符号。,+,同样的,如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 向下 语法分析 方法
链接地址:https://www.31ppt.com/p-5638246.html