编译原理龙书习题5678章.ppt
《编译原理龙书习题5678章.ppt》由会员分享,可在线阅读,更多相关《编译原理龙书习题5678章.ppt(38页珍藏版)》请在三一文库上搜索。
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.i=B.i+C.i不满足S属性定义,不满足L
2、属性定义 2021/6/1615.2.4 这个文法生成了含“小数点”的二进制:设计一个L属性的SDD来计算S.val,即输入串的十进制数值。比如,串101.11应该被翻译为十进制数5.635。提示:使用一个继承属性L.side来指明一个二进制位在小数点的哪一边。2021/6/162为了求小数部分的值,引入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;L B L.val=B.val;L.b=2;B 0
3、B.val=0;B 1 B.val=1;2021/6/1635.3.1 下面是涉及运算符+和整数或浮点运算分量的表达式的文法。区分浮点数的方法是看它有无小数点。1)给出一个SDD来确定每个项T和表达式E的类型。2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数。2021/6/1642021/6/165()设code 为综合属性,代表各非终结符的代码属性 type为综合属性,代表各非终结符的类型属性 inttoreal把整型值转换为相等的实型值 vtochar将数值转换为字符串 2021/6/1662021/6/
4、1672021/6/1685.3.3 给出一个SDD对x*(3*x+x*x)这样的表达式求微分。表达式中涉及运算符+和*,变量x和常量。假设不进行任何简化,也就是说,比如3*x将被翻译为3*1+0*x。exp 为原表达式的字符串,s 为求导后的字符串。|为串联接符。2021/6/1692021/6/16102021/6/16115.4.3 下面的SDT计算了一个由0和1组成的串的值。它把输入的符号串当作按照正二进制数来解释。改写这个SDT,使得基础文法不再是左递归的,但仍然可以计算出整个输入串的相同的B.val的值。2021/6/1612非终结符D的综合属性b表示二进制数的位数,val表示对应
5、的十进制数的数值。消除左递归后如下:2021/6/1613第6章 中间代码生成6.1.1 为下面的表达式构造DAG (x+y)-(x+y)*(x-y)+(x+y)*(x-y)2021/6/16146.2.1 将算术表达式 a+-(b+c)翻译成1)抽象语法树2)四元式序列3)三元式序列4)间接三元式序列2021/6/16151)抽象语法树:2021/6/16162)四元式序列:3)三元式序列:4)间接三元式序列:2021/6/16176.4.1 向图6-19的翻译方案中加入对应于下列产生式的规则:1)2)2021/6/16186.4.2 使用图6-20中的增量式翻译方案重复练习6.4.1在增量
6、方式中,在增量方式中,gengen不仅要构造出一个新的三地址指令,还不仅要构造出一个新的三地址指令,还要将它添加到至今为止已生成的指令序列之后。要将它添加到至今为止已生成的指令序列之后。2021/6/16196.4.3 使用使用图6-22所示的翻译方案来翻译下列赋值语句:2)x=aij+bij假设w1为数组a的第一维的宽度,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;2021/6/16206.6.1 在图6-30的语法制导定义中添加处理下列控制
7、流构造的规则:1)一个repeat语句,repeat S while B2)一个for循环语句,for(S1;B;S2)S3S-repeat S1 while Bbegin=newlabel()S1.next=newlabel()B.true=beginB.false=S.nextS.code=label(begin)|S1.code|label(S1.next)|B.code2021/6/1621S-for(S1;B;S2)S3S1.next=newlabel()B.true=newlabel()begin=newlabel()B.fale=S.nextS2.next=S1.nextS3.n
8、ext=beginS.code=S1.code|label(S1.next)|B.code|label(begin)|S2.code|gen(goto S1.next)|label(B.true)|S3.code|gen(goto begin)2021/6/16226.7.7 使用图6-37中的翻译方案翻译下列表达式。给出每个子表达式的truelist和falselist。你可以假设第一条被生成的指令的地址是100。1)a=b&(c=d|e=f)2021/6/1623100:if a=b goto 100:if a=b goto 102102101:goto 101:goto _ _ 102:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 习题 5678
