编译原理自顶向下语法分析方法.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《编译原理自顶向下语法分析方法.pptx》由会员分享,可在线阅读,更多相关《编译原理自顶向下语法分析方法.pptx(101页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、学习目标:掌握:LL(1)文法的判别,预测分析法,递归子程序的构造方法理解:LL(1)文法了解:不确定的自顶向下分析第1页/共101页语法分析的作用是识别由词法分析给出的单词序列是否是给定文法的正确句子语法分析自顶向下分析自底向上分析确定的不确定的算法优先分析(第六章)LR分析(第五章)自顶向下基本思想:从文法的开始符出发企图推导出与输入的单词串完全相匹配的句子.分类:第2页/共101页回顾自上而下的分析方法q定义:从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。q语法树的构造:将文法的开始符号作为语法树的根,向下逐步建立语法树,使语法树的末端结点符号串正好是输入符号串
2、。q自上而下分析的主要问题选定产生式第3页/共101页例文法G:S cAdA abA a识别输入串w=cabd是否为该文法的句子ScAdab=cabdS=cAd回顾自上而下的分析方法ScA da成功不成功=cadS=cAd第4页/共101页4.1确定的自顶向下分析思想4.2LL(1)文法的判别4.3某些非LL(1)文法到LL(1)文法的等价变换4.4不确定的自顶向下分析思想4.5确定的自顶向下分析方法本章内容第5页/共101页4.1确定的自顶向下分析思想1确定分析的条件2开始符号集FIRST()的定义3后跟符号集FOLLOW(A)的定义4选择集合SELECT(A)的定义5LL(1)文法的定义第
3、6页/共101页1.确定分析的条件从文法的开始符出发,如能根据当前的输入符号(单词符号)唯一地确定选用哪个产生式进行推导,则分析是确定的。第7页/共101页例1设有文法G1S:SpA|qBAcAd|aBdB|b若输入串W=pccadd。自顶向下的推导过程为:SSApcAdcAda=pA=pcAd=pccAdd=pccaddG1S有如下特点:(1)每个产生式的右部由终结符开头;(2)同一非终结符的不同产生式的右部由不同的终结符开头。对于这种文法,在推导过程可以根据当前的输入符号唯一确定选哪个产生式往下推导,即分析过程是确定的。第8页/共101页例2:设有文法G2S为:SAp|BqAa|cABb|
4、dBpAScAcAa=ccapS=cAp=ccAp=Ap该例说明,当(1)产生式右部以终结符或非终结符开头(无空产生式);(2)同一非终结符的不同产生式的右部由不同的符号开头。若输入串W=ccap,自顶向下的推导过程为:对于这种文法,在推导过程选用哪个产生式不直观,关键是判断产生式右部推出的开始符号(集),分析过程可能是确定的第9页/共101页例3:设有文法G3SSaA|dAbAS|若输入串W=abd,自顶向下的推导过程为:AaSbSA d=abdS=abAS=abS文法的特点包含空产生式=aA对于空产生式左部的非终结符,关键是判断该非终结符的后跟符号(集),分析过程可能是确定的。第10页/共
5、101页要进行确定的自顶向下的分析,文法要满足一定的限制即文法是LL(1)文法先研究三个定义开始符号集FIRST后跟符号集FOLLOW选择集合SELECT第11页/共101页2.开始符号集FIRST()的定义定义:设G=(VN,VT,P,S)是上下文无关文法,(VN,(VNVT)*)FIRST()=a|aVT且*a.(若*则规定FIRST())直观上说文法符号串的开始符号集是由推导出的所有的终结符开头和可能的组成。第12页/共101页例文法G2S:SApSBqAaAcABbBdBFIRST(Ap)=a,cFIRST(Bq)=b,dFIRST(a)=aFIRST(cA)=cFIRST(b)=bF
6、IRST(dB)=d结论一 针对无空产生式的文法G,同一非终结符的任两个产生式的右部串的First集无交集,即可进行确定的自顶向下分析。第13页/共101页3.后跟符号集FOLLOW(A)的定义定义设G=(VT,VN,P,S)是上下文无关文法,BxAy (A,BVNx,y(VNVT)*)FOLLOW(A)=a|S=*Aa,aVT,若有S=*A,则规定#FOLLOW(A)(注:#输入串#,#做为输入串的结束符)直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那些终结符(包括#)组成。第14页/共101页例文法G3S:SaA|dAbAS|由S=*S得#FOLLOW(S)由S=aA=abAS=a
7、bbASS=abbASaA得aFOLLOW(S)=abbASd得dFOLLOW(S)FOLLOW(S)=#,a,d由S=*aA得#FOLLOW(A)由S=*abAS=*abAaA得aFOLLOW(A)=*abAd得dFOLLOW(A)FOLLOW(A)=#,a,dFOLLOW(A)FOLLOW(S)第15页/共101页解释当A面对应输入符a,在自顶向下的分析中应选择这样的产生式Ai(i可导出空串)进行推导:若aFirst(i),则Ai可选因i可能导出空串,A自动获得匹配,输入符a有可能与A后的一个符号匹配,故当aFollow(A)时,产生式Ai亦可选结论一 针对无空产生式的文法G,同一非终结符
8、的任两个产生式的右部串的First集无交集,即可进行确定的自顶向下分析。结论二第16页/共101页例文法G3S:SaA|dAbAS|SaA=Sd=AbAS=A=First(aA)=aFirst(d)=dFirst(bAS)=bFirst()+Follow(A)=+#,a,d=,#,a,d=#,a,d第17页/共101页回顾开始符号集FIRST()的定义定义:设G=(VN,VT,P,S)是上下文无关文法,A(AVN,(VNVT)*)FIRST()=a|aVT且*a.(若*,则规定FIRST())直观上说文法符号串的开始符号集是由推导出的所有的终结符开头和可能的组成。第18页/共101页回顾后跟符
9、号集FOLLOW(A)的定义定义设G=(VT,VN,P,S)是上下文无关文法,BxAy (A,BVNx,y(VNVT)*)FOLLOW(A)=a|S=*Aa,aVT,若有S=*A,则规定#FOLLOW(A)(注:#输入串#,#做为输入串的结束符)直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那些终结符(包括#)组成。第19页/共101页4.选择集合SELECT(A)的定义定义对给定的上下文无关文法的产生式A(AVN,V*)若*,则SELECT(A)=FIRST()若=*,则SELECT(A)=(FIRST()-)FOLLOW(A)第20页/共101页解释A的产生式A1|2|3|(A面对应
10、输入符a)在自顶向下的分析中:对于Ai且i*,若aFirst(i),则Ai可选对于Aj且j=*,若a(First(j)-)Follow(A),则Aj可选第21页/共101页例G3S:SaASdAbASASELECT(SaA)=FIRST(aA)=aSELECT(Sd)=FIRST(d)=dSELECT(AbAS)=FIRST(bAS)=bSELECT(A)=(FIRST()-)+FOLLOW(A)=#,a,d若*,则SELECT(A)=FIRST()若=*,则SELECT(A)=(FIRST()-)FOLLOW(A)第22页/共101页结论三同一非终结符的不同产生式A与A,若SELECT(A)
11、SELECT(A)=,则一定可以进行确定的自顶向下分析第23页/共101页5.LL(1)文法的定义定义:上下文无关文法为LL(1)文法的充分必要条件是,对每个非终结符A的两个不同产生式A与A,满足SELECT(A)SELECT(A)=LL(1)文法的含义是:第一个L从左到右扫描输入串第二个L分析过程用最左推导(1)表明只需向前看1个输入符号便可以决定选哪个产生式进行推导(类似地,LL(k)文法则需要向前看k个输入符号才可以确定选用哪个产生式)第24页/共101页例有文法GS为:SaASSbAbAASELECT(SaAS)=aSELECT(Sb)=bSELECT(AbA)=bSELECT(A)=
12、a,b由于SELECT(AbA)SELECT(A)=b,所以文法GS不是LL(1)文法,当A遇输入符b时,不能确定选AbA还是A去推导。第25页/共101页4.2LL(1)文法的判别要判别一个上下文无关文法是否是LL(1)文法分为五步:1.求能推出的非终结符集2.计算每个产生式右部的FIRST()集3.计算每个非终结符A的FOLLOW(A)集4.计算每个产生式A的SELECT(A)集5.按LL(1)文法的定义判别第26页/共101页1.求出能推出的非终结符集算法描述:用T表示能推出的非终结符集令T=Aj|(Aj)产生式集对于产生式ApA1.An若A1.AnT,则T=TAp重复,直至T收敛(不再
13、变化)为止第27页/共101页例GS:SAB|bCAb|BaD|CAD|bDaS|cA,B,S第一次A,B初值A,B,S收敛第二次非终结符集T能推出的非终结符集T为A,B,S第28页/共101页2.计算每个产生式右部的FIRST()集对每个aVT:First(a)=a对每个AVN:若A*则当前First(A)=否则当前First(A)=对每个产生式AX1XjXn:First(A)=First(A)SectionFirst(X1XjXn)SectionFirst(X1XjXn)=(First(X1)-)(First(X2)-)(First(Xj)-)First(Xj+1)Xj+1是产生式右部中第
14、一个不能推出的符号首先对文法符号X(XVT VN),求FIRST(X):第29页/共101页对每个产生式 AX1XjXn 做:First(A)=First(A)SectionFirst(X1XjXn)其中 SectionFirst(X1XjXn)=(First(X1)-)(First(X2)-)(First(Xj)-)First(Xj+1)Xj+1是产生式右部中第一个不能推出的符号若X1*则SectionFirst(X1XjXn)=First(X1)若X1Xn全可推出 则SectionFirst(X1Xn)=(First(X1)-)(FIRST(Xn)-)重复3直到每个符号的FIRST集合都不
15、再增大为止第30页/共101页例GS:SAB|bCAb|BaD|CAD|bDaS|cbaa cb a c a b b aFirst集(3)baa cb a b bFirst集(2)ba First集(1)ABCDabSabFirst集(0)已求出能推出的非终结符集T为A,B,Sbbaba caa c(敛)(敛)(敛)(敛)(敛)(敛)(敛)c(敛)cccc第31页/共101页baa cb a c a b b aFirst集(3)baa cb a b bFirst集(2)ba First集(1)ABCDabSabFirst集(0)bbaba caa c(敛)(敛)(敛)(敛)(敛)(敛)(敛)c
16、(敛)cccc结论:文法符号的First集合如下:First(S)=a,b,First(A)=b,First(B)=a,First(C)=a,b,cFirst(D)=a,cFirst(a)=aFirst(b)=bFirst(c)=c第32页/共101页利用求出每个文法符号的FIRST集求符号串的FIRST集设右部串=X1X2Xn1.当X1*,则FIRST()=FIRST(X1)2.若对任何j(1jn)都有FIRST(Xj),Xj+1为X1X2Xn中第一个推不出的符号,则FIRST()=(FIRST(X1)-)(FIRST(Xj)-)FIRST(Xj+1)3.若对所有i(1in),都有FIRST
17、(Xi),则FIRST()=FIRST(X1)FIRST(Xn)第33页/共101页FIRST(AB)=FIRST(A)FIRST(B)=a,b,FIRST(bC)=FIRST(b)=bFIRST()=FIRST(b)=bFIRST(AD)=(FIRST(A)-)FIRST(D)=b,a,cFIRST(aS)=FIRST(a)=a例GS SAB|bCAb|BaD|CAD|bDaS|c已求出非终结符的First集合如下:First(S)=a,b,First(A)=b,First(B)=a,First(C)=a,b,cFirst(D)=a,c产生式右部符号串的开始符集合为:SABSbCAAbCAD
18、DaS第34页/共101页要判别一个上下文无关文法是否是LL(1)文法分为五步:1.求能推出的非终结符集T2.计算每个产生式右部的FIRST()集3.计算每个非终结符A的FOLLOW(A)集4.计算每个产生式A的SELECT(A)集5.按LL(1)文法的定义判别第35页/共101页要判别一个上下文无关文法是否是LL(1)文法分为五步:1.求能推出的非终结符集T2.计算每个产生式右部的FIRST()集3.计算每个非终结符A的FOLLOW(A)集4.计算每个产生式A的SELECT(A)集5.按LL(1)文法的定义判别第36页/共101页3计算每个非终结符A的FOLLOW(A)集1.对所有AVN,令
19、Follow(A)=(对开始符S,令Follow(S)=#)因为S=*S,显然#FOLLOW(S)2.对每条产生式BxAy,考察产生式右部的每一非终结符A,x,y V*,若y *,则Follow(A)=Follow(A)First(y)否则 Follow(A)=Follow(A)(First(y)-)Follow(B)3.重复2,直至对所有AVN,Follow(A)收敛为止若aFOLLOW(B),则表明S=*Ba,由于BxAy,且y=*,则有S=*Ba=xAya=xAa,即S=*xAa,所以aFOLLOW(A)第37页/共101页例GS:1SAB2SbC3Ab4A5BaD6B7CAD8Cb9D
20、aS10Dc已求出非终结符的First集合如下:First(S)=a,b,First(A)=b,First(B)=a,First(C)=a,b,cFirst(D)=a,c#D#C#Ba#A#a#c#SFollow集(2)Follow集(1)Follow集(0)c敛敛敛敛敛结论:Follow(S)=#Follow(A)=a,c,#Follow(B)=#Follow(C)=#Follow(D)=#第38页/共101页4计算每个产生式A的SELECT(A)集按定义计算SELECT(A):若右部串*,则SELECT(A)=FIRST()若右部串=*,则SELECT(A)=(FIRST()-)FOLLO
21、W(A)第39页/共101页SELECT(SAB)SELECT(SbC)SELECT(A)SELECT(Ab)SELECT(BaD)SELECT(B)SELECT(CAD)SELECT(Cb)SELECT(DaS)SELECT(Dc)例GS:SAB|bCAb|BaD|CAD|bDaS|c=*否?否?Follow集集S是是#A是是 a,c,#B是是#C否否#D否否#SELECT(SAB)=(FIRST(AB)-)FOLLOW(S)=b,a,#SELECT(SbC)=FIRST(bC)=bSELECT(A)=(FIRST()-)FOLLOW(A)=a,c,#SELECT(Ab)=FIRST(b)=
22、bSELECT(BaD)=FIRST(aD)=aSELECT(B)=(FIRST()-)FOLLOW(B)=#SELECT(CAD)=FIRST(AD)=b,a,cSELECT(Cb)=FIRST(b)=bSELECT(DaS)=FIRST(aS)=aSELECT(Dc)=FIRST(c)=cFIRST(AB)=a,b,FIRST(bC)=bFIRST()=FIRST(b)=bFIRST(aD)=aFIRST(AD)=b,a,cFIRST(aS)=a第40页/共101页5.按LL(1)文法的定义判别产生式的select集如下:SELECT(SAB)=b,a,#SELECT(SbC)=bSELE
23、CT(A)=a,c,#SELECT(Ab)=bSELECT(B)=#SELECT(BaD)=aSELECT(CAD)=b,a,cSELECT(Cb)=bSELECT(DaS)=aSELECT(Dc)=c由于SELECT(SAB)SELECT(SbC)=bSELECT(CAD)SELECT(Cb)=b所以文法GS不是LL(1)文法对每个非终结符A的任两个产生式A与A,满足SELECT(A)SELECT(A)=第41页/共101页要判别一个上下文无关文法是否是LL(1)文法分为五步:1.求能推出的非终结符集T2.计算每个产生式右部的FIRST()集3.计算每个非终结符A的FOLLOW(A)集4.计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 向下 语法分析 方法
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内