编译原理自顶向下语法分析方法.ppt
《编译原理自顶向下语法分析方法.ppt》由会员分享,可在线阅读,更多相关《编译原理自顶向下语法分析方法.ppt(101页珍藏版)》请在三一办公上搜索。
1、第四章 自顶向下语法分析方法,学习目标:掌握:LL(1)文法的判别,预测分析法,递归子程序的构造方法理解:LL(1)文法了解:不确定的自顶向下分析,语法分析的作用是识别由词法分析给出的单词序列是否是给定文法的正确句子,自顶向下基本思想:从文法的开始符出发企图推导出与输入的单词串完全相匹配的句子.,分类:,回顾自上而下的分析方法,定义:从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。语法树的构造:将文法的开始符号作为语法树的根,向下逐步建立语法树,使语法树的末端结点符号串正好是输入符号串。自上而下分析的主要问题 选定产生式,例 文法G:S cAd A ab A a识别输入
2、串w=cabd是否为该文法的句子,S,=cabd,S,=cAd,回顾自上而下的分析方法,S,成功,不成功,=cad,S,=cAd,4.1确定的自顶向下分析思想4.2LL(1)文法的判别4.3某些非LL(1)文法到LL(1)文法的等价变换4.4不确定的自顶向下分析思想4.5确定的自顶向下分析方法,本章内容,4.1 确定的自顶向下分析思想,1 确定分析的条件2 开始符号集FIRST()的定义3 后跟符号集FOLLOW(A)的定义4 选择集合SELECT(A)的定义5 LL(1)文法的定义,1.确定分析的条件,从文法的开始符出发,如能根据当前的输入符号(单词符号)唯一地确定选用哪个产生式进行推导,则
3、分析是确定的。,例1 设有文法G1S:SpA|qBAcAd|aBdB|b若输入串W=pccadd。自顶向下的推导过程为:,S,S,=pA,=pcAd,=pccAdd,=pccadd,G1S有如下特点:(1)每个产生式的右部由终结符开头;(2)同一非终结符的不同产生式的右部由不同的终结符开头。,对于这种文法,在推导过程可以根据当前的输入符号唯一确定选哪个产生式往下推导,即分析过程是确定的。,例2:设有文法G2S为:SAp|BqAa|cABb|dB,S,=ccap,S,=cAp,=ccAp,=Ap,该例说明,当(1)产生式右部以终结符或非终结符开头(无空产生式);(2)同一非终结符的不同产生式的右
4、部由不同的符号开头。,若输入串W=ccap,自顶向下的推导过程为:,对于这种文法,在推导过程选用哪个产生式不直观,关键是判断产生式右部推出的开始符号(集),分析过程可能是确定的,例3:设有文法G3SSaA|dAbAS|若输入串W=abd,自顶向下的推导过程为:,S,=abd,S,=abAS,=abS,文法的特点包含空产生式,=aA,对于空产生式左部的非终结符,关键是判断该非终结符的后跟符号(集),分析过程可能是确定的。,要进行确定的自顶向下的分析,文法要满足一定的限制即文法是LL(1)文法先研究三个定义开始符号集FIRST后跟符号集FOLLOW选择集合SELECT,2.开始符号集FIRST()
5、的定义,定义:设G=(VN,VT,P,S)是上下文无关文法,(VN,(VNVT)*)FIRST()=a|a VT 且*a.(若*则规定 FIRST())直观上说文法符号串 的开始符号集是由推导出的所有的终结符开头和可能的组成。,例文法G2S:,SApSBqAaAcABbBdB,FIRST(Ap)=a,cFIRST(Bq)=b,dFIRST(a)=a FIRST(cA)=cFIRST(b)=bFIRST(dB)=d,结论一 针对无空产生式的文法G,同一非终结符的任两个产生式的右部串的First集无交集,即可进行确定的自顶向下分析。,3.后跟符号集FOLLOW(A)的定义,定义 设G=(VT,VN
6、,P,S)是上下文无关文法,BxAy(A,B VN x,y(VNVT)*)FOLLOW(A)=a|S=*Aa,a VT,若有S=*A,则规定#FOLLOW(A)(注:#输入串#,#做为输入串的结束符)直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那些终结符(包括#)组成。,例 文法G3S:SaA|d AbAS|,由 S=*S 得#FOLLOW(S)由S=aA=abAS=abbASS=abbASaA 得 a FOLLOW(S)=abbASd 得 d FOLLOW(S)FOLLOW(S)=#,a,d,由S=*aA 得#FOLLOW(A)由S=*abAS=*abAaA 得 a FOLLOW(A
7、)=*abAd 得 d FOLLOW(A)FOLLOW(A)=#,a,d,FOLLOW(A),FOLLOW(S),解释当A面对应输入符a,在自顶向下的分析中应选择这样的产生式Ai(i可导出空串)进行推导:若a First(i),则 Ai 可选因 i 可能导出空串,A自动获得匹配,输入符a有可能与A 后的一个符号匹配,故当 a Follow(A)时,产生式A i 亦可选,结论一 针对无空产生式的文法G,同一非终结符的任两个产生式的右部串的First集无交集,即可进行确定的自顶向下分析。,结论二,例 文法G3S:SaA|d AbAS|,SaA=,Sd=,AbAS=,A=,First(aA)=a,F
8、irst(d)=d,First(bAS)=b,First()+Follow(A)=+#,a,d=,#,a,d,=#,a,d,回顾开始符号集FIRST()的定义,定义:设G=(VN,VT,P,S)是上下文无关文法,A(AVN,(VNVT)*)FIRST()=a|a VT 且*a.(若*,则规定FIRST())直观上说文法符号串 的开始符号集是由推导出的所有的终结符开头和可能的组成。,回顾后跟符号集FOLLOW(A)的定义,定义 设G=(VT,VN,P,S)是上下文无关文法,BxAy(A,B VN x,y(VNVT)*)FOLLOW(A)=a|S=*Aa,a VT,若有S=*A,则规定#FOLLO
9、W(A)(注:#输入串#,#做为输入串的结束符)直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那些终结符(包括#)组成。,4.选择集合SELECT(A)的定义,定义对给定的上下文无关文法的产生式 A(AVN,V*)若*,则SELECT(A)=FIRST()若=*,则SELECT(A)=(FIRST()-)FOLLOW(A),解释 A的产生式A1|2|3|(A面对应输入符a)在自顶向下的分析中:对于A i且 i*,若a First(i),则Ai可选对于A j且 j=*,若a(First(j)-)Follow(A),则A j可选,例 G3S:SaA Sd AbAS A,SELECT(SaA)
10、=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),结论三同一非终结符的不同产生式A与A,若SELECT(A)SELECT(A)=,则一定可以进行确定的自顶向下分析,5.LL(1)文法的定义,定义:上下文无关文法为LL(1)文法的充分必要条件是,对每个非终结符A的两个不同产生式A与A,满足SELECT(A)SELECT(A)=LL(1)文法的含义是
11、:第一个L从左到右扫描输入串第二个L分析过程用最左推导(1)表明只需向前看 1 个输入符号便可以决定选哪个产生式进行推导(类似地,LL(k)文法则需要向前看 k 个输入符号才可以确定选用哪个产生式),例 有文法GS为:SaAS SbAbAA,SELECT(SaAS)=aSELECT(Sb)=bSELECT(AbA)=bSELECT(A)=a,b,由于SELECT(AbA)SELECT(A)=b,所以文法GS不是LL(1)文法,当A遇输入符b时,不能确定选AbA还是A去推导。,4.2 LL(1)文法的判别,要判别一个上下文无关文法是否是LL(1)文法分为五步:1.求能推出的非终结符集 2.计算每
12、个产生式右部的FIRST()集 3.计算每个非终结符A的FOLLOW(A)集 4.计算每个产生式A的SELECT(A)集 5.按LL(1)文法的定义判别,1.求出能推出的非终结符集,算法描述:用T表示能推出的非终结符集令T=Aj|(Aj)产生式集对于产生式ApA1.An 若A1.AnT,则 T=T Ap 重复,直至T 收敛(不再变化)为止,例GS:SAB|bCAb|BaD|CAD|b DaS|c,非终结符集T,能推出的非终结符集T为A,B,S,2.计算每个产生式右部的FIRST()集,对每个a VT:First(a)=a 对每个AVN:若 A*则 当前First(A)=否则 当前First(A
13、)=对每个产生式 AX1XjXn:First(A)=First(A)SectionFirst(X1XjXn)SectionFirst(X1XjXn)=(First(X1)-)(First(X2)-)(First(Xj)-)First(Xj+1)Xj+1是产生式右部中第一个不能推出的符号,首先对文法符号X(XVT VN),求FIRST(X):,对每个产生式 AX1XjXn 做:First(A)=First(A)SectionFirst(X1XjXn)其中 SectionFirst(X1XjXn)=(First(X1)-)(First(X2)-)(First(Xj)-)First(Xj+1)Xj+
14、1是产生式右部中第一个不能推出的符号若X1*则SectionFirst(X1XjXn)=First(X1)若X1Xn全可推出 则SectionFirst(X1Xn)=(First(X1)-)(FIRST(Xn)-)重复3直到每个符号的FIRST集合都不再增大为止,例GS:SAB|bC Ab|BaD|CAD|b DaS|c,First集(3),First集(2),First集(1),A,B,C,D,a,b,S,First集(0),已求出能推出的非终结符集T为A,B,S,b,b,a,b,a c,a,a c,(敛),(敛),(敛),(敛),(敛),(敛),(敛),c,(敛),c,c,c,c,结论:文
15、法符号的First集合如下:First(S)=a,b,First(A)=b,First(B)=a,First(C)=a,b,c First(D)=a,c First(a)=a First(b)=b First(c)=c,利用求出每个文法符号的FIRST集求符号串的FIRST集,设右部串=X1X2Xn当X1*,则FIRST()=FIRST(X1)若对任何j(1jn)都有FIRST(Xj),Xj+1为X1X2Xn中第一个推不出的符号,则 FIRST()=(FIRST(X1)-)(FIRST(Xj)-)FIRST(Xj+1)若对所有i(1in),都有FIRST(Xi),则 FIRST()=FIRST
16、(X1)FIRST(Xn),FIRST(AB)=FIRST(A)FIRST(B)=a,b,FIRST(bC)=FIRST(b)=b FIRST()=FIRST(b)=b FIRST(AD)=(FIRST(A)-)FIRST(D)=b,a,c FIRST(aS)=FIRST(a)=a,例GSSAB|bC Ab|BaD|CAD|b DaS|c,已求出非终结符的First集合如下:First(S)=a,b,First(A)=b,First(B)=a,First(C)=a,b,cFirst(D)=a,c,产生式右部符号串的开始符集合为:SABSbCAAbCADDaS,要判别一个上下文无关文法是否是LL
17、(1)文法分为五步:1.求能推出的非终结符集T 2.计算每个产生式右部的FIRST()集 3.计算每个非终结符A的FOLLOW(A)集 4.计算每个产生式A的SELECT(A)集 5.按LL(1)文法的定义判别,要判别一个上下文无关文法是否是LL(1)文法分为五步:1.求能推出的非终结符集T 2.计算每个产生式右部的FIRST()集 3.计算每个非终结符A的FOLLOW(A)集 4.计算每个产生式A的SELECT(A)集 5.按LL(1)文法的定义判别,3计算每个非终结符A的FOLLOW(A)集,1.对所有AVN,令Follow(A)=(对开始符S,令Follow(S)=#),因为S=*S,显
18、然#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),例GS:1SAB2SbC3Ab4A5BaD6B7CAD8Cb9DaS10Dc,已求出 非终结符的First集合如下:First(S)=a,b,First
19、(A)=b,First(B)=a,First(C)=a,b,cFirst(D)=a,c,#,D,#,C,#,B,a#,A,#,#,S,Follow集(2),Follow集(1),Follow集(0),c,敛,敛,敛,敛,敛,结论:Follow(S)=#Follow(A)=a,c,#Follow(B)=#Follow(C)=#Follow(D)=#,4计算每个产生式A的SELECT(A)集,按定义计算SELECT(A):若右部串*,则SELECT(A)=FIRST()若右部串=*,则SELECT(A)=(FIRST()-)FOLLOW(A),SELECT(SAB)SELECT(SbC)SELEC
20、T(A)SELECT(Ab)SELECT(BaD)SELECT(B)SELECT(CAD)SELECT(Cb)SELECT(DaS)SELECT(Dc),例GS:SAB|bC Ab|BaD|CAD|b DaS|c,SELECT(SAB)=(FIRST(AB)-)FOLLOW(S)=b,a,#SELECT(SbC)=FIRST(bC)=bSELECT(A)=(FIRST()-)FOLLOW(A)=a,c,#SELECT(Ab)=FIRST(b)=bSELECT(BaD)=FIRST(aD)=aSELECT(B)=(FIRST()-)FOLLOW(B)=#SELECT(CAD)=FIRST(AD)
21、=b,a,cSELECT(Cb)=FIRST(b)=bSELECT(DaS)=FIRST(aS)=aSELECT(Dc)=FIRST(c)=c,FIRST(AB)=a,b,FIRST(bC)=bFIRST()=FIRST(b)=bFIRST(aD)=aFIRST(AD)=b,a,cFIRST(aS)=a,5.按LL(1)文法的定义判别,产生式的select集如下:SELECT(SAB)=b,a,#SELECT(SbC)=bSELECT(A)=a,c,#SELECT(Ab)=bSELECT(B)=#SELECT(BaD)=aSELECT(CAD)=b,a,c SELECT(Cb)=bSELECT
22、(DaS)=a SELECT(Dc)=c,由于SELECT(SAB)SELECT(SbC)=b SELECT(CAD)SELECT(Cb)=b所以文法GS不是LL(1)文法,对每个非终结符A的任两个产生式A与A,满足SELECT(A)SELECT(A)=,要判别一个上下文无关文法是否是LL(1)文法分为五步:1.求能推出的非终结符集T 2.计算每个产生式右部的FIRST()集 3.计算每个非终结符A的FOLLOW(A)集 4.计算每个产生式A的SELECT(A)集 5.按LL(1)文法的定义判别,go,由每个产生式的select集构造LL(1)分析表,例GS:SAB|bC Ab|BaD|CAD
23、|b DaS|c 试判断该文法是否为LL(1)文法?,back,非终结符集T,能推出的非终结符集T为A,B,S,1.求能推出的非终结符集T,back,2.计算每个产生式右部的FIRST()集,FIRST(AB)=FIRST(A)FIRST(B)=a,b,FIRST(bC)=bFIRST()=FIRST(b)=bFIRST(AD)=(FIRST(A)-)FIRST(D)=b,a,cFIRST(aS)=aFIRST(aD)=a,back,3.计算每个非终结符A的FOLLOW(A)集,back,4.计算每个产生式A 的SELECT(A)集,back,SELECT(SAB)=(FIRST(AB)-)F
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 向下 语法分析 方法

链接地址:https://www.31ppt.com/p-5812684.html