语法分析-自顶向下分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 S::=aABbcd|ε A::=ASd|ε B::=SAh|eC|ε C::=Sf|Cg|ε 求此文法的每一个非终结符号的FIRST集。
解: FIRST(S)=FIRST(aABbcd)∪FIRST(ε) ={a}∪{ε}={a,ε} FIRST(A)=FIRST(ASd)∪FIRST(ε) ={a,d}∪{ε}={a,d,ε} FIRST(B)=FIRST(SAh)∪FIRST(eC) ∪FIRST(ε) ={a,d,h}∪{e}∪{ε}={a,d,h,e,ε} FIRST(C)=FIRST(Sf)∪FIRST(Cg) ∪FIRST(ε) ={a,f}∪{a,f,g}∪{ε}={a,f,g,ε}
4.1自顶向下的分析方法(P61)
开始符号 输入符号串
自顶向下的分析方法就是从文法的开始符号出发,按最左推导方式向下推导,试图推导出要分析的输入串。即:
开始符号 输入符号串
自底向上的分析方法从输入符号串开始,按最左归约方式向上归约到文法的开始符号。即:
+ 归约 ←
自底向上
文法符号的FIRST集合构造方法:
对于文法中的符号X∈V,其FIRST(X)集合可反复应用下列规则计算,直到其FIRST(X)集合不再增大为止: 若X为终结符,则将X加入FIRST(X)集合中。 若X为非终结符,且具有形如X→aα的产生式(a∈Vt),或具有形如X→ε的产生式,则把a或ε加进FIRST(X)。 设X为非终结符且有形如X→Y1Y2…Yk的产生式,若Y1∈Vn,则把FIRST(Y1)中的一切非ε符号加进FIRST(X);对于一切2≤i≤k,若Y1,Y2,…,Yi-1均为非终结符号,且ε∈FIRST(Yj),1≤j≤i-1,则将FIRST(Yi)中的一切非ε符号加进FIRST(X);但若对一切1≤i≤k,均有ε∈FIRST(Yi),则将ε符号加进FIRST(X)。
例 设文法G[S]: S::=SbA|aA A::=Bc B::=Sb 求此文法的每一个非终结符号的FOLLOW集。
解:1. 因为S为文法的开始符号,所以#∈FOLLOW(S); 由S::=SbA,有FIRST(bA)={b}∈FOLLOW(S); 由B::=Sb,有FIRST(b)={b}∈FOLLOW(S); 因此,FOLLOW(S)={b,#}。 2. 由S::=SbA或S::=aA,有FOLLOW(S)∈ FOLLOW(A)。因此,FOLLOW(A)={b,#}。 3. 由A::=Bc,有FIRST(c)={c}∈FOLLOW (B)。因此,FOLLOW(B)={c}。
练习 已知文法G[S]: S::=A A::=BA′ A′::=iBA′| ε B::=CB′ B′::=+CB′| ε C::=)A*|( 求FOLLOW(C)。
解: FOLLOW(C)=(FIRST(B′)-{ε}) ∪FOLLOW(B)∪FOLLOW(B′) ={+,i,*,#}
4.2 FIRST集合和FOLLOW集合
若G中有形如A→αBβ 的产生式,且β ≠ε,则将FIRST(β)中的一切非ε符号加进FOLLOW(B)。
对于文法的开始符号S,令#∈FOLLOW(S)
若G中有形如A→αB或A→αBβ 的产生式,且ε∈FIRST(β),则FOLLOW(A)中的全部元素均属于FOLLOW(B),即FOLLOW(A) FOLLOW(B) 。
自顶向下语法分析问题的解决方法
自顶向下语法分析问题的解决方法
02
方法1:采用扩充BNF范式
E::=E+T|E-T|T 可改成 E::=T{+T| -T} T::=T*F|T/F|F 可改成 T::=F{*F| /F}
方法2:引进新的非终结符号
E::=E+T|E-T|T 可改成 E::=TE′,E′::=+TE′|-TE′|ε T::=T*F|T/F|F 可改成 T::=FT′,T′::=*FT′|/FT′| ε
解:该文法的非终结符号有E、E′、T、T′和F。 FIRST(E)=FIRST(TE′) =FIRST(FT′E′)={ ( ,i } FIRST(+TE′)={ + } FIRST(ε)={ε} FIRST(E′)=FIRST(+TE′) ∪FIRST(ε)={+ ,ε} FIRST(T)=FIRST(FT′)={ ( ,i } FIRST(*FT′)={ * } FIRST(T′)=FIRST(*FT′) ∪FIRST(ε)={* ,ε} FIRST((E))={ ( } FIRST(i)={ i } FIRST(F) =FIRST((E)) ∪FIRST(i)={( ,i}
*
*
实际上,FIRST(α)就是从α可能推导出的所有开头终结符号或ε。
4.2 FIRST集合和FOLLOW集合(P62)
对于文法中的符号X∈V,其FIRST(X)集合可反复应用下列规则计算,直到其FIRST(X)集合不再增大为止: 若X∈Vt,则FIRST(X)={X}。 若X∈Vn,且具有形如X→aα的产生式(a∈Vt),或具有形如X→ε的产生式,则把a或ε加进FIRST(X)。 设G中有形如X→Y1Y2…Yk的产生式,若Y1∈Vn,则把FIRST(Y1)中的一切非ε符号加进FIRST(X);对于一切2≤i≤k,若Y1,Y2,…,Yi-1均为非终结符号,且ε∈FIRST(Yj),1≤j≤i-1,则将FIRST(Yi)中的一切非ε符号加进FIRST(X);但若对一切1≤i≤k,均有ε∈FIRST(Yi),则将ε符号加进FIRST(X)。
第四章 语法分析—自顶向下分析(P61)
自顶向下分析方法 FIRST集合和FOLLOW集合 递归下降分析 LL(1)分析方法
01
FIRST集合和FOLLOW集合的求法
单击此处添加正文
03
LL(1)文法及其分析表的构造方法
单击此处添加正文
02
递归子程序的构造方法
单击此处添加正文
学 习 重 点
(2)回溯问题
02
+ 回溯示例
(1)消除左递归 ①消除直接左递归 方法1:采用扩充BNF范式 设有文法产生式 U::=Ux|y 可改写为: U::=y{x} 方法2:引进新的非终结符号 设有文法产生式 U::= Ux1|Ux2|…|Uxm|y1|y2|…|yn 其中,yi(i=1,2,…,n)均不以符号U为首,引进一个新的非 终结符号U′, 将上述产生式等价变换为: U::= y1U′|y2U′|…|ynU′ U′::= x1U′|x2U′|…|xmU′|ε
输入串
开始符号
自上而下 SaASaAaaSbAaaSbbaaaabbaa
图示:自上而下分析与自底向上分析
FIRST集合定义: 假定α是文法G的任一符号串,则: FIRST(α)={a |α a…,a∈Vt} 若α ε, 则规定ε∈FIRST(α)。
文法符号的FIRST集合构造方法:
4.2 FIRST集合和FOLLOW集合
对于文法G的任一符号串α=X1X2…Xn可按下列步骤构造其FIRST(α)集合:
将FIRST(X1)中的一切非ε符号加进FIRST(α);
置FIRST(α)=φ;
若ε∈FIRST(X1),将FIRST(X2)中的一切非ε符号加进FIRST(α);若ε∈FIRST(X1)和FIRST(X2),将FIRST(X3)中的一切非ε符号加进FIRST(α);其余类推。
4.2 FIRST集合和FOLLOW集合
FOLLOW集合定义(P63): 假定S是文法的开始符号,对于G的任何非终结符号A,则: FOLLOW(A)={ a | S …Aa…, a∈Vt} 若S …A,则规定#∈FOLLOW(A)。
4.2 FIRST集合和FOLLOW集合
练习 S::=aAcB|Bd A::=AaB|c B::=bBcA|b|ε 求此文法的每一个非终结符号的FIRST集。
解: FIRST(S)=FIRST(aAcB)∪FIRST(Bd) ={a}∪{b,d} ={a,b,d} FIRST(A)=FIRST(AaB)∪FIRST(c) ={c}∪{c} ={c} FIRST(B)=FIRST(bBcA)∪FIRST(b) ∪FIRST(ε) ={b}∪{b}∪本符号组成程序中各个语法成分(包括程序)的一组规则。
语法分析与词法分析的区别: 语法分析和词法分析都是对输入符号串的识别,但词法分析的输入符号串是一个单词,而语法分析的输入符号串是一个句子或者说是一个程序。
语法分析任务:检查源程序语法上是否正确,并生成相应的内部表示(如分析树)供下一阶段使用。
*
*
从定义可看出,FOLLOW(A)就是在所有句型中出现在紧接A之后的终结符号或#。注意:在FOLLOW集合中无ε。
4.2 FIRST集合和FOLLOW集合
4.2 FIRST集合和FOLLOW集合
对于文法中的符号A∈Vn,其FOLLOW(A)集合可反复应用下列规则计算,直到其FOLLOW(A)集合不再增大为止:
例 对于C程序语句“if (a<10) b=5;”,词法分析识别出了if、(、a、…等单词符号,而语法分析则要检查这些单词之间的搭配、结构是否正确,例如if后面是否为(,(后面是否为正确的表达式等等。
第四章 语法分析—自顶向下分析
第四章 语法分析—自顶向下分析


回溯示例

语法分析方法的分类(分类标准是按照识别句子时建立语法树的方法):
若对于一切1≤i≤n,ε∈FIRST(Xi),则将ε符号加进FIRST(α)。
例4-1(P62) 有文法: E→TE′ E′→+TE′ E′→ε T→FT′ T′→*FT′ T′→ε F→(E)|i 求文法中非终结符号以及各产生式右部符号串的FIRST集。
自顶向下语法分析遇到的问题
当文法中出现左递归时(存在非终结符号U,对于它有U::=U…(直接左递归),或U U…(间接左递归),它会使分析过程陷入无限循环。
(1)左递归问题
01
如果对于同一个非终结符号,存在若干个产生式右部(如U::=x1|x2|…|xn)时,要对U展开,那么按哪一个产生式右部展开呢?即如何确定替换U的xi。如果选择错误,将导致回溯。
01
例4-4(P65) 有文法:E::=E+T|E-T|T ,T::=T*F|T/F|F,为其设计递归分析程序。 解:先消除文法中的直接左递归。
4.2 FIRST集合和FOLLOW集合
解:
FOLLOW(E)={#}∪FIRST())={) , #} FOLLOW(E′)= FOLLOW(E)={) ,# } FOLLOW(T)= (FIRST(E′)-{ε})∪ FOLLOW(E) ∪ FOLLOW(E′)= { + , ) , # } FOLLOW(T′)= FOLLOW(T)= { + , ) , # } FOLLOW(F)=(FIRST(T′)-{ε})∪ FOLLOW(T) ∪ FOLLOW(T′) = {*,+,) ,# } 例4-2(P63) 有文法 E→TE′,E′→+TE′,E′→ε,T→FT′, T′→*FT′,T′→ε,F→(E)|i,求各非终结符号的FOLLOW集。
相关文档
最新文档