编译原理作业集-第七章
第七章 语义分析和中间代码产生
本章要点
1. 中间语言,各种常见中间语言形式;
2. 说明语句赋值语句布尔表达式控制语句的翻译;
3. 过程调用的处理;
4. 类型检查;
本章目标
掌握和理解中间语言,各种常见中间语言形式类型检查等内容。
本章重点
1.中间代码的几种形式,它们之间的相互转换:四元式、三元式、逆波兰表示3.赋值语句算术表达式、布尔表达式的翻译及其中间代码格式4.各种控制流语句的翻译及其中间代码格式5.过程调用的中间代码格式6.类型检查本章难点
2. 类型系统和类型检查;
作业题
一、单项选择题:
1. 布尔表达式计算时可以采用某种优化措施,比如A and B用if-then-else可解释为。
a. if A then true else Bb. 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. 使用三元式是为了:
便于代码优化处理 b. 避免把临时变量填入符号表
节省存储代码的空间 提高访问代码的速度
4. 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. VAR; 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.。tblptr和offset分别保存尚未处理完的过程的 和它们的offset,这两个栈顶的元素分别是正在处理的过程的的符号表指针和 。
7. 在一些pascal的实现中,如果说明中出现了没有名字的类型表达式,编译器这样处理:建立一个 来和每个声明的变量标识符相联系。
8. 赋值语句a:=b*-c+b*-c的后缀式为 。
9. 多目运算