编译原理龙书第二版第56章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第五章练习5.1.1:对于图5-1中的SDD,给出下列表达式对应的注释语法分析树:1)(3+4)*(5+6)n练习5.2.4:这个文法生成了含“小数点”的二进制数:S-L.L|LL-LB|BB-0|1设计一个L属性的SDD来计算S.val,即输入串的十进制数值。比如,串101.101应该被翻译为十进制的5.625。提示:使用一个继承属性L.side来指明一个二进制位在小数点的哪一边。答:元文法消除左递归后可得到文法:S-L.L|LL-BL’L’-BL’|εB-0|1使用继承属性L.side指明一个二进制位数在小数点的哪一边,2表示左边,1表示右边使用继承属性m记录B的幂次非终结符号L和L’具有继承属性inh、side、m和综合属性syn产生式语义规则1)S-LS.val=L.syn;L.side=2;L.m=1;L.inh=02)S-L1.L2L1.side=2;L2.side=1;L1.inh=0;L1.m=1;L2.m=1/2;L2.inh=0S.val=L1.syn+L2.syn;3)L-BL’L’.m=L.m*L.m;L’.side=L.sideL’.inh=L.inh*L.side+B*L.mL.syn=L’.syn4)L’-BL1’L1’.m=L’.m*L’.m;L1’.side=L’.sideL1’.inh=L’.inh*L’.side+B*L1’.mL’.syn=L1’.syn5)L’-εL’.syn=L’.inh6)B-0B.val=07)B-1B.val=1练习5.3.1:下面是涉及运算符+和整数或浮点运算分量的表达式文法。区分浮点数的方法是看它有无小数点。E-〉E+T|TT-〉num.num|num1)给出一个SDD来确定每个项T和表达式E的类型2)扩展(1)中得到的SDD,使得它可以把表达式转换成为后缀表达式。使用一个单目运算符intToFloat把一个整数转换为相等的浮点数答:(1)产生式语义规则1)E-E1+TIfE1.type==T.typethenE.type=E1.typeelseE.type=float2)E-TE.type=T.type3)T-numT.type=integer4)T-num.numT.type=float(2)产生式语义规则1)E-E1+TIfE1.type==T.typethenE.type=E1.typeElsebeginE.type=floatIf(E1.type==integerandT.type==float)thenE1=intToFloat(E1)Elseif(T.type==integerandE1.type==float)thenT=intToFloat(T)ENDE.val=E1.valT.val+2)E-TE.type=T.type;E.val=T.val3)T-numT.type=integer;T.val=num4)T-num.numT.type=float;T.val=num.num练习5.4.4:为下面的产生式写出一个和例5.10类似的L属性SDD。这里的每个产生式表示一个常见的C语言中的那样的控制流结构。你可能需要生成一个三地址语句来跳转到某个标号L,此时你可以生成语句gotoL1)S-if(C)S1elseS22)S-doS1while(C)3)S-’{’L‘}’;L-LS|ε请注意,列表中的任何语句都可以包含一条从它的内部跳转到下一个语句的跳转指令,因此简单地为各个语句按序生成代码是不够的。答:产生式语义规则1)S-if(C)S1elseS2C.false=NewLable();C.true=NewLable()S1.next=S2.next=S.nextS.code=C.code||Lable(C.true)||S1.code||gen(‘goto’S.next)||Lable(C.false)||S2.code2)S-doS1while(C)Begin=NewLable()C.false=NewLable();C.true=NewLable()S1.next=beginS.code=Lable(begin)||S1.code||Lable(C.true)||gen(‘goto’begin)3)S-’{’L‘}’;L-L1SL-εS.syn=L.syn;S.inh=L1.syn;L.syn=S.synL.inh=L.syn第六章练习6.1.1:为下面的表达式构造DAG((x+y)-((x+y)*(x-y)))+((x+y)*(x-y))答:DAG如下练习6.2.1:将算术表达式a+-(b+c)翻译成XY+*--+1)抽象语法树2)四元式序列3)三元式序列4)间接三元式序列答:(1)抽象语法树(2)四元式序列t1=b+ct2=minust1t3=a+t2opArg1Arg2result0+bcT11minusT1T22+aT2T3(3)三元式序列opArg1Arg20+bc1minus(0)2+a(1)(4)间接三元式序列instruction练习6.4.3:使用图6-22中的翻译方案,来翻译下列赋值语句x=a[i][j]+b[i][j]答:假定数组a,b均为2*3规模的整型数组,且一个整数的宽度为4x=a[i][j]+b[i][j]的注释语法分析树如下10(0)11(1)12(2)opArg1Arg20+bc1minus(0)2+a(1)+aminus+bcx=a[i][j]+b[i][j]被翻译成的三地址代码如下如下练习6.6.4:使用图6.6.5节中介绍的避免goto语句的翻译方案,来翻译下列表达式:If(a==b&&c==d||e==f)x==1;答:练习6.7.1:使用图6-43中的翻译方案翻译下列表达式。给出每个子表达式的truelistE.addr=t9E.addr=t4+E.addr=t8L.addr=t3L.array=aL.type=integerL.addr=t7L.array=bL.type=integerL.addr=t1L.type=array(3,integer)L.array=a[E.addr=j][E.addr=i]a.type=array(2,array(3,integer))L.addr=t5L.array=bL.type=array(3,integer)b.type=array(2,array(3,integer))[E.addr=i]jii[E.addr=j]jSX=T1=i*12T5=i*12T2=j*4t6=j*4T3=t1+t1t7=t5+t6T4=a[t3]t8=b[t7]T9=t4+t8X=t9Ife==fgotoL2ifFalsea==bgotoL1ifFalsec==dgotoL1L2:x==1L1:和falselist。你可以假设第一条被生成的指令地址是100.a==b&&(c==d||e==f)答:构造表达式的注释语法分析树如下各产生式进行归约时产生的语义动作的相应指令如下1)按B-E1relE2将a==b归约为B时语义动作相应的指令如下100:ifa==bgoto–101:goto–2)产生式B-B1&&MB2中的标记非终结符号M记录了nextinstr的值,该值为1023)按B-E1relE2将c==d归约为B时语义动作相应的指令如下102:ifc==dgoto–103:goto–4)产生式B-B1||MB2中的标记非终结符号M记录了nextinstr的值,该值为1045)按B-E1relE2将e==f归约为B时语义动作相应的指令如下104:ife==fgoto–105:goto–6)按照产生式B-B1||MB2进行归约7)按照产生式B-(B1)进行归约8)按照产生式B-B1&&MB2进行归约9)各子表达式的truelist和falselist在上图中已标出B.t={102,104}B.f={101,105}B.t={100}B.f={101}&&M.i={102}B.t={102,104}B.f={105}a==bB.t={102,104}B.f={105}()B.t={102}B.f={103}B.t={104}B.f={105}||M.i={104}c==de==fε&ε&

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功