程序设计语言与编译习题解答Word文档下载推荐.docx
《程序设计语言与编译习题解答Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《程序设计语言与编译习题解答Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
![程序设计语言与编译习题解答Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/9/04fe6f4c-1fde-489d-b4d5-339e69799fa4/04fe6f4c-1fde-489d-b4d5-339e69799fa41.gif)
FaPbc
所以FaPbc是文法G(S)的一个句型。
4-11解:
因为串aaabaa可有下列两棵不同的语法树
所以文法G(S)是二义文法。
9-2解:
(1)消除文法G的②产生式直接左递归。
A→SeA'
|fA'
③
A'
→dA'
|e④
(2)消除间接左递归:
按S.A排序(按书上P116页的算法i=2,j=1时)将S的①产生式代入③有
A→AaeA'
|AbeA'
|ceA'
⑤
(3)消除⑤的直接左递归有
A→ceA'
A"
⑥
A"
→aeA'
|beA'
|e⑦
(4)对S的①产生式提公因子有
S→AB|c⑧
B→|a|b⑨
(5)最后,文法G提取公因子,消除左递归后的产生式由⑧,⑨,⑥,⑦和④组成,无
多余的产生式。
(6)若按A.S排序,得到的产生式组合是另外的形式,但它们是等价的文法,读者可以试试。
9-3解:
消除左递归后,得文法G'
:
S→(L)|a
L→SL'
L'
→,SL'
|e
递归下降过程:
Procedurematch(t:
token);
begin
iflookahead=tthenlookahead=nexttoken
elseerror
end
procedureS;
iflookahead='
a'
thenmatch('
)
elseiflookahead='
('
then
begin
match('
c'
);
L;
iflookahead='
)'
thenmatch('
elseerror
end
end
procudureL;
beginS;
;
procudureL'
'
thenbegin
match('
S;
L'
end
9-6解:
(1)G'
(S):
S→AS'
S'
→iAS'
A→BA'
A'
→+BA'
e
B→bS*|a
(2)FIRST集和FOLLOW集
FIRST
FOLLOW
S
b,a
#,*
S'
i,e
A
#,*,i
A'
+,e
B
#,*,i,+
预测分析表
a
i
+
b
*
#
→e
A→BA'
A→e
A→+BA'
A→
B→a
B→bS*
(3)因为预测分析表无多重定义入口,所以G'
是LL
(1)文法。
9-7解:
对习题9-3的文法G消除左递归后,得文法G'
:
→,SL'
FIRST集和FOLLOW集
(,a
),’,#
L
L'
’,e
(
S→(L)
S→a
L→SL'
→)
因为预测分析表无多重定义入口,所以文法G是LL
(1)文法。
10-1解:
(1)规范规范推导(最右推导)最右推导SÞ
ABÞ
ASbÞ
AABbÞ
bBABb
(2)语法树(推导树)
(3)短语bB,AB,ABb,bBABb
直接短语bB,AB
句柄bB
最左素短语bB
10-2解:
(1)因为存在推导SÞ
SbFÞ
FbFÞ
FaPbFÞ
FaPbPÞ
FaPbc
所以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:
SS'
→S·
S→A·
SS→b·
S→·
ASA→S·
AS→·
ASGO(I1,a)=I4
bA→·
SAS→·
bGO(I2,A)=I2
A→·
SAA→·
aA→·
SAGO(I2,b)=I3
aS→·
ASA→·
S→·
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·
ASA→·
bA→·
SA
S→·
bS→·
ASA→·
A→·
SAS→·
AS
aS→·
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))
最右推导
(T,(T))Þ
(T,(T,S))Þ
(T,(T,a)
(T,(S,a))Þ
(T,(a,a))Þ
(S,(a,a))Þ
最左推导
((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)
最右推导
(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)
(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解:
→SFOLLOW(S)={$}
1.S→ABFOLLOW(A)={b,c}
2.B→cBdFOLLOW(B)={d,$}
3.B→cd
4.A→aAb
5.A→ab
S}
SI4=GO(I2,B)I9=GO(I5,d)
ABS→AB·
B→cd·
aAbI5=GO(I2,c)I10=GO(I6,b)
abB→c·
BdA→aAb·
I1=GO(I0,S)B→·
cBdI11=GO(I8,d)
S'
B→·
cBdB→cBd·
I2=GO(I0,A)B→c·
d
S→A·
BI6=GO(I3,A)
B→·
cBdA→aA·
cdGO(I3,a)=I3
I3=GO(I0,a)I7=GO(I3,b)
A→a·
AbA→ab·
bI8=GO(I5,B)
aAbB→cB·
abGO(I5,c)=I5
上述状态集没有移进—归约冲突,(a)是SLR文法,分析表如下:
c
$
S3
1
2
acc
S5
4
3
S7
6
r1
5
S9
8