编译原理作业集-第七章(DOC)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章语义分析和中间代码产生
本章要点
1. 中间语言,各种常见中间语言形式;
2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译;
3. 过程调用的处理;
4. 类型检查;
本章目标
掌握和理解中间语言,各种常见中间语言形式;各种语句到中间语言的翻译;以及类型检查等内容。
本章重点
1.中间代码的几种形式,它们之间的相互转换:四元式、三元式、逆波兰表示;
3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式;
4.各种控制流语句的翻译及其中间代码格式;
5.过程调用的中间代码格式;
6.类型检查;
本章难点
1. 各种语句的翻译;
2. 类型系统和类型检查;
作业题
一、单项选择题:
1. 布尔表达式计算时可以采用某种优化措施,比如A and B用if-then-else可解释为_______。
a. if A then true else B;
b. if A then B else false;
c. if A then false else true;
d. if A then true else false;
2. 为了便于优化处理,三地址代码可以表示成________。
a. 三元式
b. 四元式
c. 后缀式
d. 间接三元式
3. 使用三元式是为了________:
a. 便于代码优化处理
b. 避免把临时变量填入符号表
c. 节省存储代码的空间
d. 提高访问代码的速度
4. 表达式-a+b*(-c+d)的逆波兰式是________。
a. ab+-cd+-*;
b. a-b+c-d+*;
c. a-b+c-d+*;
d. a-bc-d+*+;
5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表示是_______。
a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=;
6. 在一棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。
a. 抽象语法树;
b. 语法规则;
c. 依赖图;
d. 三地址代码;
7. 按照教材中的约定,三地址语句if x relop y then L表示成四元式为。
a. (relop,x,y,L);
b. (relop,L,x,y);
c. (relop,x,L,y);
d. (L,x,y,relop);
8. 在编译程序中,不是常见的中间语言形式。
a.波兰式;
b. 三元式;
c. 四元式;
d. 抽象语法树;
9. 在编译程序中安排中间代码生成的目的是________。
a. 便于提高编译效率;
b. 便于提高分析的正确性;
c. 便于代码优化和目标程序的移植;
d.便于提高编译速度;
10. 按照教材中的约定,下面不是类型表达式:
a. boolean;
b. type-error;
c. real;
d. DAG;
11. 一个Pascal函数
function f ( a, b:char ) :↑integer;
……
其作用域类型是:
a. char×integer;
b. char×char;
c. char×pointer(integer);
d. integer×integer;
12. 因为标识符可用于多种情况,比如常量标识符、变量标识符、过程标识符等等。因此,在符号表中为了给出各个符号的标志,常给标识符引入一个属性kind,然后在相应产生式的语义动作中添加给kind属性赋值的语句。比如,在在产生式D id:T的语义动作中添加赋值语句id.kind= 。
a. V AR;
b. CONSTANT;
c. PROC;
d. FUNC;
13. 下面情况下,编译器需要创建一张新的符号表。
a. 过程调用语句;
b. 标号说明语句;
c. 数组说明语句;
d.记录说明语句;
14. 函数function f(a,b:char):↑integer;…
所以f函数的类型表达式为:
a. char×char→pointer(integer);
b. char×char→pointer;
c. char×char→integer;
d. char×char→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和offset分别保存尚未处理完的过程的和它们的offset,这两个栈顶的元素分别是正在处理的过程的的符号表指针和。
7. 在一些pascal的实现中,如果说明中出现了没有名字的类型表达式,编译器这样处理:建立一个来和每个声明的变量标识符相联系。
8. 赋值语句a:=b*-c+b*-c的后缀式为。
9. 多目运算X[i]:=y的三元式表示为两部分:________________和________________。
10. 编译器遇到常量说明时,要把常量值登录入并回送序号;在中为等号左边的标识符建立新条目,在该条目中填入常量标志、相应类型和常量表序号。11. 典型的转移条件语句:if E then S1 else S2中,作为转移条件的布尔表达式E,赋予它两种“出口”:一是;二是。
12. 类型表达式或者是,或者是作用在其它类型表达式上得到的新的类型表达式。
13. pascal变量说明:
var A:array[1..10] of integer
与A相关的类型表达式为:。
14. 若T是类型表达式,则pointer(T)是类型表达式,它表示类型。
15. 通过一遍扫描来产生布尔表达式和控制流语句的代码存在一个问题,就是当生成某些转移语句时可能还不知道该语句将要转移到的语句的地址是什么。采用的办法来解决这个问题。
二.1. 语义;2. (0): ( [ ]=, y, i ),(1): ( assign, x, (0) );3. 内部结点;4. 类型构造符;5. 计算逻辑值;作控制流语句中的条件表达式;6. 符号表指针,相对地址;7. 隐含的类型名;
8. a b c uminus * b c uminus * + assign;9. (0):(=[ ],x,i);(1):(assign,(0),y);10. 常量表;符号表;11. “真”出口,转向S1;“假”出口,转向S2;12. 基本类型;类型构造符;13. array(1..10, integer) ;14. “指向T类型对象的指针”;15. “拉链-回填”
三、判断题:
1. 中间代码是独立于机器的,复杂性介于源语言和机器语言之间,便于进行与机器无关调换代码优化工作。()