-
第
1
章引论
第
1
题
答案:
(
1
)
p>
编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或
< br>机器语言,则此翻译程序称为编译程序。
(
2
)
源程序:源语言编写的程序称为源程序。
(
3
)
目标程序:目标语言书写的程序称为目标程序。
(
4
)
p>
编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与
目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生
成这些阶
段,
某些优化工作也可在前
端做,
也包括与前端每个阶段相关的出错处理工作和符号表管理
等工作。
(
5
)
p>
后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,
即目标代码生成,以及相关出错处理和符号表操作。
(
6
)
p>
遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第
2
题
答案:
一个典型的编译程序通常包含
8
个组成部分,它们是词法分析程序、语法分析程序、语
义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、
表格管理程序和
错误处理程序。其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析
单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结
果保存到各类语义信息表
中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的
语法单位转换成一定形式
的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码
进行等价变换处理。
目标代码生成
程序:将优化后的中间代码程序转换成目标代码程序。
p>
表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的
各类信息和编译各阶段的进展情况,
编译的
每个阶段所需信息多数都从表格中读取,
产生的
中间结果都记录
在相应的表格中。
可以说整个编译过程就是造表、
查表的工作过
程。
需要指
出的是,这里的
“表格管理
程序”并不意味着它就是一个独立的表格管理模块,而是指编译
程序具有的表格管理功能
。
错误处理程序:处理和校正源程
序中存在的词法、语法和语义错误。当编译程序发现源
程序中
的错误时,
错误处理程序负责报告出错的位置和错误性质等信息,
同时对发现的错误
进行适当的校正(修复),目的是使编译程序能够继续向下进行分析
和处理。
注意:如果问编译程序有
哪些主要构成成分,只要回答六部分就可以。如果搞不清楚,
就回答八部分。
第
3
题
答案:
翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程<
/p>
序和汇编程序等。
编译程序是把用高级语言编写的源程序转换(加工)成与之等
价的另一种用低级语言编
写的目标程序的翻译程序。
解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:
一种方式是,
源程序功能的实现完全由解释程序承担和完成
,
即每读出源程序的一条语句的
第一个单词,
< br>则依据这个单词把控制转移到实现这条语句功能的程序部分,
该部分负责完成
p>
这条语句的功能的实现,
完成后返回到解释程序的总控部分再读人下
一条语句继续进行解释、
执行,如此反复;
< br>另一种方式是,
一边翻译一边执行,
即每读出源程序的一
条语句,
解释程序就将其翻译成一
段机器指令并执行之,然后再
读人下一条语句继续进行解释、执行,如此反复。
无论是哪种
方式,
其加工结果都是源程序的执行结果。
目前很多解释程序采
取上述两种方式
的综合实现方案,
即先把源程序翻译成较容易解
释执行的某种中间代码程序,
然后集中解释
执行中间代码程序,
最后得到运行结果。
广义上讲,编
译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是
边翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源
程序翻译成目标程序,
输出与源程序等价的目标程序,
而目标程序的执行任务由操作系统来
完成,即只翻译不执行。
第
4
题
答案:
(
1
)
语法分析
(
2
)
语义分析
(
3
)
语法分析
(
4
)
词法分析
第
2
章
PL/0
编译程序的实现
第
1
题
答案:
PL/0
语言允许过程嵌套定义和递归调用,
它的编译程序在运行时采用了栈式动态存储管理。
(数组
CODE
存放的只读目标程序,它在运行时不改变。
)运行
时的数据区
S
是由解释程序
定义的一
维整型数组,解释执行时对数据空间
S
的管理遵循后进先出规
则,当每个过程
(
包
括主程序
)
被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放
。应用动
态链和静态链的方式分别解决递归调用和非局部变量的引用问题。
第
2
题
答案:
程序执行到赋值语句
b
∶
=10
时运行栈的布局示意图为:
第
3
题
答案:
题
2
中当程序编译到
r
的过程体时的名字表
table
的内容为:
注意:
q
和
s
是并列的过程,所以
q
定义的变量
b
被覆盖。
第
4
题
答案:
栈顶指针
T
,
最新活动记录基地址指针
B
,
动态链指针
DL
,
静
态链指针
SL
与返回地址
RA
的
用途说明如下:
T
:
栈顶寄存器
T
指出了当前栈中最新分配的单元
(T
也是数组
S
的下标
)
。
B
:基址寄存器,指向每个过程被调用时,在数据区
S
中给它分配的数据段起始
地址,也
称基地址。
SL
:
静态
链,指向定义该过程的直接外过程(或主程序)运行时最新数据段的基地址,用
以引用非
局部(包围它的过程)变量时,寻找该变量的地址。
DL
:
动态
链,指向调用该过程前正在运行过程的数据段基地址,用以过程执行结束释放数
据空间时
,恢复调用该过程前运行栈的状态。
RA
:
返回
地址,
记录调用该过程时目标程序的断点,
即调用过程指令的下
一条指令的地址,
用以过程执行结束后返回调用过程时的下一条指令继续执行。
在每个过程被调用时在栈顶分配
3
个联系单元,用以存放
SL
,
< br>DL
,
RA
。
第
5
题
答案:
PL/0
编译程序所产生的目标代码中有
3
条非常重要的特殊指令,这
3
条指令在
code
中
的位置和功能以及所完成的操作说明如下:
INT 0 A
在过程目标程序的入口处,开辟
A
个单元的数据段。
A
为局部变量的个
数
+3
。
OPR 0 0
在过程目标程序的出口处,释放数据段(退栈
)
,恢复调用该过程前正在运行的过程的数据
段基址寄存器
p>
B
和栈顶寄存器
T
的值,
并将返回地址送到指令地址寄存器
P
中,
以使调用
前的程序从断点开始继续执行。
CAL L A
调用过程,完成填写静态
链、动态链、返回地址,给出被调用过程的基地址值,送入基址寄
存器
< br>B
中,目标程序的入口地址
A
的值送指令地址寄存器
P
中,使指令从
A
开始执行。
第
6
题
答案:
对
PL/0
语言作如下功能扩充时的语法图和
EBNF
的语法描述如下:
(1)
扩充条件语句的语法图为:
EBNF
的语法描述为:
〈条件语句〉
::= if
〈条件〉<
/p>
then
〈语句〉
[else
〈语句〉
]
(2)
扩充
repeat
语句的语法图为:
EBNF
的语法描述为:
〈
重复语句〉
::= repeat
〈语
句〉
{
;
〈语句〉
}until
〈条件〉
第
3
章
文法和语言
第
1
题
答案:
L(G[S])={abc}
第
2
题
答案
:
G[N]
的语言是
V+
。
V={0,1,2,3,4,5,6,7,8,9}
N=>ND=>NDD.... =>NDDDD...D=>D......D
或者:允许
0
开头的非负整数?
第3题
答案:
G[S]:
S->S+D|S-D|D
D->0|1|2|3|4|5|6|7|8|9
第
4
题
答案:
Z=>aZb=>aaZbb=>aaa..Z...bbb=>
aaa..ab...bbb
L(G[Z])={anbn|n>=1}
第
5
题
答案:
(1)
允许
0
开头的偶正整数集合的文法
E
→
NT|D
T
→
NT|D
N
→
D|1|3|5|7|9
D
→
0|2|4|6|8
(2)
不允许
0
开头的偶正整数集合的文法
E
→
NT|D
T
→
FT|G
N
→
D|1|3|5|7|9
D
→
2|4|6|8
F
→
N|0
G
→
D|0
第
6
题
答案:
(5) <
表达式
>
=><
表达式
>
+
<
项
>
=><
表达式
>
+
<
因子
>
=><
表达式
>
+(
<
表达
式
>
)
=>
<
表达式
>
+(
<
表达式
>
+
<
项
>
)
=><
表达式
>
+(
<
表达式
>
+
<
因子
>
)
=><
表达式
< br>>
+(
<
表达式
>
+
i
)
=><
表达式
>
+(
<
项
>
< br>+
i
)
=><
表达式
>
+(
<
因子
>
+
< br>i
)
=><
< br>表达式
>
+(
i
+
i
)
=><
项
>
+(
< br>i
+
i
)
=><
因子
>
+(
i
+
i
)
=>i
+(
i
+
i
)
(6)
<
表达式
>
=><
< br>表达式
>
+
<
< br>项
>
=><
表达式
>
+
<
项
>*<
因子
>
=><
表达式
>
+
<
项
>*i
=><
表
达式
>
+
<
因
子
>*i
=><
表达式
>
+
i*i
=><
项
>
+
i*i
p>
=><
因子
>
+<
/p>
i*i
=>i
+
i*i
第
7
题
答案:
第
8
题
答案:
对于串
abc
(1)S=>Ac=>abc (2)S=>aB=>abc
即存在两不同的最右推导。所以,该文法是二义的。
或者:
对输入字符串
abc
,能构造两棵不同的语法树,所以它是二义的。
第
9
题
答案:
(1)
此文法生成串
aa+a*
的最右推导如下
S=>SS*=>SS*=>Sa*=>SS+a*=>Sa+a*=>aa+a*
(2)
该文法生成的语言是:
*
和
+
的后缀表达式
,即逆波兰式。
第
10
题
答案:
(1)
嵌套的括号
(2)
是二义的,因为对于()
p>
()可以构造两棵不同的语法树。
第
11
题
答案:
此句型对应语法树如右,故为此文法一个句型。
或者:因为存在推导序列
:
E=>E+T=>E+T*F
,所以
E+T*F
句型
此句型相对于
E
的短语有
:E+T*F
;相对于
T
的短语有
T*F
直接短语为:
T*F
句柄为:
T*F
第
13
题
答案:
(1)
串
abbaa
最左推导
:
S=>ABS=>aBS
=>aSBBS=>aBBS=>abBS=>abbS=>abbAa=>abbaa
最右推导:
S=>ABS=>ABA
a=>ABaa=>ASBBaa=>ASBbaa=>ASbbaa=>Abbaa=>abbaa
(2)
产生式有:
S
→
ABS |Aa|
ε
A
→
a
B
→
SBB|b
可能元素有:
ε
aa ab abbaa aaabbaa
??
(3)
该句子的短语有:
a
是相对
A
的短语
ε
是相对
S
的短语
b
是相对
B
的短语
ε
bb
是相对
B
的短语
aa
是相对
S
的短语
a
ε
bbaa
是相对
S
的短语
直接短语有:
a
ε
b
句柄是:
a
第
14
题
答案:
(1)
S
→
AA
A
→
aAb|
ε
(2)
S
→
1S0|A
A
→
0A1|
ε
< br>
(3)
S
< br>→
0S0|1S1|
ε
第
16
题
答案:
(1)
S
→
aS|
ε
(2)
S
→
aA
A
→
aA|B
B
→
bB|b
(3)
A
→
aA|B
B
→
bB|C
C
→
cC|
ε
第
17
题
答案:
等价。
第
18
题
答案:
(1)
字母表:是一个非空有穷集合。
(2)
串:符号的有穷序列。
字:字母表中的元素。
句子:如果
Z x , x
∈
V *T
则称
x
是文法
G
的一个句子。
+
(3)
语言:
它是由句子组成的集合,
是由一组记号所构成的集合。
程序设
计的语言就是所有该语
言的程序的全体。
语言可以看成在一个基
本符号集上定义的,
按一定规则构成的一切基本符
号串组成的集
合。
语法:表示构成语言句子的各个记号之间的组合规律。程
序的结构或形式。
语义:表示按照各种表示方法所表示的各个
记号的特定含义。语言所代表的含义。
第
4
章
词法分析
第
1
题
答案:
(1)
先构造
NFA
:
用子集法将
NFA
确定化
除
X
,
A
外,重新命名其他状态,令
AB
为
B
、
AC
为
C
、
ABY
为
D
,因为
D
含有
Y
(
NF
A
的终态),所以
D
为终态。
DFA
的状态图:
:
(2)
先
构造
NFA
:
用子集法将
NFA
确定化
将
T0
、
T1
、
T2
、
T3
、
T4
、
T5
、
T6
、
T7
、
T8
、
T9
、
T10
、
T
11
、
T12
、
T13
、
T14
重新命名,分别
p>
用
0
、
1
、
2
、
3
、
4
、
5
< br>、
6
、
7
、
8
、
9
、
10
、
11
、
12
、
13
、
14
表示。因为
2
< br>、
7
、
8
、
10
、
12
中
含有
Y
,所以它们都为终态。<
/p>
(3)
用子集法将
NFA
确定化
将
T0
、
T1
、
T2
、
T3
、
T4
、
T5
重
新命名,分别用
0
、
1
、
2
、
3
、
4
、
5
表示。因为
3
、
5
中含有
Y
,所以它们都为终态。
(4)
先构造
NFA
:
用子集法将
NFA
确定化:
将
T0
、
T1
、
T2
、
T3
、
T4
、
T5
重新命名,分别用
0
、
1
、
2
、
3
< br>、
4
、
5
表示。因为
4
中含有
Y
,
所以它为终态。
DFA
的状态图:
第2题
答案:
先构造其矩阵
用子集法将
NFA
确定化:
将
x
、
z
、<
/p>
xz
、
y
、
p>
xy
、
xyz
重
新命名,分别用
A
、
B
、
C
、
D
、
E
、
F
表示。因为
B
、
C
< br>、
F
中含有
z
,所以它为终态。
第
3
题
答案:
用子集法将
NFA
确定化:
重新命名状态子集,令
VQ
为
A
、
QU
为
B
、
VZ
为
C
、
V
为
D
、
QUZ
为
E
、
Z
为
F
。
DFA
的状态图:
第
4
题
答案:
第
5
题
答案:
按题意相应的正规表达式是<
/p>
(0*10)*0*
,
或
0*(0 | 10)*0*
构造相应的
DFA
p>
,
首先构造
NFA
为
重新命名状态集:
DFA
的状态图:
可将该
DFA
最小化:
终态组为
< br>{1,2,4}
,非终态组为
{3}
,
{1,2,4}0
{1,2,4}
,
{1,2,4}1
{3}
,所以
1,2,4
为等价状
态,可合并。
第6题
答案:
先构造
NFA
:
用子集法将
NFA
确定化:
将
XA
、
B
、
FG
、
A
、<
/p>
C
、
G
、
H
、
DE
、
E
、
Y
重新命名,分
别用
0
、
1
、
2
、
3
、
p>
4
、
5
、
6
、
7
、
8
、
9
表示。终态有
p>
0
、
3
、
4
、
6
、
9
。
DFA
的状态图:
-
-
-
-
-
-
-
-
-
上一篇:编译原理课后答案(陈火旺)
下一篇:惠普电脑经常会自动关机咋回事