第08章 语法制导翻译和中间代码生成(4)

2019-01-10 12:39

《编译原理》课后习题答案第八章

问题 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


第08章 语法制导翻译和中间代码生成(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中国海洋大学西方经济学考研真题答案详解

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: