编译原理第二版第五章答案

编译原理第二版第五章答案
编译原理第二版第五章答案

编译原理第二版第

五章答案

本页仅作为文档封面,使用时可以删除

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)的。

相关主题
相关文档
最新文档