资源描述:
《编译原理第四章语义分析和中间代码生成》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第四章语义分析和中间代码生成属性文法属性文法(attributegrammar)是一个三元组:A=(G,V,F),其中G:是一个上下文无关文法V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连,F:关于属性的属性断言或谓词集.每个断言与一个产生式相联.而此断言只引用该产生式左端或右端的终结符或非终结符相联的属性表达式文法E→T+T
2、TorTT→n
3、bE→T1+T2{T1.type=intT2.type=T1.typeE.type:=int}E→T1orT2{T1.type=boolT2.
4、type=T1.typeE.type:=bool}T→n{T.type:=int}T→b{T.type:=bool}综合属性用于“自下而上”传递信息。由相应分析树中结点的分支结点属性计算得到。语义规则LEEE1+TETTT1*FTFF(E)FdigitPrint(E.val)E.val:=E1.val+T.valE.val:=T.valT.val:=T1.valF.valT.val:=F.valF.val:=E.valF.val:=digit.lexval产生式LE.val=19E.val=15T
5、.val=4T.val=15F.val=4T.val=3F.val=3F.val=5digit.lexval=4digit.lexval=5digit.lexval=3+*3*5+4的带注释的分析树继承属性用于“自上而下”传递信息。由相应分析树中结点的父结点属性计算得到。产生式语义规则DTLTintTfloatLL1,idLidL.in:=T.typeT.type=intT.type:=floatL1.in:=L.in;addtype(id.entry,L.in)addtype(id.en
6、try,L.in)floatid1,id2,id3的带注释的分析树DL.in=floatL.in=floatL.in=floatT.type=floatfloatid2id1id3,,1.语法树①根与内部结点由表达式中的操作符标记;②叶子由表达式中的操作数标记;③用于改变运算优先级和结合性的括弧,被隐含在语法树的结构中;例:语法树只反映句型的结构,忽略了推导句型的过程。+id*idid几种常见的中间语言几种常见的中间语言2.逆波兰表示法a.表达式的逆波兰表示:①若E是变量或常数,则表示为:E②若为E
7、1opE2形式,且op为二元运算符,则表示为:E1E2op③若为opE1形式,且op为一元运算符,则表示为:E1op④若为(E)形式,则表示为:E例:a*(b+c)可看成Eop(EopE),可写成abc+*(-a)*b+c*d可写成a-b*cd*+几种常见的中间语言2.逆波兰表示法b.程序语句的逆波兰表示:①BL:转向某标号;②BT:条件为真时转移;③BF:条件为假时转移;④BR:无条件转移.几种常见的中间语言3.三地址代码三地址代码语句的一般形式为x=yopz例:表达式x+y*z的三地址语句为:t
8、1=y*zt2=x+t1x=t2常用的三地址语句:x=yopzx=-yx=yparx1callpgotoLifxropygotoL几种常见的中间语言三地址代码的具体实现:四元式、三元式、间接三元式a.四元式的记录结构为:(op,arg1,arg2,result)例:求赋值语句a=b*(c+d)的四元式代码:首先写出这个赋值语句的三地址代码语句为:t1=c+dt2=b*t1a=t2再根据三地址代码语句写出四元式代码为:(+,c,d,t1)(*,b,t1,t2)(=,t2,_,a)几种常见的中间语言b.
9、三元式的记录结构为:(op,arg1,arg2)例:求赋值语句a=b*(c+d)的三元式代码:首先写出这个赋值语句的三地址代码语句为:t1=c+dt2=b*t1a=t2再根据三地址代码语句写出三元式代码为:①(+,c,d)②(*,b,①)③(=,a,②)几种常见的中间语言c.间接三元式例:求赋值语句a=b*(c+d)的三元式代码:首先写出这个赋值语句的三地址代码语句为:t1=c+dt2=b*t1a=t2再根据三地址代码语句写出间接三元式代码为:三元式表:①(+,c,d)②(*,b,①)③(=,a,②
10、)间接码表:①②③表达式及赋值语句的翻译1.简单算术表达式和赋值语句的翻译例:分析赋值语句X=-B*(C+D)的翻译过程.先转化为三地址代码:再翻译成四元式:T1=-B(uminus,B,_,T1)T2=C+D(+,C,D,T2)T3=T1*T2(*,T1,T2,T3)X=T3(=,T3,_,X)例:文法Ai=EEE+E
11、E*E
12、-E
13、(E)
14、i语义变量:i.name,E.place语义函数:lookup(i.name),newtemp()语义过程:emit(op