编译原理第6章习题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

t1 = i * w1; t2 = j * w; t3 = t1 + t2; t4 = a[t3]; t5 = i * w2;
t6 = j * w; t7 = t5 + t6; t8 = b[t7]; t9 = t4 + t8; x = t9;
6.5.1 c 和d是字符型,s和t是短整型,i和j为整型,x是浮点型。 翻译下列表达式。 1)x = s + c { 执行的顺序为: maxtype = max( s.type, c.type )=integer; a1 = widen (s.addr, short, integer); a2 = widen (c.addr, char, integer); 所以,生成的三地址码为 a1 = (integer) s; t1= new Temp(); a2 = (integer) c; gen(t1 ‘=‘ a1 ‘+’ a2);} t1 = a1 +a2; t2 = (float) t1; x.type = float; x =t2; t2= new Temp(); gen( t2 ‘=‘ ‘(float)’ t1 ); gen( x.addr ‘=‘ t2);
第6章习题答案
作业: 6.1.1 6.2.1 6.4.1 6.4.2 6.4.3 6.6.1
6.7.1 (1) 补充习题1
第6章 中间代码生成
6.1.1 为下面的表达式构造DAG ((x+y)-((x+y)*(x-y)))+((x+y)*(x-y))
6.2.1 将算术表达式 a+-(b+c) 翻译成
源自文库
6.7.1 使用图6-37中的翻译方案翻译下列表达 式。给出每个子表达式的truelist和falselist。 你可以假设第一条被生成的指令的地址是 100。
1)a==b&&(c==d||e==f)
100: if a==b goto 102 101: goto __ 102: if c==d goto __ 103: goto 104 104: if e==f goto __ 105: goto __
3) x = (s + c) * (t + d) 生成的三地址码为: a1 = (integer)s; a2 = (integer)c; t1 = a1+a2; a3 = (integer)t; a4 = (integer)d; t2 = a3+a4; t3 = t1*t2; //整型数据相乘 t4 = (float) t3; //转成浮点数存放到临时变量t4中 x = t4;
1)抽象语法树 2)四元式序列 3)三元式序列 4)间接三元式序列
1)抽象语法树:
2)四元式序列:
3)三元式序列:
4)间接三元式序列:
6.4.1 向图6-19的翻译方案中加入对应于下列产生式的规则: 1) E E1 * E2 2) E E1 (单目加)
E.addr = E1.addr E.code = E1.code
补充习题1:用本节所给的翻译模式(采用回填)翻译语句: if (a<b || c<d && e<f ) A1 else A2; while (a<b) A3 ; 假定语句序号从100起算,又假定A1、A2、A3语句各生成10条指令。
100 if a<b goto 106 101 goto 102 102 if c<d goto 104 103 goto 117 104 if e<f goto 106 105 goto 117 106 107 . A1 . 115 116 goto 127 117 118 A2 . . 126 127 if a<b goto 129 128 goto 140 129 130 A3 . . 138 139 goto 127 140 141 142 143 144 145
S-->for ( S1; B; S2 ) S3 S1.next=newlabel() B.true=newlabel() B.fasle=S.next begin=newlabel() S2.next =S1.next S3.next=begin S.code=S1.code||label(S1.next)|| B.code||label(begin)|| S2.code|| gen('goto' S1.next)|| label(B.true)||S3.code|| gen('goto' begin)
6.6.1 在图6-30的语法制导定义中添加处理下列 控制流构造的规则: 1)一个repeat语句,repeat S while B 2)一个for循环语句,for (S1 ; B ; S2) S3
S-->repeat S1 while B begin=newlabel() S1.next=newlabel() B.true=begin B.false = S.next S.code=label(begin)|| S1.code|| label(S1.next)|| B.code
例如:+3
6.4.2 使用图6-20中的增量式翻译方案重复练习6.4.1
{E.addr = E1.addr}
在增量方式中,gen不仅要构造出一个新的三地址指令,还 要将它添加到至今为止已生成的指令序列之后。
6.4.3 使用使用图6-22所示的翻译方案来翻译下 列赋值语句: 2) x = a[i][j] + b[i][j] 假设w1为数组a的第一维的宽度,w2为数组b 的第一维的宽度,整数的宽度为w。
相关文档
最新文档