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