编译原理作业参考答案.

  • 格式:doc
  • 大小:887.50 KB
  • 文档页数:20

编译原理 作业参考答案

1

第1章 引 言

1、解释下列各词

源语言:编写源程序的语言(基本符号,关键字),各种程序设计语言都可以作为源语言。

源程序: 用接近自然语言(数学语言)的源语言(基本符号,关键字)编写的程序,它是翻译程序处理的对象。

目标程序: 目标程序是源程序经过翻译程序加工最后得到的程序。目标程序

(结果程序)一般可由计算机直接执行。

低级语言:机器语言和汇编语言。

高级语言:是人们根据描述实际问题的需要而设计的一个记号系统。如同自然语言(接近数学语言和工程语言)一样,语言的基本单位是语句,由符号组和一组用来组织它们成为有确定意义的组合规则。

翻译程序: 能够把某一种语言程序(源语言程序)改变成另一种语言程序(目

标语言程序),后者与前者在逻辑上是等价的。其中包括:编译程序,解释程序,汇编程序。

编译程序: 把输入的源程序翻译成等价的目标程序(汇编语言或机器语言),

然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。

解释程序: 以该语言写的源程序作为输入,但不产生目标程序。按源程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称为解释程序。

2、什么叫“遍”?

指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一次,并作相应的加工处理,称为一遍。

3、简述编译程序的基本过程的任务。

编译程序的工作是指从输入源程序开始到输出目标程序为止的整个过程,整个过程可以划分5个阶段。

词法分析:输入源程序,进行词法分析,输出单词符号。

语法分析:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位,并判断输入串是否构成语法正确的“程序”。

中间代码生成:按照语义规则把语法分析器归约(或推导)出的语法单位翻译成一定形式的中间代码。

优化:对中间代码进行优化处理。

目标代码生成:把中间代码翻译成目标语言程序。

4、编译程序与解释程序的区别?

编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标程序,边解释边执行。

5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗?

编译程序的5个阶段中,词法分析,语法分析,语义分析和代码生成生成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标代码。

6、编译程序的分类

目前基本分为:诊断编译程序,优化编译程序,交叉编译程序,可变目标编译程序。 编译原理 作业参考答案

2

第2章 高级语言及其语法描述

1(P36)令文法为

N  DND

D  0129

(1)文法描述的语言L(G)是什么?

(2)给出句子34,568的最左推导和最右推导。

答:(1)

L(G)={为可带前导0的正整数}

或L(G)={(0129)+ }

或 L(G)={为数字串}

(2)

最左推导:NNDDD3D34

NNDNDDDDD5DD56D568

最右推导:NNDN4D434

NNDN8ND8N68D68568

2*.写出一个文法,使其语言是奇数集,且每个奇数是不以0开头。

答:

S  CAB|B (考虑了正负号)

A  1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | AA | A0 | 

B  1|3|5|7|9

C  +|-|

或:(未考虑正负号)

S  B | AB

B  1 | 3 | 5 | 7 | 9

A  AD | N

N  2 | 4 | 6 | 8 | B

D  0 | N

或:(未考虑正负号)

S  C | ABC

C  1 | 3 | 5 | 7 | 9

A  1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

B  BA | B0 |

2.(P36, 8)令文法为

E  TE+TE-T

T  FT*FT/F

F  (E)i

(1)给出该文法的VN、VT和S。

(2)给出i+i*i,i*(i+i)的最左推导和最右推导。

(3)给出i+i+i,i+i*i的语法树。

答:(1)

VN = { E, T, F }

VT = { +, -, *, /, (, ), i } 编译原理 作业参考答案

3

S = E

(2)

最左推导EE+TT+TF+Ti+Ti+T*Fi+F*Fi+i*Fi+i*i

ETT*FF*Fi*Fi*(E)i*(E+T)i*(T+T)i*(F+T)i*(i+T)

i*(i+F)i*(i+i)

最右推导EE+TE+T*FE+T*iE+F*iE+i*iT+i*iF+i*ii+i*i

ETT*FT*(E)T*(E+T)T*(E+F)T*(E+i)T*(T+i)T*(F+i)

T*(i+i)F*(i+i)i*(i+i)

⑵构造语法树

E

最左推导构造语法树

E + T

E + T i

T i

i

3.(P36, 9)证明下面的文法是二义的:

S  iSeS | iS  i

答:对于句子iiiei有两棵不同的语法树。因此该文法是二义的。

S  iSeS  iiSeS  iiieS  iiiei

S  iS  iiSeS  iiieS  iiiei 编译原理 作业参考答案

4

第3章 词法分析

1.设M=({x,y},{a,b},,x,{y})为一个非确定有限自动机NFA M,其中定义如下:

(x,a)={x,y}

(x,b)={y}

(y,a)=

(y,b)={x,y}

试构造其相应的最小化的确定有限自动机DFA M’。

答:由定义可知(x,a),(y,b)均为多值函数,所以是一个非确定有限自动机。

(1)根据函数值,先构造NFA M

(2)确定化:

① 构造DFA M’的转换矩阵:

I Ia Ib

{x} ① {x,y}

② {y} ③

{x,y} ② {x,y} ② {x,y} ②

{y} ③ {x,y} ②

② 确定DFA M’的初始状态和终态:

(a)转换矩阵中I列的第一个状态①为DFA M’的初始状态结点。

(b)含有y状态的子集均为DFA M’的终态结点(②、③为终态结点)。

③ 根据DFA M’的转换矩阵画出对应的状态转换图:

(3)最小化:

① 首先将其划分成终态集{2,3}和非终态集{1}

② {2,3}a={2} {2,3}, {2,3}b={2} {2,3} 编译原理 作业参考答案

5

因此{2,3}已是不可再区分的,所以该DFA M’已是最小化的。

2. (P64,7(1))构造正规式1(01)*101相应的DFA M。

答:(1)构造NFA M。

1(01)*101

1 (01)* 1 0 1

1   1 0 1

01

0

1   1 0 1

1

(2)构造转换矩阵

I I0 I1

{X} ① {1, 2, 3} ②

{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} ④

(3)由转换矩阵构造DFA M X Y

X 31 5 4 2 Y

X 1 2 3 4 5 Y X 3 5 1 4 Y 编译原理 作业参考答案

6

1001111101234560

3.(P64,12(a))将下图所示的NFA M转换为等价的DFA M’,并将该DFA’最小化。

答:

该有限自动机状态0输入同一字符a时到达两个不同的结点,所以是NFA。

(1)构造转换矩阵

I Ia Ib

{0} ① {0,1} ② {1} ③

{0,1} ② {0,1} ② {1} ③

{1} ③ {0} ①

(2)由转换矩阵构造DFA M

a

a

b

a

b

(3)将DFA M最小化

① 将DFA M的状态划分为非终态集{3}和终态集{1,2}

② 对每一个子集及每一个a进行考察;

{1,2}a = {2}  {1,2}

{1,2}b = {3}  {3}

因此{1,2}是不可区分的,所以最终状态为: {1,2},{3}

构造最小化的DFA M:

a

b 1 2,3 1 2

3