当一个过程作为参数被传递时,我们假定有以下三种与此相联系的环境可以考虑,下面的Pascal程序是用来说明 这一问题的。一种是词法环境(lexical environment),如此这样的一个过程的环境是由在这一过程定义之处的各标识符的绑定所构成;一种是传递环境(passing environment),是由这一过程作为参数被传递之处的各标识符的绑定所构成;另一种是活动环境(activation environment),是由这一过程活动之处的各标识符的绑定所构成。试考虑在第(11)行上的作为一个参数被传递的函数f。利用对于f的词法环境、 传递环境和活动环境,在第(8)行上的非局部量m将分别处在第(6)行、(10)行和(3)行上的m的说明的作用域中。 (a)试给出程序的输出。 (b)试为此程序画出活动树。 (c)分别图示出采用词法环境和活动环境执行到过程f时运行栈的变化及访问链。 (1) program param(input,output); (2) procedure b(function h(n: integet ) : integer ); (3) var m : integer ; (4) begin m:=3; writeln(h(2)) end { b} ; (5) procedure c; (6) var m : integer ; (7) function f(n : integer ) : integer (8) begin f:= m+n end { f } ; (9) procedure r; (10) var m : integer; (11) begin m :=7; b(f) end { r } ; (l2) begin m := 0; r end { c } ; (13) begin (14) c (15) end .