程序设计语言与编译教学指导.docx
《程序设计语言与编译教学指导.docx》由会员分享,可在线阅读,更多相关《程序设计语言与编译教学指导.docx(38页珍藏版)》请在冰豆网上搜索。
程序设计语言与编译教学指导
程序设计语言与编译——语言的设计和实现(第2版)
教师用教学参考指南
龚天富编
(本内容版权归作者所有,为非买品,只免费提供给教师教学之用,使用者不得随意翻印)
本指南包括三个部分。
第1部分给出本教材的知识点与教学重点;第2部分为必须布置的习题的参考答案。
书中出现的程序不是教学重点,只需讲清思路即可。
第3部分为参考试卷及其参考答案。
第1部分知识点与教学重点
笔者将各章的知识点分为三级——重点理解、理解和知道。
对重点理解的知识点应讲深讲透,对知道的知识点可以不讲,或在其他课程(如高级程设计语言概论)中去讲,或由学生自学。
第1章绪论
重点理解引言,强制式语言,程序单元。
知道程序设计语言发展简介(学生必须自学)。
第2章数据类型
重点理解引言,内部类型,用户定义类型,Pascal数据类型结构,C语言类型结构,SIMULA67语言类机制,CLU语言的抽象数据类型,C++语言的抽象数据类型,类型检查,类型转换,类型等价。
知道Ada语言的抽象数据类型(自学),Modula-2语言的抽象数据类型(自学),实现模型(自学)。
第3章控制结构
重点理解引言,顺序结构,选择结构,重复结构,语句级控制结构分析,显式调用从属单元,异常处理(异常处理的5个问题),PL/1语言的异常处理机制,CLU语言的异常处理机制,Ada语言异常处理机制(主要讨论三种语言异常处理机制的异同),SIMULA67语言协同程序,并发单元,信号灯,会合。
知道管程。
第4章程序语言的设计
重点理解全章。
第5章非过程式程序设计语言
知道全章(可以不要求,自学,作为高级程序设计语言概论课的内容)。
第6章形式语义学简介
知道全章(同第5章)。
第7章编译概述
重点理解全章。
第8章词法分析
重点理解全章。
第9章自上而下的语法分析
重点理解回溯分析法,预测分析法。
理解递归下降分析法。
第10章自下而上的语法分析
重点理解全章。
第11章语义分析和中间代码生成
重点理解全章。
第12章代码优化和目标代码生成
重点理解全章。
第13章运行时存储空间的组织
重点理解程序的存储空间,栈式分配。
理解静态分配。
知道符号表(自学)。
附录AJava语言概述
知道整个附录A(自学)。
第2部分部分习题参考答案
本书习题可分为思考题和必做题,这里仅给出必做题的参考答案。
习题1
1-1至1-11均为思考题。
习题2
2-1至2-14均为思考题。
习题3
3-1至3-13均为思考题。
习题4
4-1至4-4均为思考题。
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)是二义文法。
4-12解:
因为串i(*可有下列两棵不同的语法树
4-13解:
假定所设计的语言面向的机器为一般通用机。
按照题目给出的问题,如果不考虑输入和输出语句,那么所要设计的语言仅包含字符串数据类型和赋值语句。
语言设计如下:
<程序>→<分程序>
<分程序>→begin<语句说明表>;<执行语句>end
<说明语句表>→<说明语句>|<说明语句表>;<说明语句>
<说明语句>→<变量说明>
<变量说明>→string<变量表>
说明:
string是变量的类型,表示变量为字符串。
<字符串>→<字符>|<字符串><字符>
<字符>→一切可由键盘输入的字符
<变量表>→<变量>|<变量表>,<变量>
<执行语句表>→<执行语句表>;<执行语句>|<执行语句>
<执行语句>→<赋值语句>
<赋值语句>→<变量>:
=<表达式>
<表达式>→<变量>|<表达式>‖<变量>
说明:
符号“‖”为字符串连接运算符,例如字符串abc和字符串xyz经过连接运算的结果为abcxyz。
<变量>→<标识符>
<标识符>→<字母>|<标识符><字母>|<标识符><数字>
<字母>→a|b|…|x|y|z
<数字>→0|1|2|3|4|5|6|7|8|9
说明:
本语言未设置任何控制语句,若要进行较为复杂的程序设计,必须增加控制语句,本语言的程序只能完全顺序执行。
例:
将字符串abc和xyz连接成字符串abcxyz。
begin
stringA1,A2,A3,A4;
stringB1,B2B3,B4;
A1:
=a;
A2:
=b;
A3:
=c;
B1:
=x;
B2:
=g;
B3:
=z;
A4:
=A1‖A2;
A4:
=A4‖A3;
B4:
=B1‖B2;
B4:
=B4‖B3;
B4:
=A4‖B4
end
要求的结果字符串在B4中。
习题5
5-1至5-19均为思考题。
习题6
6-1至6-4均为思考题。
习题7
7-1至7-5均为思考题。
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。
习题8
8-1为实验题。
8-2为实验题。
8-3为实验题。
8-4为实验题。
8-5为思考题。
8-6为思考题。
习题9
9-1为思考题。
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-4解:
这里只给出消除直接右递归的一般形式。
G:
有产生式A→1A|2A|…|nA|
消除直接右递归时得产生式
A→A'
A'→A'1|A'2|…|A'n|
9-5为思考题。
9-6解:
(1)G'(S):
S→AS'
S'→iAS'|
A→BA'
A'→+BA'
A→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
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
最左素短语FaPbc
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-5解:
算符优先关系表构造如下:
该文法的产生式没有两个非终结符相邻,没有产生式,它是算符文法,在其算符优先关系表中,任何两个终结符之间至多只存在一种优先关系,故它是算符优先文法。
10-6解:
FIRSTVT(B)={∧,∨,乛,(,i}
LASTVT(B)={∨,∧,乛,),i}
在规则B→B∨B中,∨<FIRSTVT(B),∴∨<∧
又在规则B→B∨B中,LASTVT(B)>∨,∴∨>∨
因此,在∨与∧之间存在两种优先关系,故G不是算符优先文法。
若令∨,∧为右结合,则有∨<∨,∧<∧,优先级由低到高为乛,∧,∨,则有乛<∧,乛<∨,∧<∨,构造优先关系表如下:
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-8解:
拓广文法
0.S'→SFOLLOW(S)={a,b,$}I1=GO(I0,S)
1.S→bAFOLLOW(A)={a,b,$}S'→S·
2.S→aBFOLLOW(B)={a,b,$}I2=GO(I0,b)
3.A→SaI0=closure{S'→·S}S→b·A
4.A→aI0:
S'→·SA→·Sa
5.B→SbS→·bAA→·a
6.B→bS→·aBS→·bA
S→·aB
I3=GO(I0,a)I5=GO(I2,S)I7=GO(I3,B)I10=GO(I5,a)
S→a·BA→S·aS→aB·A→Sa·
B→·SbI6=GO(I2,a)I8=GO(I3,S)GO(I6,B)=I7
B→·bA→a·B→S·bGO(I6,S)=I8
S→·bAS→a·BI9=GO(I3,b)GO(I6,b)=I9
S→·aBB→·SbB→b·GO(I6,a)=I3
I4=GO(I2,A)B→·bS→b·AI11=GO(I8,b)
S→bA·S→·bAA→·SaB→Sb·
S→·aBA→·aGO(I9,A)=I4
GO(I2,b)=I2S→·bAGO(I9,B)=I5
S→aBGO(I9,a)=I6
GO(I3,a)=I3GO(I9,b)=I2
因为在I6和I9中,有依靠FOLLOW集无法解决的移进—归约矛盾(对输入字符a),所以G不是SLR文法。
10-9,同习题10-3。
10-10解:
(1)FIRSTVT(P)={A,(}LASTVT(P)={a,)}
FIRSTVT(F)={a}LASTVT(F)={a}
(2)优先关系表:
习题11
11-1解:
11-2解:
首先给出语法树,对语法树的句柄剪枝进行归约。
考虑简单的表达式文法:
E→E+E|E-E|E*E|-E|(E)|i
(1)E→iE·VAL=a设四元式的初始编号ip=100
(2)E→iE·VAL=b
(3)E→E+EE·VAL=T1(100)(+,a,b,T1)
(4)E→(E)E·VAL=T1
(5)E→-EE·VAL=T2(101)(@,T1,-,T2)@为一元负
(6)E→iE·VAL=c
(7)E→iE·VAL=d
(8)E→E+EE·VAL=T3(102)(+,c,d,T3)
(9)E→(E)E·VAL=T3
(10)E→E*EE·VAL=T4(103)(*,T2,T3,T4)
(11)E→iE·VAL=a
(12)E→iE·VAL=b
(13)E→iE·VAL=c
(14)E→E+EE·VAL=T5(104)(+,b,c,T5)
(15)E→E+EE·VAL=T6(105)(+,a,T5,T6)
(16)E→(E)E·VAL=T6
(17)E→E-EE·VAL=T7(106)(-,T4,T6,T7)
因为文法有二义性,可有不同的语法树,但对此题结果T7是一样的。
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,