如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第八章语法制导翻译和中间代码生成概述—语义处理概述—语义处理8.1属性文法形式语义学(如指称语义学、公理语义学、操作语义学等)的研究已取得了许多重大的进展目前在实际应用中比较流行的语义描述和语义处理的方法主要还是属性文法和语法制导翻译方法。属性文法(attributegrammar)是一个三元组:A=(G,V,F),其中G:是一个上下文无关文法V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连,这些属性代表与文法符号相关信息,如它的类型、值、代码序列、符号表内容等等.属性与变量一样,可以进行计算和传递。属性加工的过程即是语义处理的过程。F:关于属性的断言或一组属性的计算规则(称为语义规则).断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性.例:类型检查的属性文法属性有两种—继承属性和综合属性在一个属性文法中,对应于每个产生式A都有一套与之相关联的语义规则,每条规则的形式为b:=f(c1,c2…ck).这里f是一个函数.(1)如果b是A的一个属性并且c1,c2…ck是产生式右边文法符号的属性或A的其它属性,则称b是A的综合属性.(2)b是产生式右边某个文法符号X的一个属性并且c1,c2…ck是A或产生式右边任何文法符号的属性,则称b是文法符号X的继承属性.在上述两种情况下,我们都说属性b依赖于属性c1,c2…ck.1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性(除非另有说明).2)终结符只有综合属性.例8.1简单算术表达式求值的语义描述设表达式为3*5+4,则语义动作打印数值19例8.2说明语句语义规则非终结符T有一个综合属性type,其值有关键字决定(int或real).L.in=T.type,L.in是继承属性,它将沿着语法树传递到下边的结点.与L相联的语义规则中有一个过程调用—addtype把标识符的类型信息登录在符号表中.一个结点的继承属性值是由此结点的父结点和/或兄弟结点的某些属性来决定的.8.2语法制导翻译方法2+3*5的分析和计值过程8.3中间代码的几种形式逆波兰(后缀式)表达式:A+B*(C-D)+E/(C-D)^N三元式(树形表示)A四元式(三地址指令)8.4简单赋值语句的翻译8.4简单赋值语句的翻译(2)EE1+E2{E.place:=newtemp;emit(E.place“:=”E1.place“+”E2.place)}(3)E-E1{E.place:=newtemp;emit(E.place“:=”“uminus”E1.place)}(4)E(E1){E.place:=E1.place}(5)Eid{E.place:=newtemp;P:=lookup(id.name);ifPnilthenE.place:=Pelseerror}简单赋值语句的四元式翻译8.5布尔表达式的翻译翻译布尔表达式的方法8.5.1数值表示的布尔表达式翻译方案关系表达式:a<b等价于ifa<bthen1else0翻译成三地址代码序列:100:ifa<bgotol03101:t:=0102:gotol04。103:t:=1104nextstat的语义说明关于布尔表达式的数值表示法的翻译模式E→id1ropid2{E.place:=newtemp;emit('if'id1.place'rop'id2.place'goto'nextstat+3);emit(E.place':=''0');emit('goto‘nextstat+2);emit(E.place':=''1')}E→ture{E.place:=newtemp;emit(E.place':=''1')}E→false{E.place:=newtemp;emit(E.place':=''0')}数值表示法的布尔式的翻译方案8.5.2控制结构中布尔表达式的翻译S→ifEthenS1E.falseE.false控制流语句布尔表达式翻译的基本思想产生式考虑布尔运算符or和and的逻辑关系,决定布尔表达式的真假出口语句回填记录需回填地址的四元式,把需回填E.true的四元式拉成一链,把需回填E.false的四元式拉成一链,分别称做“真”链和“假”链两个函数语义描述使用的变量和过程:自下而上分析中的一种翻译方案:(4)E→(E1){E.true:=E1.true;E.codebegin:=E1.codebegin;E.false:=E1.false}(5)E→id1ropid2{E.true:=nextstat;E.codebegin:=nextstat;E.false:=nextsta