编译原理第二版第五章答案
编译原理第二版第
五章答案
本页仅作为文档封面,使用时可以删除
This document is for reference only-rar21year.March
第五章
第5章自顶向下语法分析方法
练习(P99)
1.文法
S->a|^|(T)
T->T,S|S
(1) 对(a,(a,a)和(((a,a),^,(a)),a)的最左推导。
(3)经改写后的文法是否为LL(1)的给出它的预测分析表。
(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
(1) 对(a,(a,a)的最左推导为:
S=>(T)
=>(T,S) =>(S,S) =>(a,S) =>(a,(T)) =>(a,(T,S)) =>(a,(S,S))
=>(a,(a,S)) =>(a,(a,a))
对(((a,a),^,(a)),a) 的最左推导为:
S=>(T) =>(T,S) =>(S,S) =>((T),S) =>((T,S),S) =>((T,S,S),S)
=>((S,S,S),S) =>(((T),S,S),S) =>(((T,S),S,S),S) =>(((S,S),S,S),S)
=>(((a,S),S,S),S) =>(((a,a),S,S),S) =>(((a,a),^,S),S) =>(((a,a),^,(T)),S) =>(((a,a),^,(S)),S) =>(((a,a),^,(a)),S) =>(((a,a),^,(a)),a)
(3)改写文法为:
0) S->a
1) S->^
2) S->( T )
3) T->S N
4) N->, S N
5) N->ε
对左部为N2的产生式可知:
FIRST (->, S N2)={,}
FIRST (->ε)={ε}
FOLLOW (N2)={)}
{,}∩ { )}=?
所以文法是LL(1)的。
也可由预测分析表中无多重入口判定文法是LL(1)的。
(4)对输入串(a,a)#的分析过程为:
可见输入串(a,a)#是文法的句子。
2.对下面的文法G:
E→TE′
E′→+E|ε
T→FT′
T′→T|ε
F→PF′
F′→* F′|ε
P→(E)|a|b|^
(1) 计算这个文法的每个非终结符的FIRST集和FOLLOW集。
(2) 证明这个文法是LL(1)的。
(3) 构造它的预测分析表。
(4) 构造它的预测下降分析程序
【解】(1)由题意分析得可推导出ε的非终结符表为:
各非终结符的FIRST集为:
FIRST(E)= FIRST(T)={(,a,b,^} FIRST(E′)={+}∪{ ε}={+,ε}
FIRST(T)= FIRST(F)={(,a,b,^}
FIRST(T′)= FIRST(T) ∪{ ε}={(,a,b,^,ε}
FIRST(F)= FIRST(P)={(,a,b,^} FIRST(F′)={*}∪{ ε}={*,ε}
FIRST(P)={(,a,b,^}
∴最终求得各非终结符的FIRST集为:
FIRST(E)={(,a,b,^} FIRST(E′)={+,ε} FIRST(T)={(,a,b,^} FIRST(T′)= {(,a,b,^,ε} FIRST(F)={(,a,b,^} FIRST(F′)={*,ε} FIRST(P)={(,a,b,^}
各非终结符的FOLLOW集为:
FOLLOW(E)={#}∪FOLLOW(E′) ∪{ )}
FOLLOW(E′)= FOLLOW(E)
FOLLOW(T)= FOLLOW(T′) ∪(F IRST(E′)-{ ε})∪FOLLOW(E) FOLLOW(T′)= FOLLOW(T)
FOLLOW(F)= (FIRST(T′)-{ ε})∪FOLLOW(T)
FOLLOW(F′)= FOLLOW(F) ∪FOLLOW(F′)
FOLLOW(P)= (FIRST(F′)-{ ε})∪FOLLOW(F)
∴最终求得各非终结符的FOLLOW集为:
FOLLOW(E)={#,)} FOLLOW(E′)= {#,)} FOLLOW(T)= {#, + , ) }
FOLLOW(T′)= {#, + ,)} FOLLOW(F)= {(,a,b,^,#,+,)}
FOLLOW(F′)= {(,a,b,^,#,+,)} FOLLOW(P)= {*,(,a,b,^,#,+,)} (2)各产生式的SELECT集为:
SELECT(E→TE′)=FIRST(TE′)= FIRST(T)={(,a,b,^}
SELECT(E ′→+E)=FIRST(+E)={+}
SELECT(E ′→ε)=(FIRST(ε)-{ ε})∪FOLLOW(E′)= FOLLOW(E′)={#,)}
SELECT(T→FT′)=FIRST(FT′)= FIRST(F)={(,a,b,^}
SELECT(T′→T)=FIRST(T)= {(,a,b,^}
SELECT(T′→ε)=(FIRST(ε)-{ ε})∪FOLLOW(T′)= FOLLOW(T′)={#,+,)}
SELECT(F→PF′)=FIRST(PF′)= FIRST(P)= {(,a,b,^}
SELECT(F′→*F′)=FIRST(*F′)= FIRST(P)= {*}
SELECT(F′→ε)=(FIRST(ε)-{ ε})∪FOLLOW(F′)=FOLLOW(F′)={(,a,b,^,#,+,)} SELECT(P→(E))=FIRST((E))={(}
SELECT(P→a)=FIRST(a)={a}
SELECT(P→b)=FIRST(b)={b}
SELECT(P→^)=FIRST(^)={^}
∴由以上结果得相同左部产生式的SELECT交集为:
SELECT(E ′→+E) ∩SELECT(E ′→ε)= {+}∩{#,)}
SELECT(T′→T) ∩SELECT(T′→ε)= {(,a,b,^)∩{#,+,)}= Φ
SELECT(F′→*F′) ∩SELECT(F′→ε)={*} ∩{(,a,b,^,#,+,)} = Φ
SELECT(P→(E))∩SELECT(P→a)∩SELECT(P→b) ∩SELECT(P→^)={(}∩{a}∩{b}∩{^}= Φ∴相同左部产生式的SELECT集合的交集为空。
∴这个文法是LL (1)的。