编译原理作业集 第七章Word格式.docx

上传人:b****2 文档编号:455178 上传时间:2023-04-28 格式:DOCX 页数:30 大小:187.62KB
下载 相关 举报
编译原理作业集 第七章Word格式.docx_第1页
第1页 / 共30页
编译原理作业集 第七章Word格式.docx_第2页
第2页 / 共30页
编译原理作业集 第七章Word格式.docx_第3页
第3页 / 共30页
编译原理作业集 第七章Word格式.docx_第4页
第4页 / 共30页
编译原理作业集 第七章Word格式.docx_第5页
第5页 / 共30页
编译原理作业集 第七章Word格式.docx_第6页
第6页 / 共30页
编译原理作业集 第七章Word格式.docx_第7页
第7页 / 共30页
编译原理作业集 第七章Word格式.docx_第8页
第8页 / 共30页
编译原理作业集 第七章Word格式.docx_第9页
第9页 / 共30页
编译原理作业集 第七章Word格式.docx_第10页
第10页 / 共30页
编译原理作业集 第七章Word格式.docx_第11页
第11页 / 共30页
编译原理作业集 第七章Word格式.docx_第12页
第12页 / 共30页
编译原理作业集 第七章Word格式.docx_第13页
第13页 / 共30页
编译原理作业集 第七章Word格式.docx_第14页
第14页 / 共30页
编译原理作业集 第七章Word格式.docx_第15页
第15页 / 共30页
编译原理作业集 第七章Word格式.docx_第16页
第16页 / 共30页
编译原理作业集 第七章Word格式.docx_第17页
第17页 / 共30页
编译原理作业集 第七章Word格式.docx_第18页
第18页 / 共30页
编译原理作业集 第七章Word格式.docx_第19页
第19页 / 共30页
编译原理作业集 第七章Word格式.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

编译原理作业集 第七章Word格式.docx

《编译原理作业集 第七章Word格式.docx》由会员分享,可在线阅读,更多相关《编译原理作业集 第七章Word格式.docx(30页珍藏版)》请在冰点文库上搜索。

编译原理作业集 第七章Word格式.docx

9.在编译程序中安排中间代码生成的目的是。

a.便于提高编译效率;

b.便于提高分析的正确性;

c.便于代码优化和目标程序的移植;

d.便于提高编译速度;

10.按照教材中的约定,下面不是类型表达式:

a.boolean;

b.type-error;

c.real;

d.DAG;

11.一个Pascal函数

functionf(a,b:

char):

1integer;

其作用域类型是:

a.charxinteger;

b.charxchar;

c.charxpointer(integer);

d.integerxinteger;

12.因为标识符可用于多种情况,比如常量标识符、变量标识符、过程标识符等等。

因此,

在符号表中为了给出各个符号的标志,常给标识符引入一个属性kind,然后在相应产生式的

语义动作中添加给kind属性赋值的语句。

比如,在在产生式D>

id:

T的语义动作中添加赋

值语句id.kind=。

a.VAR;

b.CONSTANT;

c.PROC;

d.FUNC;

13.下面情况下,编译器需要创建一张新的符号表。

a.过程调用语句;

b.标号说明语句;

c.数组说明语句;

d.记录说明语句;

14.函数functionf(a,b:

char):

finteger;

所以f函数的类型表达式为:

a.charxchar^pointer(integer);

b.charxchar^pointer;

c.charxchar^integer;

d.charxchar^integer(pointer)

15.如果一个语言的编译器能保证编译通过的程序,在运行时不会出现类型错误,则称该语

a.静态的;

b.强类型的;

c.动态的;

d.良类型的;

一.答案:

1.b

2.d;

3.b

4.d

5.c;

6.c.;

7.a;

8.a;

9.c;

10.d

11.b

12.a;

13.d;

14.a;

15.b;

、填空题:

1.语法分析是依据语言的语法规则进行的,中间代码产生是依据语言的规则进行

的。

2.多目运算x:

=y[i]的三元式表示为两部分:

和。

3.生成三地址代码时,临时变量的名字对应抽象语法树的。

4.一个类型表达式或者是基本类型,或者由施加于其它类型表达式组成。

5.在程序设计语言中,布尔表达式有两个基本的作用:

一个是;

另一个是。

6.允许嵌套过程的语言,其过程说明语句的翻译用两个栈tblptr和ofset分别保存尚未处理

完的过程的和它们的ofset,这两个栈顶的元素分别是正在处理的过程的的符

号表指针和。

7.在一些pascal的实现中,如果说明中出现了没有名字的类型表达式,编译器这样处理:

建立一个来和每个声明的变量标识符相联系。

8.赋值语句a:

=b*-c+b*-c的后缀式为。

9.多目运算X[i]:

=y的三元式表示为两部分:

10.编译器遇到常量说明时,要把常量值登录入并回送序号;

在中

为等号左边的标识符建立新条目,在该条目中填入常量标志、相应类型和常量表序号。

11.典型的转移条件语句:

ifEthenS1elseS2中,作为转移条件的布尔表达式E,赋予它两

种出口”一是;

二是。

12.类型表达式或者是,或者是作用在其它类型表达式上得到的新的

类型表达式。

13.pascal变量说明:

varA:

array[1..1O]ofinteger

与A相关的类型表达式为:

_

14.若T是类型表达式,贝Upointer(T)是类型表达式,它表示类型。

15.通过一遍扫描来产生布尔表达式和控制流语句的代码存在一个问题,就是当生成某些转

移语句时可能还不知道该语句将要转移到的语句的地址是什么。

采用的办

法来解决这个问题。

二.1.语义;

2.(0):

([]=,y,i),

(1):

(assign,x,(0));

3.内部结点;

4.类型构造符;

5.计算逻辑值;

作控制流语句中的条件表达式;

6.符号表指针,相对地址;

7.隐含的类型名;

8.abcuminus*bcuminus*+assign;

9.(0):

(=[],x,i);

(1):

(assign,(0),y);

10.常量表;

符号表;

11.真”出口,转向S1;

假”出口,转向S2;

12.基本类型;

类型构造符;

13.

array(1..10,integer);

14.指向T类型对象的指针”;

15.拉链—回填”

三、判断题:

1.中间代码是独立于机器的,复杂性介于源语言和机器语言之间,便于进行与机器无关调换代码优化工作。

()

2.在程序设计语言中,一般来说,布尔表达式仅仅用于条件、循环等控制流语句中的条件表达式计算。

3.回填”技术用于对过程中的说明语句进行处理时把计算出的有关符号的属性填入符号表。

4.如果E是一个常量或变量,则E的逆波兰式是E自身。

5.对于任何一个编译程序来说,中间代码的产生是不一定必要的。

()

6.由于三元式中的三个域中,仅有两个域与地址有关,所以,三元式不是严格意义上的三地址代码。

7.两个类型表达式要么是同样的基本类型,要么是同样的类型构造符作用于结构等价的类

型,我们就说,这两个类型系统等价。

8.对于Pascal这样允许嵌套过程的语言,每当遇到过程说明D—;

procid;

D1;

S时,便创建

一张新的符号表,也就是说,让每个过程说明都有自己一张独立的符号表。

9•记录类型的各个域变量分配存储区域的地址的确定是相对于为记录类型变量所分配存储区域的首地址的,所以记录类型不应该建立自己的符号表。

10.类型表达式中不可出现类型变量,即类型变量值不是类型表达式。

11.所谓类型系统就是把类型表达式赋给语言各相关结构成分的规则的集合。

同一种语言

(比如C++语言)的编译程序,在不同的实现系统里(比如微软的VisualC++和Linux下的

开源编译器TCC),可能使用不同的类型系统。

12.四元式表示的是四地址代码,三元式表示的是三地址代码。

13.生成三地址代码时,临时变量的名字对应抽象语法树的内部结点。

14.后缀式是抽象语法树的线性表示形式,后缀式是树结点的一个序列,其中每个结点都

是在所有子结点之后立即出现的。

15.后缀表示形式只是用于表达式的,其他的语法结构比如条件语句、循环语句等不能使用后缀式。

三•答案:

1.;

2.X;

3.X;

4.;

5.;

6.X;

7.;

8.;

9.X;

10.X;

11.;

12.X;

13.;

14.;

15.X;

四、名词解释:

1.三地址代码;

2.回填;

3.类型表达式;

4.类型系统;

5.静态语义检查四•答案:

1.三地址代码是由下面一般形式的语句构成的序列:

x:

=yopz。

其中x、y、z为名字、常

数或编译时产生的临时变量;

op代表运算符号如定点运算符、浮点运算符、逻辑运算符等

等,每个语句的右边只能有一个运算符。

2.通过一遍扫描来产生布尔表达式和控制流语句的代码的主要问题在于,当生成某些转移语句时我们可能还不知道该语句将要转移到的标号是什么。

为了解决这个问题,可以在生成

形成分支的跳转指令时,暂时不确定跳转目标,而建立一个链表,把转向这个目标的跳转指

令的标号键入这个链表,一旦目标确定之后再把它填入有关的跳转指令中。

这种技术称为回

填。

3.一个类型表达式或者是基本类型,或者由类型构造符施于其他类型表达式组成。

基本类型和类型构造符都因具体语言的不同而不同。

I.一个基本类型是一个类型表达式。

n.类型名是一个类型表达式

川.类型构造符作用于类型表达式,其结果仍然是类型表达式

IV.类型表达式中可出现类型变量,即变量值是类型表达式。

4.所谓类型系统就是把类型表达式赋给语言各相关成分的规则的集合。

同一种语言的编译程序,在不同的实现系统里,可能使用不同的类型系统。

5.静态语义检查就是编译过程中进行的语义检查。

主要工作有:

类型检查、控制流检查、

致性检查、相关名字检查,还有名字的作用域分析等。

五、简答题:

1.四元式和三元式有什么不同?

2.为什么要使用中间代码的表示形式?

3.现在有四种程序设计语言:

PASCAL、FORTRAN、C和BASIC。

要求在A、B、C和D

四种机器上都能编译这四种语言,而编译程序需要在中间语言级别上进行优化处理。

问:

要编制多少个编译程序的前后端接口?

4.为什么三元式没有存放计算结果的单元?

5.过程调用语句在翻译的时候,如何处理参数传递的问题(只考虑传递实在参数地址的情况)?

P200.

五.答案:

1.一个四元式是一个带有四个域的记录结构,分别为op,argl,arg2,result。

四元式之间的联系是通过临时变量来实现的,更改一个四元式表很容易,因此对中间代码进

行优化处理时比较方便。

一个三元式是一个带有三个域的记录结构,分别为op,arg1,arg2。

三元式之间的联系

是通过指针来实现的,更改一个三元式表没有四元式表那样容易,但是,对中间代码进行优

化处理时,四元式和间接三元式同样方便。

2.使用中间代码有如下好处:

(1)中间形式与具体机器无关,把与机器特性紧密相关的内容尽可能放到后端,有利于目标重定位,一种中间形式可以为生成多种不同型号目标机上的目标代码服务。

(2)可以对中间代码进行与机器无关的优化,有利于提高目标代码的质量。

(3)使各阶段的开发复杂性降低,有利于编译程序的开发。

3.由于各种不同的程序设计语言都有很多不同的特点,所以,若有m种不同的程序设计语

言,就会有m个前端。

这时,如果有n种不同的机器,也就会有n个后端。

从理论上讲,

如果要移植一个现有的编译程序到另外一台新机器上,只需要重新编写它的后端即可。

现在有四种程序设计语言:

PASCAL、FORTRAN、C和BASIC,那么可以得到四个前

端:

有A、B、C和D四种机器,要求在每种机器上都能编译上述四种语言,只需要根据四种不同机器的特点为每种语言构造四个后端就行了。

所以要在A、B、C和D四种机器上都

能编译上述四种语言,总共需要编制16个前后端的接口即可。

4.由于中间语言(包括三元式)是用来辅助生成目标代码的,并不会真正进行计算,也就

不需要一个临时单元存放结果,那么在编制后面的三元式时如果要用到这些运算结果,可以用这些三元式的编号来代替。

六、应用题:

1.已知产生布尔表达式的语法定义如下:

E-

-E!

orE2

-EfandE2

亠notEf

-(Ed

—id1relopid2

-id1

 

a写出翻译模式;

b画出语法树(语义动作也表示在其中);

c通过对语法树的遍历,写出对布尔表达式a<

borc<

dande<

f生成的三地址代码。

1.答案:

见教材

P187,图7.14。

E-E1orE2

{E.place:

=newtemp;

emit(E.place'

:

='

E1.place'

or'

E2.place)}

E-E1andE2

and'

E-notE1

'

not'

E1.place)}

E-(E1)

E-id1relopid2

=E1.place}

emit('

ifid1.placerelop.opid2.place'

goto'

nextstat+3);

0'

);

nextstat+2);

1'

)}

E-id1

=id.place}

100

ifa<

bgoto103

101

T1:

=0

102

goto104

103

=1

104

ifc<

dgoto107

105

T2:

106

goto108

107

108

ife<

fgoto111

109

T3:

110

goto112

111

112

T4:

=T2andT3

113

T5:

=T1orT4

2.画出赋值语句a:

=b*-c+b*-c的抽象语法树和DAG图,并写出它的后缀式表示法。

2.答案:

见教材P168,图7.3。

后缀式表示法:

abcuminus*bcuminus*+assign

3.翻译算术表达式a*-(b+c)为

a):

—棵语法树

b):

后缀式

c):

三地址代码

3.答案:

(1)

(2)后缀式:

abc+uminus

(3)三地址代码序列为:

t1:

=b+c

t2:

=-t1

t3:

=a*t2

4.翻译算术表达式-a+b)*(c+d)+(a+b+c)为

四元式

三元式

间接三元式

4.答案:

(1)四元式序列为:

op

arg1

arg2

result

+

a

b

t1

c

d

t2

*

t3

uminus

t4

t5

t6

t7

(2)三元式序列为:

(2)

(3)

(3)间接三元式表示:

statement

(11)

(12)

(13)

(11)1

(14)

13

(15)

(16)

(14)1

(15)1

5.已知数组翻译模式如下:

(1)S—L:

=E

{ifL.offset=nullthen//简单变量emit(L.place‘:

='

E.place)

]'

‘:

E.place)}

+'

E2.place)}

else〃数组元素

emit(L.place‘['

L.offset

(2)E—;

E1+E2

{E.place:

=newtemp;

emit(E.place‘:

E1.place

⑷E>

L

{ifL.offset=nullthen

E.place:

=L.place

elsebegin

(5)L—;

Elist]

{L.place:

emit(L.place‘:

Elist.arrak);

L.offset:

emit(L.offset‘:

w‘*'

Elist.place)}

⑹L-id

=id.place;

=null}⑺Elist—Elistl,E

{t:

m:

=Elistl.ndim+1;

emit(t‘:

Elistl.ndim‘*'

limit(Elist1.array,m));

t‘+'

E.place);

Elist.array:

=Elistl.array;

Elist.place:

=t;

Elist.ndim:

=m}

(8)Elist—id[E

{Elist.place:

=E.place;

E.ndim:

=1;

=id.place}

利用该翻译模式对下面赋值语句:

A[i,j]:

=B[i,j]+C[A[k,l]]+D[i+j]。

(1)画出并注释语法分析树;

(2)翻译成三地址代码;

5.答案:

对于C语言的数组,每维的下界约定为0。

例如,对A[10,20]来说,A[0,0]是第

元素,A[i,j]的相对地址为:

base+(i*n2+j)*w

三地址序列如下:

t11:

=

i*20

t12:

t11+j

t13:

A-84;

t14:

4*t12

t15:

t13[t14]

〃A[i,j]

t21:

i*20

t22:

t21+j

t23:

B-84;

t24:

4*t22

t25:

t23[t24]

〃B[i,j]

t31:

k*20

t32:

t31+l

t33:

A-84

t34:

4*t32

t35:

t33[t34]

〃A[k,l]

t36:

4*t35

t37:

C-4

t38:

t37[t36]

〃C[A[k,l]]

t41:

i+j

t42:

4*t41

t43:

D-4

t44:

t43[t42]

〃D[i+j]

t1:

=t25+t38

=t1+t44

t23[t24]:

=t2

注:

A,B,C,D分别表示数组A,B,C,D的基地址。

6.试把下列C语言程序的可执行语句

main(){

inti;

inta[10];

while(i<

=10)

a[i]=0;

}

翻译为:

(1)一棵语法树,

(2)后缀式,(3)三地址代码。

6•答案:

(2)后缀式为:

i10<

=ai[]0=while

从理论上可以说while(i<

=10)a[i]=0;

的后缀式如上面表示。

但若这样表示,在执行while

操作时,赋值语句已经执行,这显然与语义不符,因此改为:

=<

下一个语句开始地址>

BMai[]0=<

本语句始址>

BRL

其中BM操作为当表达式为假时转向<

下一个语句开始地址>

,BRL是一个一目运算,无条

件转向<

本语句始址>

(3)三地址代码序列为:

100ifi<

=10goto102

101goto106

102t1:

=4*i

103t2:

=a

104t2[t1]:

=0

105goto100

7.已知布尔表达式翻译成三地址代码的翻译模式如下:

EtE1orE2{E.place:

=newtemp;

EtE1andE2{E.place:

EtnotE1{E.place:

E1.place)}

Et(E1){E.place:

=E1.place}

Etid1relopid2{E.place:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2