清华大学本科生考试试题《编译基本知识》.pdf
*清清华华大大学学本本科科生生考考试试试试题题专专用用纸纸考试课程编译原理(A 卷)2007 年 7 月 3 日学号:姓名:一一.(15%15%)简答题)简答题1(3%)图1 是支持嵌套过程说明的语言 PL0的一段程序。若每个作用域栈都有各自的符号表,则在编译器处理到/*here*/时,哪些作用域是开作用域?哪些作用域是闭作用域?作用域栈的栈顶对应哪个作用域?注:该段程序包含下列作用域a,x,y,p,rzx,s,tv2(3%)如下是一个类 Pascal 程序片断。试分别给出遵循静态作用域规则和动态作用域规则时运行该段程序时的输出结果。var r:realprocedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;beginr:=0.25;show;small;writeln;show;small;writeln;end.const a=25;var x,y;procedurep;varz;beginend;procedurer;var x,s;procedure t;varv;beginend;begin/*here*/end;beginend.图 1作用域与可见性*注:write(r:5:3)表示按照一定格式(总宽度为5,小数点后有三位数字)输出 r;writeln 表示输出一个换行符。3(3%)若按照某种运行时组织方式,如下函数 p 被激活时的过程活动记录如图 2 所示。其中 d是动态数组。static int N;Offset=30+2Nde的 的 d 的 的 的d 的 的 的 的 N的Offset=30Offset=28Offset=27Offset=26void p(int a)cOffset=6float b;bfloat c10;Offset=4float dN;aOffset=3float e;的 的 的 的Offset=0的 2的 的 的 的试指出函数 p 中访问 di(0 i N)时相对于活动记录基址的Offset值如何计算?若将数组 c 和 d 的声明次序颠倒,则di(0 i d goto(1)(7)e:=c-a(8)a:=c(9)if a A.Max)error(“add”)elseA.Result:=A.v1+A.v2 C if(C.Val C.Max)error(“literal”)elseC.Result:=C.Val 其中,+,*,(,)和 int 是终结符。1.试变换上述翻译模式,使嵌在产生式中间的语义规则集中仅含复写规则,并使得在自底向上的LR分析和翻译过程中,文法符号的所有继承属性均可以通过归约前已出现在分析栈中的确定的综合属性进行访问。注:只需要给出变化的部分。2.根据1中变换后的翻译模式,如果在LR分析过程中进行自底向上的翻译,文法符号的所有继承属性均可以通过归约前已出现在分析栈中的综合属性进行访问。试写出在按每个产生式归约时语义处理的一个代码片断(设语义栈由向量 Stack 表示,归约前栈顶位置为 top;终结符 int 对应的语义值 int.Val 是其对应的词法分析结果的整数值,而每个非终结符的综合属性都只对应一个语义值,可用 Stacki.Val 或 Stack i.Result 访问;print()为输出常数的语义函数;error()为发生溢出时退出处理的语义函数)。注:不要考虑对 top 的维护,并且假定在一次归约时所有语义动作完成后分析/翻译引擎才对 top 进行维护。*