第五章 自顶向下语法分析方法.docx
教学要求
第五章自顶向下语法分析方法
1.掌握:计算FIRST集、FOLLOW集、SELECT集,LL(1)文法的概念2.理解:不确定/确定的自顶向下分析法3.了解:该分析方法的基本思想
确定的自顶向下分析思想
确定的自顶向下分析方法,首先要解决从文法的开始符号出发,如何根据当前的输入符号唯一地确定选用哪个产生式替换相应非终结符往下推导,或构造一颗相应的语法树。
1:首符号集:
设G=(VN,VT,P,S)是上下文无关文法:FIRST(?)={a|?=a?,a∈VT,?,?∈V*}
若?=ε则规定ε∈FRIST(?)
2:后继符号集:
FOLLOW(A)={a?S=?A?且a∈FRIST(?),?∈V*,?∈V+ }
若S=?A?,且?=ε,则#∈FOLLOW(A)3:选择集合SELECT:
给定上下文无关文法的产生式A→α
A∈VN,α ∈V*,若?≠ε,则:
SELECT(A→α )=FIRST(α)
如果?=ε,则: SELECT(A→α )=FIRST(α)-{ε}∪FOLLOW(A)4:LL(1)文法:
一个上下文无关文法是LL(1)文法的充分必要条件是,对每个非终结符A的两个不同产生式,A→α 或A→?满足SELECT(A→α )∩SELECT(A→?)=?
其中,α 、?不能同时=ε
注意:第一个L表明自顶向下分析是从左到右扫描输入串,第二个L表明分析过程中将用最左推导,1表明只需向右看一个字符便可决定如何推导即选择哪个产生式。
LL(1)文法的判别
判别文法是否是LL(1)文法,对任何文法计算需计算FIRST、FOLLOW和SELECT集合,进而判别文法是否为LL(1)文法。举例说明判断LL(1)文法的步骤。
1.计算FIRST集
1).若X?V?,则FIRST(X)={X}
2).若X?VN,且有产生式X?a…,a是终结符,则把a加入到FIRST(X)中;若X??也是一条产生式,则把?也加到FIRST(X)中.
3).若X?Y…是一个产生式且Y?VN,则把FIRST(Y)中的所有非?元素都加到FIRST(X)中;若X
?Y1Y2…YK是一个产生式,Y1,Y2,…,Y(i-1)都是非终结符,而且,对于任何j,1≤j≤i-1,FIRST(Yj)都含有?(即Y1..Y(i-1)=*?),则把FIRST(Yj)中的所有非?元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj,j=1,2,…,K)均含有?,则把?加到FRIST(X)中.
反复使用1)~3)直到每个符号的FIRST集不再增大为止
FIRST集的求法有两种:一是根据定义,二是用关系图求得。推荐采用定义即可若文法G[E]为:
E–TE’
(2) E’–+TE’
(3) E’–?
(4) T–FT’
(5) T’–*FT’
(6) T’–?
(7) F–(E)
(8) F–i
各非终结符的FIRST集合如下:
FIRST(E)={(,i}
FIRST(E′)={+,ε}
FIRST(T)={(,i}
FIRST(T′)={*,ε}
FIRST(F)={(,i}
3.计算FOLLOW集
对于文法的开始符号S,置#于FOLLOW(S)中;
若A?α Bβ是一个产生式,则把FIRST(β)-{?}加至中FOLLOW(B);
3).若A?α B是一个产生式,或A?αBβ是一个产生式而β =?(即??FIRST(β)), 则把FOLLOW(A)加至FOLLOW(B)中.
反复使用2)和3)直到每个非终结符的FOLLOW集不再增大为止。
FOLLOW集的求法也有两种:一是根据定义,二是用关系图求得。推荐采用关系图关系图的画法:
对于文法的开始符号S,置#于FOLLOW(S)中:所以于FOLLOW(S)结点指向结点#
若A?α Bβ是一个产生式:FOLLOW(B)指向FIRST(β)的非?元素
若A?α B是一个产生式,或A?αBβ是一个产生式而β =?(即??FIRST(β))FOLLOW(B)指向FOLLOW(A)
画出关系图后,每一个非终结符的FOLLOW结点能够到达的终结符和#都属于其后继符号集中若文法G[E]为:
(1) E–TE’
(2) E’–+TE’
(3) E’–?
(4) T–FT’
(5) T’–*FT’
(6) T’–?
(7) F–(E)
(8) F–i
的关