编译原理龙书习题5,6,7,8章_第1页
编译原理龙书习题5,6,7,8章_第2页
编译原理龙书习题5,6,7,8章_第3页
编译原理龙书习题5,6,7,8章_第4页
编译原理龙书习题5,6,7,8章_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 语法制导的翻译,5.2.3 假设我们有一个产生式 。A,B,C,D这四个非终结符号都有两个属性:s是一个综合属性,而i是一个继承属性。对于下面的每组规则,指出(i)这些规则是否满足S属性定义的要求。(ii)这些规则是否满足L属性定义的要求。(iii)是否存在和这些规则一致的求值过程? 1)A.s = B.i + C.s 不满足S属性定义,满足L属性定义 2)A.s = B.i + C.s 和 D.i = A.i + B.s 不满足S属性定义,满足L属性定义 3)A.s = B.s + D.s 满足S属性定义,满足L属性定义 4)A.s=D.i,B.i=A.s+C.s,C.i=B.s和D

2、.i=B.i+C.i 不满足S属性定义,不满足L属性定义,5.2.4 这个文法生成了含“小数点”的二进制: 设计一个L属性的SDD来计算S.val,即输入串的十进制数值。比如,串101.11应该被翻译为十进制数5.635。提示:使用一个继承属性L.side来指明一个二进制位在小数点的哪一边。,为了求小数部分的值,引入L的综合属性b记录2的L 的位数次幂值(2 length of L) S L1.L2 S.val = L1.val +L2.val / L2.b; S L S.val = L.val; L L1 B L.val = L1.val *2 + B.val; L.b = L1.b*2;

3、L B L.val = B.val; L.b = 2; B 0 B.val = 0; B 1 B.val = 1;,5.3.1 下面是涉及运算符+和整数或浮点运算分量的表达式的文法。区分浮点数的方法是看它有无小数点。 1)给出一个SDD来确定每个项T和表达式E的类型。 2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数。,()设code 为综合属性,代表各非终结符的代码属性 type为综合属性,代表各非终结符的类型属性 inttoreal把整型值转换为相等的实型值 vtochar将数值转换为字符串,5.3.3

4、给出一个SDD对x*(3*x+x*x)这样的表达式求微分。表达式中涉及运算符+和*,变量x和常量。假设不进行任何简化,也就是说,比如3*x将被翻译为3*1+0*x。 exp 为原表达式的字符串,s 为求导后的字符串。 | 为串联接符。,5.4.3 下面的SDT计算了一个由0和1组成的串的值。它把输入的符号串当作按照正二进制数来解释。 改写这个SDT,使得基础文法不再是左递归的,但仍然可以计算出整个输入串的相同的B.val的值。,非终结符D的综合属性b表示二进制数的位数,val表 示对应的十进制数的数值。消除左递归后如下:,第6章 中间代码生成,6.1.1 为下面的表达式构造DAG (x+y)-

5、(x+y)*(x-y)+(x+y)*(x-y),6.2.1 将算术表达式 a+-(b+c) 翻译成 1)抽象语法树 2)四元式序列 3)三元式序列 4)间接三元式序列,1)抽象语法树:,2)四元式序列: 3)三元式序列: 4)间接三元式序列:,6.4.1 向图6-19的翻译方案中加入对应于下列产生式的规则: 1) 2),6.4.2 使用图6-20中的增量式翻译方案重复练习6.4.1,在增量方式中,gen不仅要构造出一个新的三地址指令,还要将它添加到至今为止已生成的指令序列之后。,6.4.3 使用使用图6-22所示的翻译方案来翻译下列赋值语句: 2) x = aij + bij 假设w1为数组a

6、的第一维的宽度,w2为数组b的第 一维的宽度,整数的宽度为w。 t1 = i * w1; t6 = j * w; t2 = j * w; t7 = t5 + t6; t3 = t1 + t2; t8 = bt7; t4 = at3; t9 = t4 + t8; t5 = i * w2; x = t9;,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=newl

7、abel() B.true=begin B.false = S.next S.code=label(begin)| S1.code| label(S1.next)| B.code,S-for ( S1; B; S2 ) S3 S1.next=newlabel() B.true=newlabel() begin=newlabel() B.fale=S.next 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.

8、true)|S3.code| gen(goto begin),6.7.7 使用图6-37中的翻译方案翻译下列表达式。给出每个子表达式的truelist和falselist。你可以假设第一条被生成的指令的地址是100。 1)a=b if (n2) return 1; s = f(n-1); t = f(n-2); return s+t; ,图7-9,活动树,第1个f(1)调用即将返回,第5个f(1)调用即将返回,7.2.5 在一个通过引用传递参数的语言中,有一个函数f(x,y)完成下面的计算: x = x + 1; y = y + 2; return x + y; 如果将a赋值为3,然后调用f(

9、a,a),那么返回值是什么? 函数返回值为:12 此时a的值为:6,第8章 代码生成,8.2.1 假设所有的变量都存放在内存中,为下面的三地址语句生成代码: 1) x = 1 LD R1 , 1 ST x , R1 3) x = a + 1 LD R1 , a ADD R1 , R1 , 1 ST x , R1,8.2.2 假设a和b是元素为4字节值的数组,为下面的三地址语句序列生成代码。 2)三个语句序列 x = ai y = bi z = x * y,LD R1 , i MUL R1 , R1 , 4 LD R2 , a(R1) ST x , R2 LD R3 , i MUL R3 , R

10、3 ,4 LD R4 , b(R3) ST y , R4 LD R5 , x LD R6 , y MUL R5 , R5 , R6 ST z , R5,8.2.4 假设x,y和z存放在内存位置中,为下面的语句序列生成代码: if x y goto L1 z = 0 goto L2 L1:z = 1,LD R1 , x LD R2 , y SUB R1 , R1 , R2 BLTZ R1 , L1 LD R3 , 0 ST z , R3 JMP L2 L1:LD R4 , 1 ST z , R4,8.2.6 确定下列指令序列的代价。 1) LD R0 , y 2 LD R1 , z 2 ADD

11、R0 , R0 , R1 1 ST x , R0 2 总代价:7 3) LD R0 , c 2 LD R1 , i 2 MUL R1 , R2 , 8 2 ST a(R1) , R0 2 总代价:8,8.3.3 假设使用栈式分配,且假设a和b都是元素大小为4字节的数组,为下面的三地址语句生成代码。 2)三个语句序列 x = ai y = bi z = x*y,LD R1 , i MUL R1 , R1 , 4 ADD R1 , R1 , SP LD R2 , a(R1) ST x(SP) , R2 LD R3 , i MUL R3 , R3 , 4 ADD R3 , R3 , SP LD R4

12、 , b(R3) ST y(SP) , R4 LD R5 , x(SP) LD R6 , y(SP) MUL R5 , R5 , R6 ST z(SP) ,R5,8.5.1 为下面的基本块构造DAG。 d = b*c e = a+b b = b*c a = e-d,1)只有a在基本块的出口处活跃: d = b * c e = a + b a = e - d,2)a,b,c在基本块的出口处活跃: e = a + b b = b * c a = e - b,8.5.8 假设一个基本块由下面的C语言赋值语句生成: x = a+b+c+d+e+f; y = a+c+e; 1)给出这个基本块的三地址语句

13、(每个语句只做一次加法)。 t1 = a + b t2 = t1 + c t3 = t2 + d t4 = t3 + e t5 = t4 + f x = t5 t6 = a + c t7 = t6 + e y = t7,2)假设x和y都在基本块的出口处活跃,利用加法的结合律和交换律来修改这个基本块,使得指令个数最少。 把原始的赋值语句进行调整: x = a+c+e+b+d+f y = a+c+e 对应的三地址语句序列:,t1 = a + c t2 = t1 + e t3 = t2 + b t4 = t3 + d t5 = t4 + f x = t5 t6 = a + c t7 = t6 + e

14、 y = t7,DAG,优化后的三地址语句序列: t1 = a + c y = t1 + e t3 = y + b t4 = t3 + d x = t4 + f,优化后的目标代码序列: LD R1 , a LD R2 , c ADD R1 , R1 , R2 LD R2 , e ADD R1 , R1 , R2 ST y , R1 LD R2 , b ADD R1 , R1 , R2 LD R2 , d ADD R1 , R1 , R2 LD R2 , f ADD R1 , R1 , R2 ST x , R1,8.6.1 为下面的每个C语言赋值语句生成三地址代码 1)x = a + b * c; t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论