编译原理个人作业--第九章——基于 编译原理 国防工业出版社 第三版

4

program PP(input, output)
    VAR k:integer;
    FUNCTION F(n:integer): interger
    begin
        if n <= 0 then F := 1
        else F := n * F(n-1);
    end;
begin
    K := F(10);
    ...
end

第二次递归进入F后,DISPLAY内容是什么?运行栈内容是什么?

Display内容

0
11

运行栈

函数位置数据
main00
main1返回地址
main20(display)
main3K
F(10)40(SP)
F(10)5返回地址
F(10)62(全局display)
F(10)71(形参个数)
F(10)8n(形参)
F(10)90(display)
F(10)104(display)
F(9)114
F(9)12返回地址
F(9)139(全局display)
F(9)141(形参个数)
F(9)15n(形参)
F(9)160(display)
F(9)1711(display)

5

对如下程序,画出运行到1和2的运行栈

program Tr(input, output);;
    VAR i:integer; d:integer;
    procedure A(k:real);
        VAR p:char;
        procedure B;
            VAR c:char;
            Begin
                ...(1)
            end;{B}
        procedure C;
            VAR t:real;
            Begin
                ...(2)
            end;{C}
        Begin
            ...
            B;
            C;
            ...
        end;{A}
    Begin{main}
        ...
        A(d);
        ...
    end.

(1)

位置数据
00
1返回地址
20
3i
4d
50(动态链指向0)
6返回地址
70(静态链接指向0)
81(形参个数)
9k(形参)
10p
115(SP,同时也是动态连接)
12返回地址
135(静态链接指向5)
140(参数个数)
15c(TOP)

(2)

位置数据
00
1返回地址
20
3i
4d
50(动态链指向0)
6返回地址
70(静态链接指向0)
81(形参个数)
9k(形参)
10p
115(SP,同时也是动态连接)
12返回地址
135(静态链接指向5)
140(参数个数)
15t(TOP)

6

program main;
    VAR a, b, c: integer
    procedure X(i, j: integer);
        VAR d, e: real;
        procedure Y;
            VAR, f, g: real;
            Begin
            ...
            End;{Y}
        procedure Z(k: integer);
            VAR h, I, j: real;
            Begin
            ...
            end;{Z}
        Begin
            ...
            10: Y;
            ...
            11: Z;
            ...
        end;{X}
    begin
        ...
        X(a, b);
        ...
    end.{main}

给出以下运行栈和display内容

(1)开始而未执行标号10的语句

display

display
0
6
16

stack内容

位置数据
00
1返回地址
20
3a
4b
5c
60(指向0)
7返回地址
82(全局display)
92(形参个数)
10i
11j
120(display)
136(display)
14d
15e
166(指向6)
17返回地址
1812(全局display)
190(形参个数)
200(display)
216(display)
2216(display)
23f
24g

(2)开始而未执行标号11的语句

display
0
6
16

stack

位置数据
00
1返回地址
20
3a
4b
5c
60(指向0)
7返回地址
82(全局display)
92(形参个数)
10i
11j
120(display)
136(display)
14d
15e
166(指向6)
17返回地址
1812(全局display)
191(形参个数)
20k
210(display)
226(display)
2316(display)
24h
25I
26j

9

procedure P(X, Y, Z);
    begin
        Y := Y + 1;
        Z := Z + X;
    end P;
    begin
        A := 2;
        B := 3;
        p(A + B, A, A);
        print A
    end

求以下参数传递方法情况,输出的A

(1) 名字

A := 2
B := 3
A := A + 1
A := A + (A + B)
所以A == 9

(2) 地址

A := 2
B := 3
T := A + B


T,A,A的地址传入J1,J2,J3
x := J1
y := J2
z := J3


y = y + 1 (这时候相当于A+=1 变为3)
z = z + x  (A = A+T)

所以 A == 8

(3) 得结果

A := 2
B := 3
T := A + B


T,A,A的地址传入J1,J2,J3
x1 := J1
y1 := J2
z1 := J3
x2 := T
y2 := A
z2 := A

(y2 = 3, z2 = 7)
y2 := y2 + 1
z2 := z2 + x2

x1 := x2
y1 := y2
z1 := z2

所以A == 7

(4)传值

A := 2
B := 3

x:=A+B
y:=A
z:=A

y:=y+1
z:=z+x

A==2(A不受影响)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值