编译作业第七章答案 7.1翻译算术表达式a*.(b+心)为 a:一棵语法树 b):后数式 c):三地址代码 解:a: b):abc+uminus* c):t:=b+c 也=-t1 t=a*t2 7.2翻译算术表达式-(a+b)*(c+d+(a+b+c)为 a):四元式 b:三元式 c:间接三元式 解:先写出三地址代码为: t:=a+b 3=.1 3=c+d t5:=a+b t6:=ts+c t.=14+t6 a:对应的四元式为: (1 uminus (6) + b):对应的三元式为:
编译作业第七章答案 7.1 翻译算术表达式 a*- (b+c)为 a):一棵语法树 b):后缀式 c):三地址代码 解:a): * a uminus + b c b):a b c + uminus * c):t1 := b + c t2 := - t1 t3 := a * t2 7.2 翻译算术表达式 –(a+b)*(c+d) +(a+b+c) 为 a):四元式 b):三元式 c):间接三元式 解:先写出三地址代码为: t1 := a + b t2 := - t1 t3 := c + d t4 := t2 * t3 t5 := a + b t6 := t5 + c t7: = t4 + t6 a):对应的四元式为: op arg1 arg2 result (0) + a b t1 (1) uminus t1 t2 (2) + c d t3 (3) * t2 t3 t4 (4) + a b t5 (5) + t5 c t6 (6) + t4 t6 t7 b):对应的三元式为:
op argl 40 Uminus (4) c:对应的间接三元式为 statement op arg2 uminus 15 2 17 3 20 7.4修改图7.4中计算说明语句中的名字和类型及相对地址的翻译模式,以允许在形如 D→d:T的说明中可用一串名号 表来代单个名字 解 生式 动作 P offset=0! D>D:D D→idL L>id.L L→:T (L.type=Ttype L.width:=T.width) T今integer Lwidth T>real T→array [num]of Ti al T T今T 7.8利用7.3节的翻译模式将下列赋值语句译成三地址代码。 Ali.il:=Bliil+CAlkI+Dli+il 解: t1=i*20 t2=11 t13=A-84 t14=4*t12
op arg1 arg2 (0) + a b (1) Uminus (0) (2) + c d (3) * (1) (2) (4) + a b (5) + (4) c (6) + (3) (5) c):对应的间接三元式为: statement op arg1 arg2 (0) 15 15 + a b (1) 16 16 uminus 15 (2) 17 17 + c d (3) 18 18 * 16 17 (4) 15 19 + 15 c (5) 19 20 + 18 19 (6) 20 7.4 修改图 7.4 中计算说明语句中的名字和类型及相对地址的翻译模式,以允许在形如 D→id : T 的说明中可用一串名字表来代替单个名字。 解: 产生式 动作 P→ D {offset := 0} D→D;D D→id L {enter(id.name , L.type , offset) offset := offset + L.width} L→id , L1 {L.type := L1.type L.width := L1.width enter(id.name , L1.type , offset) offset := offset + L1.width } L→:T {L.type := T.type L.width := T.width} T→integer {T.type := integer T.width := 4} T→real {T.type := real T.width := 8} T→array [num] of T1 {T.type:=array(num.val , T1.Type T.width := num.val * T1.Width) T→^T1 {T.type := pointer(T1.type) T.width := 4} 7.8 利用 7.3 节的翻译模式将下列赋值语句译成三地址代码。 A[i,j] :=B[i,j] + C[A[k,l]] + D[i+j] 解: t11 := i * 20 t12 := t11+j t13 := A-84; t14 := 4*t12
n5=th3[t4] WA[iil 21=*20 t23=B-84 24:=4*22 25=23[4 //B(i.j] B1:=k*20 t34:=4*t32 t35 :=t33[t4] //A[k.I] t36=4*t35 B7:=C-4 38=t37[B6 //CIA[k.I] 41=ij t42=4*t41 t3:=D-4 t44=t442 D[i+j] =t+t4 224=t2 7.9题略 解: :程序将依次输出MAXINT5-、MAXINT4-、MAXINT,其中每一个数字占 行。 MAXINT-5 MAXINT-4 MAXINT -3 MAXINT-2 MAXINT-I MAXINT 0 产生式 动作 S→forE do Sl S.begin:=newlabel S.curr-newtem gen"ifS.first>”S.last“goto”S.next) gen(s.curr c(S.curr) ecn2oto”S.begin) E今v:-initial to final E.init initial.place E.final :final.place
t15 := t13[t14] //A[i,j] t21 := i*20 t22 := t21+j t23 := B-84; t24 := 4*t22 t25 := t23[t24] //B[i,j] t31 := k*20 t32 := t31+l t33 := A-84 t34 := 4*t32 t35 := t33[t34] //A[k,l] t36 := 4*t35 t37 := C-4 t38 := t37[t36] //C[A[k,l]] t41 := i+j t42 := 4*t41 t43 := D-4 t44 := t43[t42] //D[i+j] t1 := t25 +t38 t2 := t1 + t44 t23[t24] := t2 7.9 题略 解: a):程序将依次输出 MAXINT-5、MAXINT-4、.、MAXINT,其中每一个数字占一 行。 MAXINT -5 MAXINT -4 MAXINT -3 MAXINT -2 MAXINT -1 MAXINT b): 产生式 动作 S→for E do S1 S.begin := newlabel S.first := newtemp S.last := newtemp S.curr:= newtemp S.code:=gen(S.first “:=” E.init) ||gen(S.last “:=” E.final) ||gen(“if” S.first “>” S.last “goto” S.next) ||gen(S.curr “:=” S.first) ||gen(S.begin “:” ) ||gen(“if ” S.curr “>” S.Last “goto” S.next) ||S1.code ||gen(S.curr := succ(S.curr)) ||gen(“goto” S.begin) E→v:=initial to final E.init := initial.place E.final := final.place