程序设计语言编译原理第3版课后答案docx.docx
《程序设计语言编译原理第3版课后答案docx.docx》由会员分享,可在线阅读,更多相关《程序设计语言编译原理第3版课后答案docx.docx(45页珍藏版)》请在冰豆网上搜索。
程序设计语言编译原理第3版课后答案docx
第二章
P36-6
⑴
L(G)是o~9组成的数字串
⑵
最左推导:
N=ND二NDD二NDDD=DDDD二ODDD二01DD=012D二0127
N=ND二DD二3D=34
N=ND二NDD二DDD二5DD=56D=568
最右推导:
N=ND二N7=ND7二N27二ND27=N127二D127=0127
N=ND二N4二D4二34
N=ND二N8=ND8=N68=D68二568
P36-7
G(S)
O>1|3|5|7|9
N>2|4|6|8|O
D>0|N
S>O|AO
A—;AD|N
P36-8
文法:
ETTE+T|E—T
TtFT*F|T/F
F>(E)|i
最左推导:
E=ET=TT=FT=iT=iT*F=iF*F=ii*F=ii*i
E二T=T*F二F*F二i*F=i*(E)二i*(ET)二i*(TT)二i*(FT)
=i*(iT)二i*(iF)=i*(ii)
最右推导:
E=ET~ET*F=ET*i=EF*i=Ei*i=Ti*i=Fi*i=ii*i
E=T=F*T=F*F=F*(E)=F*(ET)=F*(EF)=F*(Ei)
二F*(Ti)二F*(Fi)二F*(ii)=i*(ii)
^语法树./********************************
E
TFi
E
FFi
E
TFi
i
i+i+i
i-i-i
i
i+i*i
***************
**/
P36-9
句子iiiei有两个语法树:
S=iSeS=iSei=iiSei=iiieiS=iS=iiSeS=iiSei=iiiei
P36-10
/**************
S>TS|T
T>(S)|()
***************/
P36-11
/***************
L1:
S>AC
A—aAb|abC—cC|;
L2:
S>AB
A—:
aA|;
B—bBc|bc
L3:
S>AB
AraAb|;
B>aBb|;
L4:
S>A|B
A)0A1|;
B>1B0|A
*************
**/
第三章习题参考答案
P64-7
确定化:
0
1
{X}
0
{1,2,3}
0
0
0
{1,2,3}
{2,3}
{2,3,4}
{2,3}
{2,3}
{2,3,4}
{2,3,4}
{2,3,5}
{2,3,4}
{2,3,5}
{2,3}
{2,3,4,Y}
{2,3,4,Y}
{2,3,5}
{2,3,4,}
最小化:
{0,1,2,3,4,5},{6}
{0,123,4,5}。
={135}{0,123,4,5^={1,2,4©
{0,1,2,3,4},{5},{6}
{0,123,4}。
二{1,3,5}
{0,1,23,{4},{5},{6}
{0,1,23°二{1,3}{0,1,2,3}厂{1,2,4}
{0,1},{2,0}{4},{$,{6
{0,1}0={1}{0,1}厂{1,2}
{2,3}厂{3{23厂{4}
{0},{1},{2,3},{4},{5},{6}
P64-8
(1)
(1|0)*01
⑵
⑴2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(0|5)|(0|5)
⑶
0*1(0|10*1)*|1*0(0|10*1)*
P64-12
⑻
a
b
{0}
{0,1}
{1}
{0,1}
{0,1}
{1}
{1}
{0}
0
0
0
0
给状态编号:
a
b
0
1
2
1
1
2
2
0
3
3
3
3
{0,1},{2,3}
{0,1}a二{1}{0,叽二⑵
{2,3}a二{0,3}{2,3}b二{3}
{0,1},{2},{3}
已经确定化了,进行最小化
最小化:
{{0,1},{2,3,4,5}}
{0,1}a={1}{0,叽二{2,4}
{2,3,4,5爲={1,3,0,5}{2,3,4,5}b二{2,3,4,5}
{2,4}a二{1,0}{2,4}b二{3,5
{3,5}a二{3,5}{3,恥={2,4}
{0,1}严{2,4}
{2,4打二{3,5
{3,5}厂{2,4}
{{0,1},{2,4},{3,5}}
{0,1}a二{1}
{2,4}a二{1,0}
{3,5}a二{3,5}
确定化:
0
1
{X,1,Y}
{1,Y}
{2}
{1,Y}
{1,Y}
{2}
{2}
{1,Y}
0
0
0
0
给状态编号:
0
1
0
1
2
1
1
2
2
1
3
3
3
3
最小化:
{0,1},{2,3
{0,1}0二{1}{0,1}1二{2}
{2,3}o={1,3}{2,3}^{3}
{0,1},{2},{3}
P81-1
(1)按照T,S的顺序消除左递归
G(S)
S>aFI仃)
T>ST
TrSTI;
递归子程序:
procedureS;
begin
ifsym='a'orsym='人'
thenabvanee
elseifsym='('
thenbegin
advance;T;
ifsym=')'thenadvanee;elseerror;
end
elseerror
end;
procedureT;
begin
S;T
end;
procedureT;
begin
ifsym=','
thenbegin
advanee;
S;T
end
end;
其中:
sym:
是输入串指针IP所指的符号
advanee:
是把IP调至下一个输入符号error:
是出错诊察程序
⑵
FIRST(S)={a],(}
FIRST(T)={af,(}
FIRST(T)={,,;}
FOLLOW(S)={),,,#}
FOLLOW(T)={)}
FOLLOWT)={)}
预测分析表
a
A
(
)
J
#
S
Sta
St八
St(T)
T
:
TtS「
:
TtST
TtST
TJ名
T't,ST
是LL
(1)文法
P81-2
文法:
E>TE
E|;
T>FT
T》T|;
F-PF
F>*F|;
P>(E)|a|bF
(1)
FIRST(E)={(,a,bf}
FIRST(E')={+,£}
FIRST(T)={(,a,b]}
FIRST(T')={(,a,b,A,£}
FIRST(F)={(,a,b,A}
FIRST(F')={*,£}
FIRST(P)={(,a,bf}
FOLLOW(E)={#,)}
FOLLOW(E')={#,)}
FOLLOW(T)={+,),#}
FOLLOW(T')={+,),#}
FOLLOW(F)={(,a,b,A,+,),#}
FOLLOW(F')={(,a,b,A,+,),#}
FOLLOW(P)={*,(,a,bf,+,),#}
⑵
考虑下列产生式:
E,E|;
TJT|:
FJ*F|:
P>(E)|A|a|b
FIRST(+E)AFIRST(£)={+}n{£}=$
FIRST(+E)AFOLLOW(E')={+}A{#,)}=$
FIRST(T)AFIRST(£)={(,a,b,A}A{£}=$FIRST(T)AFOLLOW(T')={(,a,b,A}A{+,),#}=$
FIRST(*F')AFIRST(£)={*}A{£}=$
FIRST(*F')AFOLLOW(F')={*}A{(,a,b,A,+,),#}=$
FIRST((E))AFIRST(a)AFIRST(b)AFIRST(A)=$所以,该文法式LL
(1)文法.
⑶
+
*
(
)
a
b
A
#
E
EtTE'
EtTE'
EtTE'
EtTE'
E'
EJ+E
EJ名
EJs
T
TtFTh
TtFTh
TtFTh
TtFT
T'
TJE
TJT
T't名
TJT
T'tT
TJT
TJs
F
FtPF*
FtPL
FtPL
FtPF'
F'
FJs
F't*F‘
:
FJE
FJ呂
FJg
FJs
FJ名
FJ名
P
Pt(E)
Pta
Ptb
Pta
⑷
procedureE;
begin
ifsym='('orsym='a'orsym='b'orsym='人'thenbeginT;E'endelseerror
end
procedureE:
begin
ifsym='+'
thenbeginadvanee;Eend
elseifsym<>')'andsym<>'#'thenerrorend
procedureT;
begin
ifsym='('orsym='a'orsym='b'orsym='人'thenbeginF;T'endelseerror
end
procedureT';
begin
ifsym='('orsym='a'orsym='b'orsym='人'thenT
elseifsym='*'thenerror
end
procedureF;
begin
ifsym='('orsym='a'orsym='b'orsym='人'thenbeginP;F'endelseerror
end
procedureF';
begin
ifsym='*'
thenbeginadvanee;F'end
end
procedureP;
begin
ifsym='a'orsym='b'orsym='A'
thenadvanee
elseifsym='('then
begin
advanee;E;
ifsym=')'thenadvanee
elseerror
end
elseerror
end;
P81-3
/***************
(1)是,满足三个条件。
(2)不是,对于A不满足条件3。
(3)不是,A、B均不满足条件3。
(4)是,满足三个条件。
***************/
第五章
P133-1
E=ET二ET*F
短语:
E+T*F,T*F,
直接短语:
T*F
句柄:
T*F
P133-2
文法:
S>afl(T)
T>T,S|S
(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,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),A,S),S)=(((a,a),A,(T)),S)=(((a,a),A,(S)),S)=(((a,a),A,(a)),S)
二(((a,a)f,(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,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)⑵
(((a,a),A,(a)),a)
(((S0],(a)),a)
(((T,a),A,(a)),a)(((LSV,(a)),a)
(((TL,A,(a)),a)
((S,A,(a)),a)((T,A,(a)),a)
((TS,(a)),a)
((T,(a)),a)
((T,(S)),a)
((T,(T)),a)
((TS),a)
((IL,a)
(S,a)
(TS)
(T)_
S
“移进-归约”过程:
步骤
栈
输入串
动作
0
#
(((a,a),A,(a)),a)#
预备
1
#(
((a,a),A,(a)),a)#
进
2
#((
(a,a),A,(a)),a)#
进
3
#(((
a,a),A,(a)),a)#
进
4
#(((a
a),A,(a)),a)#
进
5
#(((S
a),A,(a)),a)#
归
6
#(((T
a),A,(a)),a)#
归
7
#(((T,
a),A,(a)),a)#
进
8
#(((T,a
),A,(a)),a)#
进
9
#(((T,S
),A,(a)),a)#
归
10
#(((T
),A,(a)),a)#
归
11
#(((T)
A,(a)),a)#
进
12
#((S
A,(a)),a)#
归
13
#((T
A,(a)),a)#
归
14
#((T,
A,(a)),a)#
进
15
#((T,a
(a)),a)#
进
16
#((T,S
(a)),a)#
归
17
#((T
(a)),a)#
归
18
#((T,
(a)),a)#
进
19
#((T,(
a)),a)#
进
20
#((T,(a
)),a)#
进
21
#((T,(S
)),a)#
归
22
#((T,(T
)),a)#
归
23
#((T,(T)
),a)#
进
24
#((T,S
),a)#
归
25
#((T
),a)#
归
26
#((T)
a)#
进
27
#(S
a)#
归
28
#(T
a)#
归
29
#(T,
a)#
进
30
#(T,a
)#
进
31
#(T,S
)#
归
32
#(T
)#
归
33
#(T)
#
进
34
#S
#
归
P133-3
(1)
FIRSTVT(S)={a],(}FIRSTVT(T)={,,a】,(}LASTVT(S)={a],)}LASTVT(T)={,,a】,)}⑵
a
A
(
)
5
a
>
>
A
>
>
(
<
<
<
=
<
)
>
>
5
<
<
<
>
>
G6是算符文法,并且是算符优先文法
(3)优先函数
a
A
(
)
5
f
4
4
2
4
4
g
5
5
5
2
3
(4)
栈
输入字符串
动作
#
(a,(a,a))#
预备
#(
a,(a,a))#
进
#(a
(a,a))#
进
#(t
(a,a))#
归
#(t,
(a,a))#
进
#(t,(
a,a))#
进
#(t,(a
a))#
进
#(t,(t
a))#
归
#(t,(t,
a))#
进
#(t,(t,a
))#
进
#(t,(t,s
))#
归
#(t,(t
))#
归
#(t,(t)
)#
进
#(t,s
)#
归
#(t
)#
归
#(t)
#
进
#s
#
归
success
P134-5
(1)
0.SrS1.SrS■2.S'AS3.SrAS
4.SrAS-5.Srb6.Srb■7.ArSA
8.A—「SA9.ArSA-10.Ara11.A—「a-
⑵
确定化:
S
A
a
b
{0,2,5,7,10}
{1,2,5,7,8,10
}
{2,3,5,7,10}
{11}
{6}
{1,2,5,7,8,10
{2,5,7,8,10}
{2,3,5,7,9,10
{11}
⑹
}
}
{2,3,5,7,10}
{2,4,5,7,8,10
}
{2,3,5,7,10}
{11}
{6}
{2,5,7,8,10}
{2,5,7,8,10}
{2,3,5,7,9,10
}
{11}
{6}
{2,3,5,7,9,10
}
{2,4,5,7,8,10
}
{2,3,5,7,10}
{11}
{6}
{2,4,5,7,8,10
}
{2,5,7,8,10}
{2,3,5,7,9,10
}
{11}
{6}
{11}
0
0
0
0
{6}
0
0
0
0
DFA
构造LR(O)项目集规范族也可以用GO函数来计算得到。
所得到的项目集规范族与上图中的
项目集一样:
l0={SrS,SrAS,Srb,A「SA,A「a}
G0(|0,a)={A—a}=li
GO(10,b)={Srb}=12
G0(|0,S)={SrS,ArSA,ArSA,A「a,SrAS,Srb}=I3
G0(|0,A)={
S>AS,
S
>AS,
S>
b,
A》SA,
A>
a}=I
4
GO(13,a)={
A—;a
}=I
1
G0(|3,b)={
Srb
}=I
2
GO(13,S)={
A—:
SA,
S>
AS,
S>
b,A_SA,
A>
a}=I5
G0(|3,A)={
A>SA,
S>
AS,
S>
AS,
S—b,
A>
SA,
A>
a
}=I6
G0(|4,a)={
Ara
}=I
1
G0(|4,b)={
S》b
}=I
2
G0(|4,S)={
S>AS■,
A>
SA,
S)
AS,
Srb,
A)
SA,
A>
a
}=I7
G0(I4,A)={
S>AS,
S
>AS,
S>
b,
A》SA,
A>
a}=I
4
G0(15,a)={
Ara
}=I
1
G0(15,b)={
Srb
}=I
2
G0(I5,S)={
A—:
SA,
S>
AS,
S>
b,A—rSA,
A>
a}=15
G0(l5,A)={
A>SA,
S>
AS,
S>
AS,
Srb,
A>
SA,
A>
a
}=I6
G0(16,a)={
A—a
}=I
1
G0(16,b)={
Srb
}=I
2
G0(I6,S)={
S■■AS■,
A>
SA,
S—
AS,
Srb,
A>
SA,
A>
a
}=I7
GOg,A)={
S>AS,
S—
>AS,
S—
b,,
A》SA,
A>
a}=I
4
G0(17,a)={
A—a
}=I
1
G0(17,b)={
S」b
}=I
2
G0(I7,S)={
A>SA,
S—
AS,
S—
b,ArSA,
A>
a}=15
G0(l7,A)={
A—SA■,
S—■
AS,
S—■
AS,
Srb,
A>
SA,
A>
a
}=I6
项目集规范族为
C={11,I
2,I
3,I4,
I5,
丨6,1
17}
⑶不是SLR文法
状态3,6,7有移进归约冲突
状态3:
FOLLOW')={