编译原理与技术练习题汇总 下载本文

《编译原理与技术》练习题 17

7.12 使用访问链(参考7.5.2节)分别画出下面Pascal程序执行到 (1) 第1次调用r之后的运行时栈的内容; (2) 第2次调用r之后的运行时栈的内容;

program pascal1; procedure p; var x: integer; procedure q;

procedure r; begin

x := 2; ...... if ... then p;

end; { r }

begin

r;

end; { q } begin q; end; { p } begin { pascal1 } p; end.

7.13 使用显示表display重做练习7.12。

7.14 对下面的Pascal程序,分别画出程序执行到点(1)和(2)时刻的运行时栈的内容。

program pascal2 (input, output); var i: integer; d: integer; procedure a ( k: real );

var p: char; procedure b;

var c: char;

《编译原理与技术》练习题 18

begin

...(1)...

end: {b}

procedure c;

var t: real; begin

...(2)...

end: {c}

begin

...... b; c; ......

end; {a}

begin { pascal2 }

...... a (d); ......

end.

7.15 使用显示表display重做练习7.14。

7.16 实现栈式动态存储管理的一个问题是,如何分配空闲块。请考虑有几种空闲块的分配策略,并比

较每个策略的优缺点。

7.17 了解面向对象语言(如面向对象Pascal、C++、C#、Java)是如何实现垃圾搜集任务的。 7.18 存储紧缩有时也称为“单空间复制”,以区别双空间复制,请指出两者的相同之处和差异。 7.19 为以下的C++类画出对象的存储器框架和虚拟函数表(参考7.6.3节):

class A { public: int a;

virtual void f(); virtual void g();

《编译原理与技术》练习题 19

}

};

class B: public A { public: int b;

virtual void f(); void h(); };

class C: public B { public: int c;

virtual void g();

《编译原理与技术》练习题 20

练习 8

8.1 语义分析的基本任务是什么?请简单说明它们可以在编译的哪些阶段或者由编译的哪些模块完

成?

8.2 考虑下列无符号数的简单语法:

number ? digit number | digit digit ? 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

写出计算number整数值的属性规则。

8.3 根据下列文法,给出求十进制浮点数的值的语义规则(提示:用属性count表示小数点后的数字

数目):

num ? num.num num ? num digit | digit

digit ? 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

8.4 考虑下面的简单的Pascal风格的声明:

decl ? var-list:type

var-list ? var-list,id | id

type ? integer | real

(1)为它设计一个计算变量类型的属性文法; (2)为每个产生式对应的属性文法划一个依赖图; (3)为声明a, b, c: real画出属性依赖图。

8.5 修改例8.4中的文法G8.3,使之只用综合属性就可以计算based-num的值。 8.6 考虑下列属性文法:

文法规则

S ? ABC

B.u := S.u A.u := B.v + C.v S.v := A.v

A ? a B ? b C ? c

A.v := 2*A.u B.vl := B.u C.v := 1

语义规则