程序设计语言与编译习题解答.docx
《程序设计语言与编译习题解答.docx》由会员分享,可在线阅读,更多相关《程序设计语言与编译习题解答.docx(17页珍藏版)》请在冰豆网上搜索。
![程序设计语言与编译习题解答.docx](https://file1.bdocx.com/fileroot1/2022-12/6/a5db6b3a-52af-477b-93c0-aaec2b1b0afb/a5db6b3a-52af-477b-93c0-aaec2b1b0afb1.gif)
程序设计语言与编译习题解答
4-5解:
上下文有关文法(1型文法),产生的语言L(G){=aibici|i≥1,i为整数}
4-6解:
3型文法,L(G)={ai|i≥1,i为奇数}
4-7解:
2型文法,L(G)={aibi|i≥1,i为整数}
4-8解:
1型文法,L(G)={aibici|i≥1,i为整数}
4-9解:
1.最左推导最右推导
S(A)(B)(SdB)S(A)(B)(SdB)
((A)dB)((B)dB)(SdS)(Sda)
((S)dB)((b)dB)((A)da((B)da)
((b)dS)((b)da)((s)da((b)da)
2.语法树
4-10解:
1.因为存在推导SSbFSbPSbcFbcFaPbc
所以FaPbc是文法G(S)的一个句型。
2.语法树
4-11解:
因为串aaabaa可有下列两棵不同的语法树
所以文法G(S)是二义文法。
9-2解:
(1)消除文法G的②产生式直接左递归。
A→SeA'|fA'③
A'→dA'|④
(2)消除间接左递归:
按S.A排序(按书上P116页的算法i=2,j=1时)将S的①产生式代入③有
A→AaeA'|AbeA'|ceA'|fA'⑤
(3)消除⑤的直接左递归有
A→ceA'A"|fA'A"⑥
A"→aeA'A"|beA'A"|⑦
(4)对S的①产生式提公因子有
S→AB|c⑧
B→|a|b⑨
(5)最后,文法G提取公因子,消除左递归后的产生式由⑧,⑨,⑥,⑦和④组成,无
多余的产生式。
(6)若按A.S排序,得到的产生式组合是另外的形式,但它们是等价的文法,读者可以试试。
9-3解:
消除左递归后,得文法G':
S→(L)|a
L→SL'
L'→,SL'|
递归下降过程:
Procedurematch(t:
token);
begin
iflookahead=tthenlookahead=nexttoken
elseerror
end
procedureS;
begin
iflookahead='a'thenmatch('a')
elseiflookahead='('
then
begin
match('c');
L;
iflookahead=')'
thenmatch(')')
elseerror
end
end
procudureL;
beginS;
L';
end
procudureL';
begin
iflookahead=','thenbegin
match(',')
S;
L'
end
end
9-6解:
(1)G'(S):
S→AS'
S'→iAS'|
A→BA'
A'→+BA'
B→bS*|a
(2)FIRST集和FOLLOW集
FIRST
FOLLOW
S
b,a
#,*
S'
i,
#,*
A
b,a
#,*,i
A'
+,
#,*,i
B
b,a
#,*,i,+
预测分析表
a
i
+
b
*
#
S
S→AS'
S→AS'
S'
S'→iAS'
S'→
S'→
A
A→BA'
A→BA'
A'
A→
A→+BA'
A→
A→
B
B→a
B→bS*
(3)因为预测分析表无多重定义入口,所以G'是LL
(1)文法。
9-7解:
对习题9-3的文法G消除左递归后,得文法G':
S→(L)|a
L→SL'
L'→,SL'|
FIRST集和FOLLOW集
FIRST
FOLLOW
S
(,a
),’,#
L
(,a
)
L'
’,
)
预测分析表
(
)
a
#
S
S→(L)
S→a
L
L→SL'
L→SL'
L'
L'→)
L'→,SL'
因为预测分析表无多重定义入口,所以文法G是LL
(1)文法。
10-1解:
(1)规范规范推导(最右推导)最右推导SABASbAABbbBABb
(2)语法树(推导树)
(3)短语bB,AB,ABb,bBABb
直接短语bB,AB
句柄bB
最左素短语bB
10-2解:
(1)因为存在推导SSbFFbFFaPbFFaPbPFaPbc
所以FaPbc是文法G的一个句型。
(2)语法树
(3)短语FaP,c,FaPbc
直接短语FaP,c
句柄FaP
最左素短语FaP
10-3解:
拓广文法
0.S'→S
1.S→AS
2.S→b
3.A→SA
4.A→a
LR(0)项目集规范族
I0=closure{S'→·S}I1=GO(I0,S)I2=GO(I0,A)I3=GO(I0,b)
I0:
S'→·SS'→S·S→A·SS→b·
S→·ASA→S·AS→·ASGO(I1,a)=I4
S→·bA→·SAS→·bGO(I2,A)=I2
A→·SAA→·aA→·SAGO(I2,b)=I3
A→·aS→·ASA→·a
S→·b
I4=GO(I0,a)I5=GO(I1,A)I6=GO(I1,S)I7=GO(I2,S)
A→a·A→SA·A→S·AS→AS·
S→A·SA→·SAA→S·A
S→·ASA→·bA→·SA
S→·bS→·ASA→·a
A→·SAS→·bS→·AS
A→·aS→·b
GO(I1,b)=I3
GO(I2,a)=I4
FOLLOW(S)={a,b,#}FOLLOW(A)={a,b}
∵状态5在输入a时有S4和r3的移进归约矛盾。
状态5在输入b时有S3和r3的移进归约矛盾。
状态7在输入a时有S4和r1的移进归约矛盾。
状态7在输入b时有S3和r1的移进归约矛盾。
∴文法G既不是LR(0)文法,也不是SLR
(1)文法。
10-4解:
(1)最左推导
S(T)(T,S)(S,S)(a,S)(a,(T))
(a,T,S))(a,(S,S)=(a,(a,S))(a,(a,a))
最右推导
S(T)(T,S)(T,(T))(T,(T,S))(T,(T,a)
(T,(S,a))(T,(a,a))(S,(a,a))(a,(a,a))
最左推导
S(T)(T,S)(S,S)((T),S)((S),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)),S)(((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)对句子(a,(a,a))的移进归约栈的变迁如下:
其中,(3),(4),(8),(9),(12),(13),(15),(16),(18)共进行9次归约,最右推导也是9次推导,正好是递过程。
归约(3)的句柄是a,语法树如图
(1)所示。
归约(4)的句柄是S,语法树如图
(2)所示。
归约(8)的句柄是a,语法树如图(3)所示。
归约(9)的句柄是S,语法树如图(4)所示。
归约(12)的句柄是S,语法树如图(5)所示。
归约(13)的句柄是T,S,语法树如图(6)所示。
归约(15)的柄是(T),语法树如图(7)所示。
归约(16)的句柄是T,S,语法树如图(8)所示。
归约(18)的句柄是(T),语法树如图(9)所示。
图(9)即是完整的语法树。
图中的下标是为了区分归约过程中同名文法符号和便于理解而添加的,实际是没有的,对句子(((a,a),∧,(a)),a)的规约栈变迁如图(10)所示。
图(10)
规范推导(最右推导)一共进行17步推导,归约过程也进行了17次归约,语法树如图(11)所示,其中的下标可表明其形成的先后。
图(11)
10-7解:
0.S'→SFOLLOW(S)={$}
1.S→ABFOLLOW(A)={b,c}
2.B→cBdFOLLOW(B)={d,$}
3.B→cd
4.A→aAb
5.A→ab
I0=closure{S'→·S}
I0:
S'→·SI4=GO(I2,B)I9=GO(I5,d)
S→·ABS→AB·B→cd·
A→·aAbI5=GO(I2,c)I10=GO(I6,b)
A→·abB→c·BdA→aAb·
I1=GO(I0,S)B→·cBdI11=GO(I8,d)
S'→S·B→·cBdB→cBd·
I2=GO(I0,A)B→c·d
S→A·BI6=GO(I3,A)
B→·cBdA→aA·b
B→·cdGO(I3,a)=I3
I3=GO(I0,a)I7=GO(I3,b)
A→a·AbA→ab·
A→a·bI8=GO(I5,B)
A→·aAbB→cB·d
A→·abGO(I5,c)=I5
上述状态集没有移进—归约冲突,(a)是SLR文法,分析表如下:
a
b
c
d
$
S
A
B
0
S3
1
2
1
acc
2
S5
4
3
S3
S7
6
4
r1
5
S5
S9
8
6
S10
7
r5
r5
8
S11
9
r3
r3
10
r4
r4
11
r2
r2
10-10解:
(1)FIRSTVT(P)={A,(}LASTVT(P)={a,)}
FIRSTVT(F)={a}LASTVT(F)={a}
(2)优先关系表:
习题11
11-1解:
11-3解:
推导树如下:
(1)E→iE·VAL=B设四元式初始编号ip=100
(2)E→iE·VAL=C
(3)E→-EE·VAL=T1(101)(@,c,-,T1)
(4)E→iE·VAL=D
(5)E→E+EE·VAL=T2(101)(+,T1,D,T2)
(6)E→E*EE·VAL=T3(103)(*,B,T2,T3)
(7)S→i:
=E(104)(:
=,T3,-,A)
11-4解:
结果为333645211。
11-5解:
(1)E1→C(2)W→whileW·code=102(101)(j,-,-,103)
(3)E2→A>BE2·F=103(102)(>,A,B,104)
(4)E1→E*EE1·VAL=T1(103)(j,-,-,0)
(5)E2→E+EE2·VAL=T2(104)(*,2,z.T1)
(6)A→i:
=E2A·chain=0(105)(+,y,T1,T2)
(7)S→AS1·chain=0(106)(:
=,T2,-,x)
(8)S→WS1S1·chain=103(107)(j,-,-,102)
(9)S→ifE1thenS1S·chain=101
习题12
回边
7→4
9→1
10→7
12-1解:
(a)基本块程序流图
B1
(1)~(3)
B2(4)
B3(5)
B4(6)
B5(7)~(8)
B6(9)
B7(10)~(11)
B8(12)~(13)
B9(14)~(15)
B10(16)~(17)
(b)必经结点
D
(1)={1}D
(2)={1,2}D(3)={1,3}
D(4)={1,3,4}D(5)={1,3,4,5}D(6)={1,3,4,6}
D(7)={1,3,4,7}D(8)={1,3,4,7,8}D(9)={1,3,4,7,8,9}
D(10)={1,3,4,7,8,10}
由回边7→4组成的循环{7,4,5,6,8,10}。
(3)优化结果
(3)B:
=10
(4)A:
=A+8
(5)ifB≥100thengoto(8)
(6)B:
=B+10
(7)goto(4)
(8)writeA
12-2解:
(1)基本块
(2)程序流图
B1
(1)~(3)
B2(4)~(5)
B3(6)~(7)
B4(8)
12-7解:
MOVbR0
ADDR0c
MOVaR1
SVBR1R0
MOVR0t1
MOVdR0
ADDR01
MOVR1t2
MOVeR1
MVLR1f
ADDR0R1
MOVt2R1
DIVR1R0
12-8解:
a
b
c
d
e
f
B1
1
2
2
2
1
1
B2
1
2
1
1
1
B3
1
2
2
1
2
B4
2
2
2
1
1
B5
1
1
1
1
2
2
Σ
6
9
8
6
3
7
分配给b,c,f,执行代价最省。
13-2解:
当运行到C调用B时,活动记录栈的状态如下图。
13-4解:
静态作用域规则下输出0.2500.250
0.2500.250
动态作用域规则下输出0.2500.125
0.2500.125
7-6解:
设x,y,z对应的形式单元为J1(和J'1),J2(和J'2),J3(和J'3)。
1.引用调用
A:
=2
B:
=3
T:
=A+B(T的值为5)
J1:
=T的地址
J2:
=A的地址
J3:
=A的地址
J2↑:
=J2↑+1(A的值为3)
J3↑:
=J3↑+J1↑(A的值为3+5=8)
打印A的值为8。
2.传值
A:
=2
B:
=3
T:
=A+B(T的值为5)
J1:
=T(J1的值为5)
J2:
=A(J2的值为2)
J3:
=A(J3的值为2)
J2:
=J2+1(J2的值为3)
J3:
=J3+J1(J3的值为7)
打印A的值为2。
3.结果调用
形式单元J1,J2,J3无初始化值,计算是不确定的,打印A的值仍为2。
4.传值得结果
A:
=2
B:
=3
T:
=A+B(T的值为5)
J1:
=T(J1的值为5)
J'1:
=T的地址
J2:
=A(J2的值为2)
J'2:
=A的地址
J3:
=A(J3的值为2)
J'3:
=A的地址
J2:
=J2+1(J2的值为3)
J3:
=J3+J1(J3的值为7)
J'3↑:
=J1(T的值为5,未变)
J'2↑:
=J2(A的值为3)
J'3↑:
=J3(A的值为7)
打印A的值为7。
5.名调用
计算时用实参原文替换形参
A:
=2
B:
=3
B:
=A+1(A替换y,A的值为3)
A:
=A+A+B(A的值为9)
打印A的值为9。