编译原理第二章习题

一、 问答题

问答第1题
  PL/0语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管理。


问答第2题
  若PL/0编译程序运行时的存储分配策略采用栈式动态分配,并用动态链和静态链的方式分别解决递归调用和非局部变量的引用问题,试写出下列程序执行到赋值语句b∶=10时运行栈的布局示意图。
  var x,y;
  procedure p;
   var a;
   procedure q;
    var b;
    begin (q)
     b∶=10;
    end (q);
   procedure s;
    var c,d;
    procedure r;
     var e,f;
     begin (r)
      call q;
     end (r);
    begin (s)
     call r;
    end (s);
   begin (p)
    call s;
   end (p);
  begin (main)
   call p;
  end (main).


问答第3题
  写出题2中当程序编译到r的过程体时的名字表table的内容。
name kind level/val adr size
         


问答第4题
  指出栈顶指针T,最新活动记录基地址指针B,动态链指针DL,静态链指针SL与返回地址RA的用途。


问答第5题
  PL/0编译程序所产生的目标代码是一种假想栈式计算机的汇编语言,请说明该汇编语言中下列指令各自的功能和所完成的操作。
  · INT 0 A
  · OPR 0 0
  · CAL L A


问答第6题
  给出对PL/0语言作如下功能扩充时的语法图和EBNF的语法描述。
  (1) 扩充条件语句的功能使其为:
  if〈条件〉then〈语句〉[else〈语句〉]
  (2) 扩充repeat语句为:
  repeat〈语句〉{;〈语句〉}until〈条件〉