第五章 自顶向下语法分析方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章自顶向下语法分析方法
教学要求
1.掌握:计算FIRST集、FOLLOW集、SELECT集,LL(1)文法的概念
2.理解:不确定/确定的自顶向下分析法
3.了解:该分析方法的基本思想
5.1 确定的自顶向下分析思想
确定的自顶向下分析方法,首先要解决从文法的开始符号出发,如何根据当前的输入符号唯一地确定选用哪个产生式替换相应非终结符往下推导,或构造一颗相应的语法树。
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表明只需向右看一个字符便可决定如何推导即选择哪个产生式。
5.2 LL(1)文法的判别
判别文法是否是LL(1)文法,对任何文法计算需计算FIRST、FOLLOW和SELECT集合,进而判别文法是否为LL(1)文法。举例说明判断LL(1)文法的步骤。
1.计算FIRST集
1).若X∈V T,则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)中.
4)反复使用1)~3)直到每个符号的FIRST集不再增大为止
FIRST集的求法有两种:一是根据定义,二是用关系图求得。推荐采用定义即可
若文法G[ E]为:
(1) 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集
1)对于文法的开始符号S,置#于FOLLOW(S) 中;
2)若A→α B β是一个产生式,则把FIRST(β)-{ε}加至中FOLLOW(B);
3).若A→α B是一个产生式,或A→αBβ是一个产生式而β => ε(即ε∈FIRST(β)), 则
把FOLLOW(A)加至FOLLOW(B)中.
4)反复使用2)和3)直到每个非终结符的FOLLOW集不再增大为止。
FOLLOW集的求法也有两种:一是根据定义,二是用关系图求得。推荐采用关系图
关系图的画法:
1)对于文法的开始符号S,置#于FOLLOW(S) 中:所以于FOLLOW(S)结点指向结点#
2)若A→α B β是一个产生式:FOLLOW(B)指向FIRST(β)的非ε元素
3)若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
的关系图为:
) # FIRST(E’) + FIRST(T’) *
FOLLOW(E) FOLLOW(T) FOLLOW(F)
FOLLOW(E’) FOLLOW(T’)
各非终结符的FOLLOW集合为:
•FOLLOW(E)={),#}
•FOLLOW(E′)={),#}
•FOLLOW(T)={+,),#}
•FOLLOW(T′)={+,),#}
•FOLLOW(F)={*,+,),#}
5.3非LL(1)的转换
LL(1)文法的性质:
LL(1)文法不含左公共因子
LL(1)文法不含左递归
一、提左公因子