admin 管理员组

文章数量: 1086019


2025年1月1日发(作者:react副作用需要清除吗)

第6章 属性文法和语法制导翻译

7. 下列文法由开始符号S产生一个二进制数,令综合属性val给出该数的值:

试设计求的属性文法,其中,已知B的综合属性c, 给出由B产生的二进位的结果值。例如,

输入时,=,其中第一个二进位的值是4,最后一个二进位的值是。

【答案】

产生式

S→L

1

. L

2

S→L

语义规则

{ := + *2}

{ := }

{ :=*2+;

L→L

1

B

L. length:= +1 }

{ :=;

L→B

L. length:= 1 }

B→0

B→1

{ := 0 }

{ :=1 }

S→∣L

L→LB∣B

11. 设下列文法生成变量的类型说明:

L→ id L

L→, id L∣:T

(1) 构造一下翻译模式,把每个标识符的类型存入符号表;参考例。

【答案】

产生式

L→ id L

1

L→, id L

1

语义规则

{ := + *2}

{ := }

{ :=*2+;

L→ :T

L. length:= +1 }

{ :=;

T→ integer

L. length:= 1 }

T→ real { := 0 }

第7章 语义分析和中间代码产生

1. 给出下面表达式的逆波兰表示(后缀式):

【答案】

原式

(1) a*(-b+c)

(2) a+b*(c+d/e)

(3) –a+b*(-c+d)

(4) not A or not (C or not D)

(5) (A and B) or (not C or D)

ab-c+*

abcde/+*+

a-bc-d+*+

A not C D not or not or

A B and C not D or or

后缀式

(6) (A or B) and (C or not D and A B or C D not E and or and

E)

(7) if (x+y)*z=0

then (a+b)↑c

else a↑b↑c

if xy+z*0=

then ab+c↑

else ab↑c↑

3. 请将表达式-(a+b)*(c+d)-(a+b+c)分别表示成三元式、间接三元式和四元式序列。

【答案】

三元式

(1

)

+ a b

(2- (1) /

四元式

间接三元式

)

(1+ a b T1

(1+ a b

(3+ c d

)

)

)

(2- T1 / T2

(2- (1) /

(4* (2) (3)

)

)

)

(3+ c d T3

(3+ c d

(5+ a b

)

)

)

(4* T2 T3 T4

接码

(4* (2) (3)

(6+ (5) c

)

表:

)

)

(5+ a b T5

(1)

(5+ (1) c

(7- (4) (6)

)

→(2)

)

)

(6+ T5 c T6

→(3)

(6- (4) (5)

→(4)→(1)→(5)→(6)

)

)

(7- T4 T6 T7

4. 按节所说的办法,写出下

)

面赋值句A:=B*(-C+D) 的

自下而上语法制导翻译过程。给出所产生的三地址代

码。

【答案】

四元式

(1uminus c / T1

)

(2+ T1 D T2

)

(3* B T2 T3

5. 按照7.3.2节所给的翻译模式,把下列赋值句翻

)

译为三地址代码:

(4:= T3 / A

A[i, j]:=B [i, j] + C[A [k, l]] + d

)

[ i+j]

【答案】

中间代码

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

(9)

T

1

:=i*N

A2

T

1

:=T

1

+j

T

2

:=A-C

A

T

3

:=W

A

*T

1

T

4

:=i* N

B2

T

4

:=T

4

+j

T

5

:=B-C

B

T

6

:=W

B

*T

4

T

7

:=T

5

[T

6

]

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

(22)

(23)

(24)

中间代码

T

10

:=W

A

*T

8

T

11

:=T

9

[T

10

]

T

12

:=C-C

c

T

13

:=W

c

*T

11

T

14

:=T

12

[T

13

]

T

15

:=T

7

+ T

14

T

16

:=i+j

T

17

:=d-C

d

T

18

:=W

d

*T

16

T

19

:=T

17

[T

18

]

T

20

:=T

15

+ T

19

T

2

[T

3

]:=T

20

分别写出布尔式A or ( B and

not (C or D) )的四元式序列。

【答案】

用作数值计算时产生的四元式: 用作条件控制时产生的四元式:

四元式

(1

)

(2

)

(3

)

and B T

2

T

3

not T

1

/ T

2

or C D T

1

6. 按7.4.1和节的翻译办法,

(12) T

9

:=A-C

A

(10) T

8

:=k* N

A2

(11) T

8

:=T

8

+l

(4

)

or A T

3

T

4

(1)

四元式 四元式

( jnz, A, -, (5) ( jnz, C, -, (4))

0 )

其中:右图中(1)和(8)为真出口,

(4)(5)(7)为假出口。

(2)

(3)

( j, -, -, (3)) (6) ( j, -, -, (7))

(jnz, B, -, (7) ( jnz, D, -, (5))

(5))

(4) ( j, -, -, 0 ) (8) ( j, -, -, (1))

7. 用7.5.1节的办法,把下面的语句

翻译成四元式序列:

While A

if A=1 then C:=C+1

else while A≦D do

A:=A+2;

【答案】

四元式

(1) (j<, A, C, (9)

(3))

(2) ( j, -, -, 0) (10)

四元式

( j, -, -, (1))

( j≦, A,

D,(12))

(3) (j<, B, D, (11)

(5))

( j, -, -, (1))

(4)

(5)

( j, -, -, 0 ) (12)

(j=, A, 1, (13)

(7))

(+, A, 2, T

2

)

(:=,T

2

, -, A )

(6) ( j, -, -, (14)

(10) )

( j, -, -, (10))

(7) (+, C, 1, T

1

) (15) ( j, -, -, (1))

(8) (:=,T

1

, -, C )

第9章 运行时存储空间组织

4. 下面是一个Pascal程序:

program PP (input, output);

VAR k: integer;

FUNCTION F (n: integer): integer;

begin

if n<=0 then F:=1

else F:=n*F(n-1);

end;

当第二次( 递归地) 进入F后,DISPLAY的内容是什么当时整个运行栈的内容是什么

【答案】

第1次进入F后,运行栈的内容: 第2次进入F后,运行栈的内容:

10

9

8

7

6

5

4

3

2

1

0

4

0

F

n(形参)

1(形参个数)

2(全局display)

返回地址

0

k

0(display)

返回地址

0

主程序P

15

14

13

12

11

10

9

8

7

6

5

n(形参)

1(形参个数)

9(全局display)

返回地址

4

4

0

n(形参)

1(形参个数)

2(全局display)

返回地址

主程序P

第1次F

17

16

11

0

第2次F

4 0

3

k

2 0(display)

1 返回地址

0 0

第2次进入F后,Display内容为:

11

0

5. 对如下的Pascal程序,画出程序执行到(1)和(2)点时的运行栈。

program

output);

Tr (input,

VAR i: integer; d:

procedure B;

VAR c: char;

Begin

…(1)…

end; {B}

procedure C;

VAR t: real;

Begin

…(2)…

end; {C}

Begin

……

B;

【答案】

运行到(1) 时的运行栈:(静态链) 运行到(2) 时的运行栈:(静态链)

15

c

14

0(形参个数)

B

13

5

12

返回地址

11

5

10

p

A

9

k(形参)

8

1(形参个数)

7

0

Tr

6

返回地址

5

0

4

d

3

i

【答案】

2

0

运行到(1)

1

返回地址

(Display

0

0

到(2) 时的

(Display

20 c

19 13

18 5

B

15

c

14

0(形参个数)

C

13

5

12

返回地址

11

5

A

10

p

9

k(形参)

8

1(形参个数)

7

0

Tr

6

返回地址

5

0

4

d

3

i

2

0

时的运行栈:

1

返回地址

表) 运行

0

0

运行栈:

表)

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

0

0(形参个数)

10(全局display)

返回地址

5

p

5

0

k(形参)

1(形参个数)

2(全局display)

返回地址

0

d

i

20

19

18

17

16

15

14

13

12

11

10

9

t

13

5

0

0(形参个数)

10(全局display)

返回地址

5

p

5

0

k(形参)

1(形参个数)

2(全局display)

返回地址

0

d

i

0(display)

返回地址

0

句;

意的Pascal

知在运行时

单位对程序

行动态存储

主程序而调

行栈的内容

主程序

A

C

6. 有如下示

源程序,并已

8

7

6

5

4

3

2

1

0

0(display)

刻,以过程为

返回地址

中的变量进

0

分配。当运行

用过程语句X时,试分别给出以下时刻的运

和Display的内容。

(1) 已开始而尚未执行完毕标号为10的语

(2) 已开始而尚未执行完毕标号为11的语句;

program main;

VAR a, b, c: integer;

procedure X ( i, j: integer);

{X}

VAR d, e: real;

procedure Y; {Y}

VAR f, g: real;

Begin

……

10: Y;

……

11: Z;

……

end; {X}

【答案】

(1) 运行到标号10时,运行栈的内容: (2) 运行到标号11时,运行栈的内容:

26 j

25 i

Z

24 h

23 16

22 6

21 0

20 k

19 1(形参个数)

X (a, b)

18 12(全局display)

17 返回地址

16 6

main

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

g

f

16

6

0

0(形参个数)

12(全局display)

返回地址

6

e

d

6

0

j

i

2(形参个数)

2(全局display)

返回地址

0

c

b

a

0(display)

返回地址

0

15 e

14 d

13 6

Y

12 0

11 j

10 i

9 2(形参个数)

8 2(全局display)

X (a, b)

7 返回地址

main

main

→Y

main → X(a,b) →Y →Z

6

5

4

3

2

1

0

0

c

b

a

0 (display)

返回地址

0

→ X(a,b)

第10章 优化

1. 试把以下程序划分为基本块并作出其程序流图。

real C

【答案】

A:=0

real C

B:=1

A:=0

L1: A:=A+B

if B≧C goto L2

B:=B+1

L1: A:=A+B

2. 试把以下程序划分为基本块并作出其程序流图。

【答案】

real A, B

C:=A*A F:=1

D:=B*B C:=A*A

if C

E:=A*A

E:=A*A L1: E:=B*B

F:=F+1

F:=F+1 F:=F+2

E:=E+F

E:=E+F E:=E+F

write E

halt

L2: F:=F-1

L1: E:=B*B

3. 试对以下基本块B1和B2:

B1: A:=B*C

B2: B:=3

D:=A+C

E:=A*C

G:=B*F

H:=A+C

F:=1 real A,B

hal

D:=B/C

E:=A+D

F:=2*E

G:=B*C

分别应用DAG对它们进行优化,并就以下两种情况分别写出优化后的四元式序列:

(1) 假设只有G,L,M在基本块后面还要被引用;

(2) 假设只有L在基本块后面还要被引用。

【答案】

B1基本块:(1)

G, L, M可用

(2)

L可用

(1) G:=B*C

(2) H:=G*G

(3) L:=H*G

(1) G:=B*C

(2) H:=G*G

B2基本块:(1)

G, L, M可用

(2)

L可用

(1) D:=A+C

(2) E:=A*C

(3) G:=3*F

(4) J:=D+E

(1) D:=A+C

(2) E:=A*C

(3) J:=D+E


本文标签: 运行 产生 文法 翻译