您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 编译原理例题习题讲解(ch6-ch7)
第6-7章语法制导翻译中间代码一、重点与难点重点:语法制导翻译的基本思想,属性文法,翻译模式,说明语句的翻译方案。三地址码,各种语句的目标代码结构、属性文法与翻译模式。难点:属性的意义,对综合属性,继承属性,固有属性的理解,属性计算,怎么通过属性来表达翻译。布尔表达式的翻译,对各种语句的目标代码结构、属性文法与翻译模式的理解。二、基本要求掌握语法制导翻译的基本思想,属性文法,综合属性,继承属性,固有属性,属性计算,S_属性文法,L_属性文法,说明语句的翻译方案,翻译模式、属性文法的实现掌握中间语言与语义分析的基本概念;熟练掌握语法(结构)树、三地址代码、赋值与控制语句的翻译;理解组合数据说明的翻译、过程调用翻译、说明语句的翻译。三、例题与习题1、翻译算术表达式–(a+b)*(c+d)+(a+b+c)为三地址代码解:写出三地址代码为:t1:=a+bt2:=-t1t3:=c+dt4:=t2*t3t5:=a+bt6:=t5+ct7:=t4+t62、对下面的文法,设计语法制导定义获得类型信息,要求只利用综合属性。DL,id|LLTidTint|real解:3、请设计语法制导的定义,将后缀表达式翻译成中缀表达式。注意,不允许出现冗余括号,后缀表达式的文法如下:E→EE+E→EE*E→id解:4、下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果为整数,否则为实数。ETRR+TR|εTnum.num|numa)给出语法制导定义确定每个子表达式的类型。b)把表达式翻译成前缀形式,并且决定类型。试用一元运算符inttoreal把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型的。解:a)设type是综合属性,代表各非终结符的“类型”属性设in是继承属性,翻译模式如表所示。b)设属性s和i用于传递属性type,属性t和j用于传递属性val。5、令S.val为下面的文法由S生成的二进制数的值(如,对于输入101.101,S.val=5.625);SL.L|LLLB|BB0|1按照语法制导翻译的方法,对每个产生式给出相应的语义规则。解:S’S{print(S.val);}SL1.L2{S.val:=L1.val+L2.val/2L2.length;}SL{S.val:=L.val;}LL1B{L.val:=L1.val*2+B.val;L.length:=L1.length+1;}LB{L.val:=B.val;L.length:=1;}B0{B.val:=0;}B1{B.val:=1;}6、在一个移入-归约的分析中采用以下的语法制导的翻译模式,在按一产生式归约时,立即执行括号中的动作。A→aB{print“0”;}A→c{print“1”;}B→Ab{print“2”}当分析器的输入为aacbb时,打印的字符串是什么?解:分析器的分析过程如下图所示:由于分析器采用移入-归约的方式进行分析,符号串aacbb的分析过程将如图中所标的归约顺序进行,而在按一产生式归约时,立即执行括号中的动作,所以分析器打印的字符为12020。7、文法如下:PDDD;D|id:T|procid;D;S(1)设计语法制导定义,打印该程序一共声明的id个数(2)设计翻译模式,打印P所生成的程序中每个id的嵌套深度解:(1)语法制导定义:引入属性i,记录id的个数PD{printf(D.i);}DD1;D2{D.i=D1.i+D2.i;}Did:T{D.i=1;}Dprocid;D1;S{D.i=D1.i+1}(2)翻译模式:引入属性level和nameP{D.level=1;}DD{D1.level=D.level;}D1;{D2.level=D.level;}D2Did:T{printf(id.name,D.lev);}Dprocid;{D1.level=D.level+1;}D1;S8、请将下列语句while(AB)doif(CD)thenX:=Y+Z翻译成四元式解:翻译的三地址码序列:L1:ifABgotoL1gotoL4L2:ifCDgotoL3gotoL1L3:T∶=Y+ZX∶=TgotoL1L4:9、将下列C程序的执行语句翻译成三地址代码(设S.next为L0):if(ij)s=10*selsei=-j解:翻译的三地址码序列:ifijgotoL1gotoL2L1:t0=10*ss=t0gotoL0L2:t1=-ji=t1L0:...
本文标题:编译原理例题习题讲解(ch6-ch7)
链接地址:https://www.777doc.com/doc-2645381 .html