如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第六章中间代码中间代码生成6.1中间语言6.2常用语句的翻译6.2.1说明语句6.2.2赋值语句6.2.3布尔表达式6.2.4过程语句序“中间代码生成”程序的任务是:6.1中间语言语法树后缀式三地址代码表示=赋值语句:中缀式:a:=b*-c+b*-c后缀式:abc-*bc-*+==6.1.2三地址代码一般形式x:=yopz(3)无条件转移语句gotoL;(5)复制语句x:=y;(1)E.place表示存放E值的名字。S.code:=E.code║gen(id.place':='E.place)E→E1*E2产生式三地址语句序列是语法树的线性表示,用临时变量代替语法树中的结点。6.1.5三地址代码的具体实现1、x=yopz对于语句a:=b*-c+b*-c的三种表示方法(0)(1)(2)(3)(4)(5)(14)(15)(16)(17)(18)(19)相对地址:相对静态数据区基址一、过程中的说明语句P→DNametypekind……addrXY…………1.问题的提出于是提出下面的问题:2.嵌套的程序结构嵌套说明的文法:嵌套说明的程序结构首先要解决的问题是:非局部数据的访问具体翻译时,每当碰到过程说明D→procid;D1;S时,便创建一张符号表,并且把D1中的所有说明都填入此符号表中Nilheaderxareadarrayexchangequicksort翻译时常用操作:Tblptr是一个栈,用于存放指向嵌套外层过程的符号表指针处理嵌套过程中的说明语句翻译方案D→id:T{enter(top(tblptr),id.name,T.type,top(offset));④top(offset):=top(offset)+T.width}P上述语法树对应的语句:ProcQ;procR;j:int;S;S使用两个栈,分别保存刚编译过的符号表箭头table和offset的值。一组嵌套过程,每个过程说明为局部名字建立一个符号表,所有正在翻译过程的符号表组成整个源程序的符号表。三、记录中的域名T→recordLDend{T.type:=record(top(tblptr));T.width:=top(offset);pop(tblptr);pop(offset)}L→ε{t:=mktable(nil);push(t,tblptr);push(0,offset))}为-个记录中的域名建立一张符号表该翻译模式强调了作为一个语言结构的记录的设计与活动记录之间的相似处.一、符号表中的名字用最近嵌套作用域规则查找非局部名字lookup(id.name)=id.entrynilS→id:=EE→(E1)语义动作应包括类型分析,文法符号应有类型属性,在类型分析的基础上,进行相容和赋值相容检查,生成类型转换的三地址代码。1、数组元素地址的计算公式②对于一个二维数组,可以按行或按列存放。base+((i1一low1)*n2+i2一low2)*w)整理后:常量部分:c=((...((low1*n2+low2)*n3+low3)...)*nk+lowk)*w变量部分v=((...((i1*n2+i2)*n3+i3...)*nk+ik)*wx:=a[i1,….,in]的三地址代码结构:2、数组的类型信息:地址计算变量部分:((i1*n2+i2)*n3+i3)*n4+……可利用递归公式计算:e1=i1,Elist引进综合属性array,指向数组名a在符号表中的入口地址.L有两个属性值:L.Place和L.offset5、访问数组元素的翻译模式给定文法G(S):(0)M→ε(1)S→L:=ME(2)E→E+E(3)E→(E)(4)E→L(5)L→Elist](6)L→id(7)Elist→Elist,E(8)Elist→id[E6、相应语义动作若L是一个简单的名字,将生成一般的赋值;2.E→E1+E2{E.place:=newtemp;emit(E.place':='E1.place'+'E2.place)}使用索引来获得地址L.place[L.offset]的内容:4.E→L{ifL.offset=nullthenE.place:=L.place/*Lisasimpleid*/elsebeginE.place:=newtemp;emit(E.place':='L.place'[L.offset']')end}一个空的offset表示一个简单的名字:6.L→ld(L.place:=id.place;L.offset:=null}