编译原理第二版张素琴著 第五章 习题参考答案 下载本文

内容发布更新时间 : 2024/5/19 2:44:11星期一 下面是文章的全部内容请认真阅读。

第五章 习题参考答案

1、(1) 对(a,(a,a)的最左推导为:S(a,(a,S))((S,S,S),S)

∧,S),S)

(T) (T,S) (T)

(S,S) (T,S)

(a,S) (S,S)

(a,(T)) ((T),S)

(a,(T,S)) ((T,S),S)

(a,(S,S))((T,S,S),S)

(((a,a),

(a,(a,a))

(((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),∧,(a)),a) 的最左推导为:S

(((a,a),∧,(T)),S)

(((a,a),∧,(S)),S) (((a,a),∧,(a)),S) (((a,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 )

对((( a, a ), ?, ( a )), a )的最左推导为:S ? ( T ) ? ( T, S ) ? ( T, a ) ? ( S, a ) ? (( T ), a ) ? (( T, S ), a )? (( T, ( T )), a ) ? (( T, ( S )), a ) ? (( T, ( a )), a ) ? (( T, S, ( a )), a ) ? (( T, ?, ( a )), a ) ? (( S, ?, ( a )), a ) ? ((( T ), ?, ( a )), a ) ? ((( T, S ), ?, ( a )), a ) ? ((( T, a ), ?, ( a )), a ) ? ((( S, a ), ?, ( a )), a ) ? ((( a, a ), ?, ( a )), a )

(2) 改写文法为:

0) S→a 1) S→∧ 2) S→( T ) 3) T→S N 4) N→, S N 5) N→ε

S: T: 入口 入口 N: 入口 N

a

Y S Y , Read(w) N ^ N Y N ( Y N

出口 S Read(w) 出错 N T

出口 N ) Read(w) 出口 (3) 非终结符 FIRST集 FOLLOW集 S T N 对左部为N的产生式可知:

{a,∧,(} {a,∧,(} {,,ε}. {#,,,)} {)}.... {)}.... SELECT(S→a)∩SELECT(S→∧) ∩SELECT(S→( T ))= SELECT(N →, S N)∩SELECT(N →ε) ={,}∩ { )}= 所以文法是LL(1)的。 预测分析表

S T N a →a →S N ∧ ( →(T) →S N ) →ε , →, S N # →∧ →S N 也可由预测分析表中无多重入口判定文法是LL(1)的。 (4) 对输入串(a,a)#的分析过程为:

栈(STACK) 当前输入符(CUR_CHAR) 剩余输入符(INOUT_STRING) 所用产生式(OPERATION) #S #)T( #)T #)NS #)Na #)N #)NS, #)NS #)Na #)N #) #

6.(2) 不是LL(1)文法

以A的产生式代入S,以D的产生式代入B中,提取左公共因子并删除多余产生式得文法: S→BC 分析表为 S B C F a BC F aB ε b BC F b d BC dF # BC F ε ε C→aB|ε

B→dF|F F→b|ε

( ( a a a , , a a ) ) # a,a)#... a,a)#... ,a)#... ,a)#... ,a)#... a)#... a)#... )#... )#... #... #... .. S→(T) . T→SN S→a . N→,SN . S→a . N→ε 可见输入串(a,a)#是文法的句子。

结论:经改写之后的文法G是LL(1)文法。 递归下降分析器如同题1,从略

6.(4)消除左递归为: S→i E F S S→(E)

+ +SF

E→SF

- -SF F→+SF

i SF i F→-SF

F→ε ( SF (E) ) ε ﹟ 分析表为:

结论:经改写之后的文法G是LL(1)文法。 递归下降分析器如同题1,从略

7.(1)文法不存在左递归

第一种改法:以A的产生式替入B 产生式中 B→baBbb B→bC B C B→bb

B→a

B→a

b bC b # 消除左公共因子:

C→aBbb C→b

a a aBbb 改写之后的文法的分析表:

改写之后的文法是LL(1)文法

第二种改法:以B的产生式替入A产生式中 A→baAbb A→ε

A→baa

A→ε

C→a

消除左公共因子后为

A→baC

C→Abb

SELECT(A→baC) ∩ SELECT(A→ε) ={ b}∩ {# ,b }≠ 所以,改写之后的文法不是LL(1)文法

7.(3)第1种改写:用A的产生式右部代替S的产生式右部的A得:

S→SBa|b B→ab 消除左递归后文法变为: 0) S→b N 1) N→B a N 2) N→ε 3) B→a b

非终结符 S B N FIRST集 {b}... {a}... {ε,a} FOLLOW集 {#} {a} {#} SELECT(N→B a N)∩SELECT(N→ε) ={ a }∩ {# }= 所以文法是LL(1)的。 预测分析表

S B N a →a b →B a N b →b N # →ε 第2种改写:用S的产生式右部代替A的产生式右部的S得: S→Aa|b

A→AaB|bB B→ab

消除左递归后文法变为:

0) S→A a 1) S→b 2) A→b B N 3) N→a B N 4) N→ε 5) B→a b

非终结符 S A B N FIRST集 {b}... {b}... {a}... {a,ε}

FOLLOW集 {#} {a} {a} {a} SELECT(S→A a)∩SELECT(S→b) ={ b }∩ { b }={ b }≠SELECT(N→a B N)∩SELECT(N→ε) ={ a }∩ { a }={ a }≠所以文法不是LL(1)的。

7.(5)以A、B的产生式代入S的产生式中的A、B,得新文法: S→aC S→aC S→aC S→aC

C→Ab|b|a

A→aA|a

A→aA|a

以A的产生式代入C中提取左公共因子得:

C→aD|b D→Ab|b|ε C→aD|b D→aE|ε C→aD|b D→aE|ε

以A的产生式代入D中提取左公共因子得:

E→Ab|b A→aA|a E→aF

F→Ab|b A→aA|a

以A的产生式代入E中提取左公共因子得:

可以看出,继续用A的产生式替换,只能使文法的产生式越来越多。 改写之后的文法不是LL(1)文法