编译原理课后答案(陈火旺) 下载本文

课后答案网 http://www.khdaw.com

T18:=4*T16 T19:=T17[T18] T20:=T7+T19 Tn:=T20

******************/

P218–6

100. (jnz, A, -, 0) 101. (j, -, -, 102) 102. (jnz, B, -, 104) 103. (j, -, -, 0) 104. (jnz, C, -, 103) 105. (j, -, -, 106) 106. (jnz, D, -, 104) --假链链首 107. (j, -, -, 100) --真链链首 假链:{106,104,103} 真链:{107,100}

P218–7

100. (j<, A, C, 102) 101. (j, -, -, 0) 102. (j<, B, D, 104) 103. (j, -, -, 101) 104. (j=, A, ‘1’, 106) 105. (j, -, -, 109) 106. (+, C, ‘1’, T1) 107. (:=, T1, -, C) 108. (j, -, -, 100) 109. (j≤, A, D, 111) 110. (j, -, -, 100) 111. (+, A, ‘2’, T2) 112. (:=, T2, -, A) 113. (j, -, -, 109) 114. (j, -, - 100)

P219–12

/******************** (1)

MAXINT – 5 MAXINT – 4 MAXINT – 3 MAXINT – 2 MAXINT – 1 MAXINT

课后答案网 http://www.khdaw.com

课后答案网 http://www.khdaw.com

(2)翻译模式 方法1:

for E1 := E2 to E3 do S

S?F do MS1F?For I:?E1 to E2I?idM??S?F do MS1

{backpatch(S1.nextlist,nextquad);

backpatch(F.truelist,M.quad);

emit(F.place ‘:=’F.place ‘+’1);

emit(‘j?,’F.place ‘,’F.end ‘,’M.quad); S.nextlist := F.falselist; }

{F.falselist:= makelist(nextquad);

F?For I:?E1 to E2

I?id

****************/ 方法2:

S→ for id:=E1 to E2 do S1 S→ F S1

F→ for id:=E1 to E2 do F?forid:?E1toE2do

M??

emit(‘j>,’E1.place ‘,’E2.place ‘,0’); emit(I.Place ‘:=’E1.place); F.truelist := makelist(nextquad); emit(‘j,-,-,-’); F.place := I.place; F.end := E2.place; }

{p:=lookup(id.name); if p <> nil then I.place := p else error}

{M.quad := nextquad}

{

INITIAL=NEWTEMP; emit(‘:=,’E1.PLACE’, -,’ INITIAL); FINAL=NEWTEMP; emit(‘:=,’E2.PLACE’, -,’ FINAL); p:= nextquad+2;

emit(‘j,’ INITIAL ‘,’ FINAL ’,’ p); F.nextlist:=makelist(nextquad);

课后答案网 http://www.khdaw.com

课后答案网 http://www.khdaw.com

emit(‘j,-,-,-’);

F.place:=lookup(id.name); if F.placenil then

emit(F.place ‘:=’ INITIAL) F.quad:=nextquad; F.final:=FINAL; }

S?FS1 {

backpatch(S1.nextlist, nextquad) p:=nextquad+2;

emit(‘j,’ F.place‘,’ F.final ’,’ p );

S.nextlist := merge(F.nextlist, makelist(nextquad)); emit(‘j,-,-,-’); emit(‘succ,’ F.place ’, -,’ F.place); emit(‘j,-,-,’ F.quad); }

第九章

P270–9

(1) 传名

即当过程调用时,其作用相当于把被调用段的过程体抄到调用出现处,但必须将其中出现的任一形式参数都代之以相应的实在参数。 A:=2; B:=3; A:=A+1; A:=A+(A+B); print A; ∴A=9 (2) 传地址

即当程序控制转入被调用段后,被调用段首先把实在参数抄进相应的形式参数的形式单元中,过程体对形参的任何引用或赋值都被处理成对形式单元的间接访问。当被调用段工作完毕返回时,形式单元(都是指示器)所指的实参单元就持有所希望的值。 ①A:=2;B:=3;T:=A+B

②把T,A,A的地址抄进已知单元J1,J2,J3

③x:=J1;y:=J2;z:=J3 //把实参地址抄进形式单元,且J2=J3 ④Y↑:=y↑+1

Z↑:=z↑+x↑ // Y↑:对y的间接访问 Z↑:对z的间接访问 ⑤print A A=8

(3) 得结果

每个形参均对应两个单元,第一个存放实参地址,第二个存放实参值,在过程体中对形参的

课后答案网 http://www.khdaw.com

课后答案网 http://www.khdaw.com

任何引用或赋值都看成是对它的第二个单元的直接访问,但在过程工作完毕返回前必须把第二个单元的内容放到第一个单元所指的那个实参单元中 ①A:=2;B:=3;T:=A+B

②把T,A,A的地址抄进已知单元J1,J2,J3 ③x1:=J1;x2:=T; y1:=J2;y2:=A;

z1:=J3;z2:=A; //将实参的地址和值分别放进两个形式单元中 ④y2:=y2+1; z2:=z2+x2; //对形参第二个单元的直接访问

⑤x1↑:=x2; y1↑:=y2; z1↑:=z2 //返回前把第二个单元的内容存放到第一个单元所

指的实参地址中

⑥print A A=7

(4) 传值

即被调用段开始工作时,首先把实参的值写进相应的形参单元中,然后就好像使用局部变量一样使用这些形式单元 A:=2; B:=3; x:=A+B y:=A z:=A y:=y+1 z:=z+x print A A=2

过程调用不改变A的值

第十章

P306-1

课后答案网 http://www.khdaw.com