您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 编译原理-自顶向下语法分析方法
第四章自顶向下语法分析方法学习目标:掌握:LL(1)文法的判别,预测分析法,递归子程序的构造方法理解:LL(1)文法了解:不确定的自顶向下分析语法分析的作用是识别由词法分析给出的单词序列是否是给定文法的正确句子语法分析自顶向下分析自底向上分析确定的不确定的算法优先分析(第六章)LR分析(第五章)自顶向下基本思想:从文法的开始符出发企图推导出与输入的单词串完全相匹配的句子.分类:回顾——自上而下的分析方法定义:从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。语法树的构造:将文法的开始符号作为语法树的根,向下逐步建立语法树,使语法树的末端结点符号串正好是输入符号串。自上而下分析的主要问题选定产生式例文法G:S→cAdA→abA→a识别输入串w=cabd是否为该文法的句子ScAdab=cabdS=cAd回顾——自上而下的分析方法ScAda成功不成功=cadS=cAd4.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→α)的定义5LL(1)文法的定义1.确定分析的条件从文法的开始符出发,如能根据当前的输入符号(单词符号)唯一地确定选用哪个产生式进行推导,则分析是确定的。例1设有文法G1[S]:S→pA|qBA→cAd|aB→dB|b若输入串W=pccadd。自顶向下的推导过程为:SSApcAdcAda=pA=pcAd=pccAdd=pccaddG1[S]有如下特点:(1)每个产生式的右部由终结符开头;(2)同一非终结符的不同产生式的右部由不同的终结符开头。对于这种文法,在推导过程可以根据当前的输入符号唯一确定选哪个产生式往下推导,即分析过程是确定的。例2:设有文法G2[S]为:S→Ap|BqA→a|cAB→b|dBpAScAcAa=ccapS=cAp=ccAp=Ap该例说明,当(1)产生式右部以终结符或非终结符开头(无空产生式);(2)同一非终结符的不同产生式的右部由不同的符号开头。若输入串W=ccap,自顶向下的推导过程为:对于这种文法,在推导过程选用哪个产生式不直观,关键是判断产生式右部推出的开始符号(集),分析过程可能是确定的例3:设有文法G3[S]S→aA|dA→bAS|ε若输入串W=abd,自顶向下的推导过程为:AaSbSAεd=abdS=abAS=abS文法的特点——包含空产生式=aA对于空产生式左部的非终结符,关键是判断该非终结符的后跟符号(集),分析过程可能是确定的。要进行确定的自顶向下的分析,文法要满足一定的限制——即文法是LL(1)文法先研究三个定义开始符号集FIRST后跟符号集FOLLOW选择集合SELECT2.开始符号集FIRST()的定义定义:设G=(VN,VT,P,S)是上下文无关文法,α→β(α∈VN,(VNVT)*)FIRST()={a|aVT且*a......}(若*ε则规定ε∈FIRST())直观上说文法符号串的开始符号集是由推导出的所有的终结符开头和可能的ε组成。例文法G2[S]:S→ApS→BqA→aA→cAB→bB→dBFIRST(Ap)={a,c}FIRST(Bq)={b,d}FIRST(a)={a}FIRST(cA)={c}FIRST(b)={b}FIRST(dB)={d}结论一针对无空产生式的文法G,同一非终结符的任两个产生式的右部串的First集无交集,即可进行确定的自顶向下分析。3.后跟符号集FOLLOW(A)的定义定义设G=(VT,VN,P,S)是上下文无关文法,B→xAy(A,B∈VNx,y∈(VNVT)*)FOLLOW(A)={a|S=*…Aa…,a∈VT},若有S=*…A,则规定#∈FOLLOW(A)(注:#输入串#,‘#’做为输入串的结束符)直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那些终结符(包括#)组成。[例]文法G3[S]:S→aA|dA→bAS|ε由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)…=*abAd得d∈FOLLOW(A)FOLLOW(A)={#,a,d}FOLLOW(A)FOLLOW(S)解释当A面对应输入符a,在自顶向下的分析中应选择这样的产生式A→i(i可导出空串)进行推导:若a∈First(i),则A→i可选因i可能导出空串,A自动获得匹配,输入符a有可能与A后的一个符号匹配,故当a∈Follow(A)时,产生式A→i亦可选结论一针对无空产生式的文法G,同一非终结符的任两个产生式的右部串的First集无交集,即可进行确定的自顶向下分析。结论二[例]文法G3[S]:S→aA|dA→bAS|ε{S→aA}={S→d}={A→bAS}={A→ε}=First(aA)={a}First(d)={d}First(bAS)={b}First(ε)+Follow(A)={ε}+{#,a,d}={ε,#,a,d}={#,a,d}回顾——开始符号集FIRST()的定义定义:设G=(VN,VT,P,S)是上下文无关文法,A→β(A∈VN,(VNVT)*)FIRST()={a|aVT且*a......}(若*ε,则规定ε∈FIRST())直观上说文法符号串的开始符号集是由推导出的所有的终结符开头和可能的ε组成。回顾——后跟符号集FOLLOW(A)的定义定义设G=(VT,VN,P,S)是上下文无关文法,B→xAy(A,B∈VNx,y∈(VNVT)*)FOLLOW(A)={a|S=*…Aa…,a∈VT},若有S=*…A,则规定#∈FOLLOW(A)(注:#输入串#,‘#’做为输入串的结束符)直观上说,非终结符A的后跟符号集是由句型中紧跟A后的那些终结符(包括#)组成。4.选择集合SELECT(A→)的定义定义对给定的上下文无关文法的产生式A→(A∈VN,∈V*)若≠*ε,则SELECT(A→)=FIRST()若=*ε,则SELECT(A→)=(FIRST()-{ε})∪FOLLOW(A)解释A的产生式A→1|2|3|…(A面对应输入符a)在自顶向下的分析中:对于A→i且i≠*ε,若a∈First(i),则A→i可选对于A→j且j=*ε,若a∈(First(j)-{ε})∪Follow(A),则A→j可选[例]G3[S]:S→aAS→dA→bASA→εSELECT(S→aA)=FIRST(aA)={a}SELECT(S→d)=FIRST(d)={d}SELECT(A→bAS)=FIRST(bAS)={b}SELECT(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)文法的含义是:第一个L——从左到右扫描输入串第二个L——分析过程用最左推导(1)——表明只需向前看1个输入符号便可以决定选哪个产生式进行推导(类似地,LL(k)文法则需要向前看k个输入符号才可以确定选用哪个产生式)例有文法G[S]为:S→aASS→bA→bAA→εSELECT(S→aAS)={a}SELECT(S→b)={b}SELECT(A→bA)={b}SELECT(A→ε)={a,b}由于SELECT(A→bA)∩SELECT(A→ε)={b}≠Φ,所以文法G[S]不是LL(1)文法,当A遇输入符b时,不能确定选A→bA还是A→ε去推导。4.2LL(1)文法的判别要判别一个上下文无关文法是否是LL(1)文法分为五步:1.求能推出ε的非终结符集2.计算每个产生式右部β的FIRST(β)集3.计算每个非终结符A的FOLLOW(A)集4.计算每个产生式A→β的SELECT(A→β)集5.按LL(1)文法的定义判别1.求出能推出ε的非终结符集算法描述:用T表示能推出ε的非终结符集①令T={Aj|(Aj→ε)产生式集}②对于产生式Ap→A1....An若A1....AnT,则T=T{Ap}③重复②,直至T收敛(不再变化)为止例G[S]:S→AB|bCA→b|εB→aD|εC→AD|bD→aS|c{A,B,S}第一次{A,B}初值{A,B,S}收敛第二次非终结符集T能推出ε的非终结符集T为{A,B,S}2.计算每个产生式右部β的FIRST(β)集①对每个aVT:First(a)={a}②对每个AVN:若A*ε则当前First(A)={ε}否则当前First(A)={}③对每个产生式A→X1…Xj…Xn:First(A)=First(A)SectionFirst(X1…Xj…Xn)SectionFirst(X1…Xj…Xn)=(First(X1)-{ε})(First(X2)-{ε})…(First(Xj)-{ε})First(Xj+1)Xj+1是产生式右部中第一个不能推出ε的符号首先对文法符号X(XVTVN),求FIRST(X):③对每个产生式A→X1…Xj…Xn做:First(A)=First(A)SectionFirst(X1…Xj…Xn)其中SectionFirst(X1…Xj…Xn)=(First(X1)-{ε})(First(X2)-{ε})…(First(Xj)-{ε})First(Xj+1)Xj+1是产生式右部中第一个不能推出ε的符号若X1≠*ε则SectionFirst(X1…Xj…Xn)=First(X1)若X1…Xn全可推出ε则SectionFirst(X1…Xn)=(First(X1)-{ε})∪…∪(FIRST(Xn)-{ε})④重复3直到每个符号的FIRST集合都不再增大为止例G[S]:S→AB|bCA→b|εB→aD|εC→AD|bD→aS|cbaacbacεaεbεbaFirst集(3)baacbεaεbεbFirst集(2)baεεεFirst集(1)ABCDabSabεεεFirst集(0)已求出能推出ε的非终结符集T为{A,B,S}bbabacaac(敛)(敛)(敛)(敛)(敛)(敛)(敛)c(敛)ccccbaacbacεaεbεbaFirst集(3)baacbεaεbεbFirst集(2)baεεεFirst集(1)ABCDabSabεεεFirst集(0)bbabacaac(敛)(敛)(敛)(敛)(敛)(敛)(敛)c(敛)cccc结论:文法符号的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集设右部串β=X1X2…Xn1.当X1≠*ε,则FIRST(β)=FIRST(X1)2.若对任何j(1≤j<n)都有ε∈FIRST(Xj),Xj+1为X1X2…Xn中第一个推不出ε的符号,
本文标题:编译原理-自顶向下语法分析方法
链接地址:https://www.777doc.com/doc-7325468 .html