《编译原理》课后习题答案第八章
问题 7:
下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果 为整数,否则为实数。
E? TR
R ?+ TR|ε
T?num.num | num a)给出语法制导定义
确定每个子表达式的类型。
b) 把表达式翻译成前缀形式,并且决定类型。试用一元运算符 inttoreal 把整型值转换为相 等的实型值,以使得前缀表达式中两个运算对象是同类型的。
答案:
a)设 type 是综合属性,代表各非终结符的“类型”属性 设 in 是继承属性,
翻译方案
产生式 E?T R R?+ 语义规则 {R.i:=T.type} {E.Type:=R.s} T {IF (R.i=integer) and (T.type=integer) THEN R1.i:=integer ELSE R1.i :=real} R1 R?ε T?num.num T?num {R.s:=R1.s} {R.s:=R.i} T.type:=real T.type:=integer
b) 设属性 s 和 i 用于传递属性 type,属性 t 和 j 用于传递属性 val。
盛威网(www.snwei.com)专业的计算机学习网站 16
《编译原理》课后习题答案第八章
翻译方案
产生式 E?T R
语义规则 {R.i:=T.type} {R.j:=T.val} {E.Type:=R.s} {E.val:=R.t} {IF (R.i=integer) and (T.type=integer) THEN BEGIN R1.i:=integer Print(?+?,R.j,T.val) R1.j:=R.j+T.val END ELSE BEGIN R1.i :=real IF R.i=integer THEN Begin R.i:=real R.j:=inttoreal(R.j) End IF T.type=integer THEN Begin T.type:=real T.val:=inttoreal(T.val) End Print(?+?,R..j,T.val) R1.j :=R.j+T.val END} R1 {R.s:=R1.s} {R.t:=R1.t} {R.s:=R.i} {R.t:=R.j} {T.type:=real} {T.val:=num.num.lexval} {T.type:=integer} {T.val:=num.lexval} R?+T R?ε T?num.num T?num
盛威网(www.snwei.com)专业的计算机学习网站 17
《编译原理》课后习题答案第八章
问题 8:
翻译算术表达式 a*- (b+c)为 a)一棵语法树 b)后缀式 c)三地址代码
* uminus
+ b
c
答案:
a
a) 语法树: b) 后缀式: a b c + uminus * c)三地址代码:
t1 := b + c t2 := - t1 t3 := a * t2
问题 9:
翻译算术表达式 –(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):对应的四元式为:
(0) (1) (2) (3) (4) (5) (6)
op + uminus + * + + + arg1 a t1 c t2 a t5 t4 arg2 b result t1 t2 d t3 b c t6 t3 t4 t5 t6 t7
盛威网(www.snwei.com)专业的计算机学习网站 18
《编译原理》课后习题答案第八章
b):对应的三元式为:
(0) (1) (2) (3) (4) (5) (6) op + Uminus + * + + + arg1 a (0) c (1) a (4) (3) arg2 b d (2) b c (5)
c):对应的间接三元式为:
statement (0) (1) (2) (3) (4) (5) (6) 15 16 17 18 15 19 20 15 16 17 18 19 20 op + uminus + * + + arg1 a 15 c 16 15 18 arg2 b d 17 c 19
问题 10:
将下列赋值语句译成三地址代码。
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 t15 := t13[t14] t21 := i*20 t22 := t21+j t23 := B-84; t24 := 4*t22 t25 := t23[t24] t31 := k*20 t32 := t31+l
//A[i,j]
//B[i,j]
盛威网(www.snwei.com)专业的计算机学习网站 19
《编译原理》课后习题答案第八章
t33 := A-84 t34 := 4*t32 t35 := t33[t34] t36 := 4*t35 t37 := C-4 t38 := t37[t36] t41 := i+j t42 := 4*t41 t43 := D-4 t44 := t43[t42] t1 := t25 +t38 t2 := t1 + t44 t23[t24] := t2
//A[k,l]
//C[A[k,l]]
//D[i+j]
问题 11:
写出 for 语句的翻译方案
答案:
产生式 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.init := initial.place E.final := final.place
E?v:=initial to final
盛威网(www.snwei.com)专业的计算机学习网站 20