第5部分自顶向下语法分析方法.ppt

上传人:本田雅阁 文档编号:2578072 上传时间:2019-04-11 格式:PPT 页数:51 大小:352.01KB
返回 下载 相关 举报
第5部分自顶向下语法分析方法.ppt_第1页
第1页 / 共51页
第5部分自顶向下语法分析方法.ppt_第2页
第2页 / 共51页
第5部分自顶向下语法分析方法.ppt_第3页
第3页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第5部分自顶向下语法分析方法.ppt》由会员分享,可在线阅读,更多相关《第5部分自顶向下语法分析方法.ppt(51页珍藏版)》请在三一文库上搜索。

1、第5章 自顶向下语法分析方法,确定的自顶向下分析思想 LL(1)文法的判别 某些非LL(1)文法到LL(1)文法的等 价变换 不确定的自顶向下分析思想 确定的自顶向下分析方法,返回目录,确定的自顶向下分析思想,文法G1S: SpA SqB AcAd Aa BdB Bb,W=pccadd自顶向下的推导过程: S pA pcAd pccAdd pccadd,语法树:,S,p,A,S,p,A,c,A,d,S,p,A,c,A,d,c,A,d,S,p,A,c,A,d,c,A,d,a,这个文法的特点: 每个产生式的右部都由终结符号开始。 如果两个产生式有相同的左部,那么它们的右部由不同的终结符开始。,文法

2、G1S: SpA SqB AcAd Aa BdB Bb,文法G2S: SAp SBq Aa AcA Bb BdB,W=ccap自顶向下的推导过程: S Ap cAp ccAp ccap,语法树:,S,A,p,S,A,p,c,A,S,A,p,c,A,c,A,S,A,p,c,A,c,A,a,这个文法的特点: 每个产生式的右部不全是由终结符号开始。 如果两个产生式有相同的左部,那么它们的右部由不同的终结符或非终结符开始。 文法中无空产生式。,文法G1S: SAp SBq Aa AcA Bb BdB,定义: 设 G = (VT ,VN , S , P) 是上下文无关文法, FIRST() = a| a

3、,a VT, V+, V*, 若 ,则规定FIRST(),* ,* ,调用返回,FIRST(Ap)=a,c FIRST(Bq)=b,d,文法G2S: SAp SBq Aa AcA Bb BdB,文法G3S: SaA Sd AbAS A,W=abd试图推导的过程: S aA abAS abS abd,定义:设 G = (VT ,VN , S , P) 是上下文无关文法,AVN , S是开始符号。 FOLLOW(A) = a|S A且aFRIST(), VT*,V+ 若S A,且 ,则规定 #FOLLOW(A) 即:FOLLOW(A)=a|S Aa ,aVT 若S A,则规定 #FOLLOW(A)

4、 #作为输入串的结束符,或称为句子括号,如: #输入串#,* ,* ,* ,* ,* ,调用返回,对A,A其中AVN , , VN*,当和不同时推导出空时(设 不推导出空,推导出空),则当FIRST()(FIRST()FOLLOW(A)=时,对于非终结符A的替换仍可唯一地确定候选。,定义:给定上下文无关文法的产生式A,AVN , V*, 若 ,则SELECT(A)=FIRST() 如果 ,则SELECT(A)=FIRST()FOLLOW(A),* ,调用返回,定义:一个上下文无关文法是LL(1)文法的充要条件是: 对每个非终结符A的两个不同产生式A和A,满足 SELECT(A)SELECT(A

5、)= 其中,不同时能 。,* ,LL(1)文法的含义:,第一个L表示:自顶向下分析是从左向右扫描输入串。 第二个L表示:分析过程中将用最左推导。 1表示:只需向右看一个符号便可决定如何推导(即选择哪个产生式进行推导)。 类似也可以有LL(K)文法:需向前查看K个符号才可确定选用哪个产生式。,文法GS是否是LL(1)文法: SaA Sd AbAS A,SELECT(SaA) =a SELECT(Sd) =d SELECT(AbAS) =b SELECT(A) =a,d,#,SELECT(SaA) SELECT(Sd)=ad= SELECT(AbAS)SELECT(A)=ba,d,#, =,所以该

6、文法是LL(1)文法。,设文法GS 为: SaAS Sb AbA A,SELECT(SaAS) =a SELECT(Sb) =b SELECT(AbA) =b SELECT(A) =a,b,SELECT(SaAS) SELECT(Sb)=ab= SELECT(AbA)SELECT(A)=ba,b,所以该文法不是LL(1)文法。,GS: SaAS Sb AbA A,对输入串W=ab进行推导: S aAS abAS abS 出错 S aAS aS ab,LL(1)文法的判别,求出能推出的非终结符 计算FIRST集 计算FOLLOW集 计算SELECT集 判别是否是LL(1)文法,例:设文法GS 为

7、: SAB SbC A Ab B BaD CAD Cb DaS Dc 判断它是否是LL(1)文法。,1.求出能推出的非终结符,SAB SbC A Ab B BaD CAD Cb DaS Dc,2.计算FIRST集,1.若XV,则FIRST(X)=X 2.若XVN,且有产生式Xa,则aFIRST(X); 若X也是一条产生式,则FIRST(X). 3.若XY是一个产生式且YVN,则把FIRST(Y)中的所有非元素都加到FIRST(X)中;若X Y1Y2YK 是一个产生式,Y1,Y2,Y(i-1)都是非终结符,而且,对于任何j,1j i-1,FIRST(Yj)都含有(即Y1Y(i-1) ),则把FI

8、RST(Yj)中的所有非元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj , j=1,2,K)均含有,则把加到FRIST(X)中.,* ,SAB SbC A Ab B BaD CAD Cb DaS Dc,FIRST(S)=(FIRST(A)-)FIRST(B)-)b=a,b, FIRST(A)=b, FIRST(B)=a, FIRST(C)=a,b,c FIRST(D)=a,c,FIRST(AB)=a,b, FIRST(AD)=a,b,c,3.计算FOLLOW集,1.对于文法的开始符号S,置#于FOLLOW(S)。; 2.若B是一个产生式,则把 FIRST()加至FOLLOW(B

9、)中; 3.若B是一个产生式,或B是 一个产生式而 (即FIRST()),则把FOLLOW(A),加至FOLLOW(B)中,* ,SAB SbC A Ab B BaD CAD Cb DaS Dc,FOLLOW(S)=#FOLLOW(D) FOLLOW(A)=aa,cFOLLOW(S) FOLLOW(B)=FOLLOW(S) FOLLOW(C)=FOLLOW(S) FOLLOW(D)=FOLLOW(B)FOLLOW(C),FOLLOW(S)= # FOLLOW(A)= a,c,# FOLLOW(B)= # FOLLOW(C)= # FOLLOW(D)= #,4.计算SELECT集,SAB SbC

10、 A Ab B BaD CAD Cb DaS Dc,FIRST(S)=a,b, FIRST(A)=b, FIRST(B)=a, FIRST(C)=a,b,c FIRST(D)=a,c FIRST(AB)=a,b, FIRST(AD)=a,b,c,SELECT(SAB)=a,b,# SELECT(SbC)=b SELECT(A)=a,c,#, SELECT(Ab)=b SELECT(B)=#, SELECT(BaD)=a SELECT(CAD)=a,b,c SELECT(Cb)=b SELECT(DaS)=a SELECT(Dc)=c,FOLLOW(S)= # FOLLOW(A)= a,c,#

11、FOLLOW(B)= # FOLLOW(C)= # FOLLOW(D)= #,该文法不是LL(1)文法。,某些非LL(1)文法到LL(1)文法的等价变换,提取左公共因子 消除左递归,提取左公共因子,A|导致SELECT(A) SELECT(A),因此非LL(1)文法。 等价变换为A(|),然后: AA A | A1|2|n 变换为A(1|2|n) ,然后: AA A 1|2|n,例:文法G1S 为: SaSb SaS S,化为: SaS(b|) S,进一步化为: SaSA Ab A S,结果仍然不是LL(1)文法。 因此,文法中不含左公共因子只是LL(1)文法的必要条件。,w=aabb S=a

12、SA =aaSAA =aaAA =aabA (aaA),例:文法G2为: Aad ABc BaA BbB,1.化为: Aad AaAc AbBc BaA BbB,2.化为: Aa(d|Ac) AbBc BaA BbB,3.化为: AaA AbBc Ad AAc BaA BbB,结果是LL(1)文法。,例:文法G3S 为: SaSd SAc AaS Ab,1.化为: SaSd SaSc Sbc AaS Ab,2.化为: SaS(d|c) Sbc AaS Ab,3.化为: SaSA Sbc Ad Ac AaS Ab,结果中A是不可达到的符号。,例:文法G4S 为: SAp|Bq AaAp|d Ba

13、Bq|e,1.化为: SaApp|aBqq|dq|eq AaAp|d BaBq|e,2.化为: Sa(App|Bqq) Sdq|eq AaAp|d BaBq|e,3.化为: SaS Sdq|eq SApp|Bqq AaAp|d BaBq|e,4.化为: SaS Sdq|eq S aAppp|aBqqq|dpp|eqq AaAp|d BaBq|e,利用提取左公共因子无法在有限步骤内替换成无左公共因子的文法。,结论,不一定每个文法的左公共因子都能在有限的步骤内替换成无左公共因子的文法。 一个文法提取了左公共因子后,只解决了相同左部产生式右部的FIRST集不相交问题,当改写后的文法不含空产生式,且无

14、左递归时,则改写后的文法是LL(1)文法,否则还需用LL(1)文法的判别方式进行判断才能确定是否为LL(1)文法。,消除左递归,直接左递归: AA AVN, V* 间接左递归: AB BA A,BVN, , V*,文法G5含有直接左递归: SSa Sb 所能产生的语言L=ban|n0 输入串baaaa#是该语言的句子,但如何用自顶向下分析呢?,文法G6含有间接左递归: AaB ABb BAc Bd 输入串adbcbcbc# AaBad AaBaAcaBbcaAcbc,消除直接左递归,把直接左递归改写为右递归。 如G5: SSa Sb (L=ban|n0) 改为: SbS SaS|,消除直接左递

15、归的一般方法: AA1| A2| Am|1|2|n 其中: i 不等于 , j不以A开头。 改为: A 1A| 2A | nA A 1A | 2A | mA |,消除间接左递归,将间接左递归变为直接左递归,然后消除直接左递归。如文法G6含有间接左递归: AaB ABb BAc Bd,BaBc BBbc Bd,BaBcB | dB BbcB| ,消除文法中一切左递归的算法,1.无回路(A(A (A) 2.无空产生式 (1) 以某种顺序将文法非终结符排列A1 ,A2 An (2) for i:=1 to n do begin for j:=1 to i-1 do 用Ai1| 2r| k r替代 形

16、如Ai Ajr的规则,其中 Aj 1| 2| k是关于Aj的全部产生式; 消除Ai规则的直接左递归; end; (3)化简由2得到的文法,+ ,例:,文法G: SQc|c QRb|b RSa|a,R Qca|ca|a,R Rbca|bca|ca|a,R (bca|ca|a)R,R bcaR|,不确定的自顶向下分析思想,1.由于相同左部的产生式的右部FIRST集交集不为空引起回溯。 设文法GS 为: SxAy Aab|a,w=xay,S,x A y,S,x A y,a b,S,x A y,a,试探,回溯,试探,2.由于相同左部非终结符的右部能 且该非终结符FOLLOW集中含有其右部FIRST集的

17、元素。 设文法GS 为: SaAS Sb AbAS A,* ,w=ab#,S,a A S,S,a A S,b A S,S,a A S,b,试探 再试探,回溯,3.由于文法含有左递归而引起回溯。 设文法GS 为: SSa Sb,w=baa#,S,b,S,S a,S,S a,b,S,S a,S a,S,S a,S a,b,确定的自顶向下分析方法,1.递归子程序法 实现思想:对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选时能够按LL(1)形式可唯一地确定选择某个候选进行推导。 限制:对文法要求高,必须满足LL(1)文法;由于递归调用多,

18、速度慢,占用空间多。,2.预测分析法,预测分析器: 预测分析程序(P.88) 先进后出栈 预测分析表,预测分析表的构造,表达式文法: E E+T | T T T*F | F F i | ( E ),构造过程,1.判断文法是否为LL(1)文法 消除左递归:,E E+T | T T T*F | F F i | ( E ),E TE E +TE | T FT T *FT | F i | ( E ),可推出 的非终结符表:,E TE E +TE | T FT T *FT | F i | ( E ),各非终结符的FIRST集和FOLLOW集:,FIRST(E)= ( , i FIRST(E)= + ,

19、FIRST(T)= ( , i FIRST(T)= * , FIRST(F)= ( , i FOLLOW(E)= ) , # FOLLOW(E)= ) , # FOLLOW(T)= + , ) , # FOLLOW(T)= + , ) , # FOLLOW(F)= * , + , ) , # ,E TE E +TE | T FT T *FT | F i | ( E ),查看FOLLOW定义,查看FIRST定义,各产生式的SELECT集:,E TE E +TE | T FT T *FT | F i | ( E ),SELECT(E TE) = ( , i SELECT(E +TE ) = + S

20、ELECT(E ) = , ) , # SELECT(T FT) = ( , i SELECT(T *FT ) = * SELECT(T ) = , + , ) , # SELECT(F ( E ) = ( SELECT(F i) = i ,FIRST(E)= ( , i FIRST(E)= + , FIRST(T)= ( , i FIRST(T)= * , FIRST(F)= ( , i ,FOLLOW(E)= ) , # FOLLOW(E)= ) , # FOLLOW(T)= + , ) , # FOLLOW(T)= + , ) , # FOLLOW(F)= * , + , ) , # ,

21、查看SELECT定义,是LL(1)文法。,2.构造预测分析表,SELECT(E TE) = ( , i SELECT(E +TE ) = + SELECT(E ) = , ) , # SELECT(T FT) = ( , i SELECT(T *FT ) = * SELECT(T ) = , + , ) , # SELECT(F ( E ) = ( SELECT(F i) = i ,运行:,分析栈 #E #ET #ETF #ETi #ET #E #ET+ #ET #ETF #ETi #ET #ETF* #ETF #ETi #ET #E #,剩余串 i+i*i# i+i*i# i+i*i# i+i*i# +i*i# +i*i# +i*i# i*i# i*i# i*i# *i# *i# i# i# # # #,产生式 ETE TFT F i i 匹配 T E +TE + 匹配 T FT F i i 匹配 T *FT * 匹配 F i i 匹配 T E 接受,例:输入 i+i*i,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1