龙书 第八章课后作业答案
Mε{M.quad := nextquad}
S→if E then M1 S1 N else M2 S2
{backpatch(E.truelist, M1.quad);
backpatch(E.falselist, M2.quad);
S.nextlist:=merge(S1.nextlist, N.nextlist, S2.nextlist) }
E.falselist:=makelist(nextquad+1);
emit(‘j’relop.op‘,’id 1.place‘,’id 2.place‘,’‘0’);
emit(‘j,-,-,0’) }
E→E1 and M E2
{ backpatch(E1.truelist, M.quad);
E.truelist:=E2.truelist;
emit(‘j,-,-,0’) }
while语句
Swhile M1 E do M2 S1
{backpatch(S1.nextlist,M1.quad);
backpatch(E.truelist,M2.quad);
S.nextlist:=E.falselist;
emit(‘goto’M1.quad)}
1.把下列语句翻译成三地址代码
while a > 10 do
if b = 100 then
while a < 20 do
a := ,a,10,102
参考部分翻译模式如下
答题时不必写出来
while a > 10 do
if b = 100 then
while a < 20 do
emit(E.place‘:=’E1.place‘op’E2.place)}
101
j,_,_,?
102
j>,c,d,104
103
j,_,_,101
104
j=,b,100, 106
105
j,_,_,109
106
T1=a/b
107
a=T1
108
j,_,_,103
109
T2=a*b
110
a=T2
111
M→{ M.quad:=nextquad }
N→{ N.nextlist:=makelist(nextquad);
emit(‘j,-,-,-’) }
赋值语句
S→id:=E{ p:=lookup();
if pnil then
emit(p‘:=’E.place)
else error }
E→E1opE2 { E.place:=newtemp;
if语句
Sif E then M S1
{backpatch(E.truelist, M.quad)
S.nextlist:=merge(E.falselist, S1.nextlist)}
Mε{M.quad := nextquad}
赋值语句
S→id:=E{ p:=lookup();
if pnil then
j>,a,10,102
参考部分翻译模式如下
答题时不必写出来
if a>10 and c>d then
if b=100 then a := a / b
else a := a * b
用到的翻译模式如下:
布尔表达式
E→id1 relop id2 { E.truelist:=makelist(nextquad);
105
j,_,_,100
106
:=,a,b,T1
107
-,T1,1,T2
108
:=,T2,_,a
109
j,_,_,104
110
j,_,_,100
111
2.把下列语句翻译成三地址代码
if a>10 and c>d then
if b=100 then a := a / b
else a := a * b
100
E.falselist:=merge(E1.falselist,E2.falselist) }
M→{ M.quad:=nextquad }
if语句
Sif E then M S1
{backpatch(E.truelist, M.quad)
S.nextlist:=merge(E.falselist, S1.nextlist)}
emit(p‘:=’E.place)
else error }
E→E1opE2 { E.place:=newtemp;
emit(E.place‘:=’E1.place‘op’E2.place)}
101
j,_,_,111
102
j=,b,100, 104
103
j,_,_,100
104
J<,a,20,106
a := a + b – 1
用到的翻译模式如下:
布尔表达式
E→id1 relop id2 { E.truelist:=makelist(nextquad);
E.falselist:=makelist(nextquad+1);
emit(‘j’relop.op‘,’id 1.place‘,’id 2.place‘,’‘0’);