《编译原理与技术》练习题 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
语义规则