LIWensheng,SCST,BUPT第8章中间代码生成知识点:三地址代码语句的翻译布尔表达式的翻译回填技术WenshengLiBUPT@20082中间代码生成中间代码生成程序的任务把语法分析、语义分析得到的源程序的中间表示翻译成中间代码表示采用中间代码作为过渡的优点便于编译程序的建立和移植便于进行与机器无关的代码优化工作缺点增加了I/O操作、效率下降中间代码生成程序的位置语法分析语义分析中间代码生成代码优化中间代码WenshengLiBUPT@20083中间代码生成8.1中间代码形式8.2赋值语句的翻译8.3布尔表达式的翻译8.4CASE语句的翻译8.5回填技术8.6过程调用语句的翻译小结WenshengLiBUPT@200848.1中间代码形式一、图形表示–语法树–dag图二、三地址代码–三地址语句的形式–三地址语句的种类–三地址语句的实现WenshengLiBUPT@20085一、图形表示语法树–描绘了源程序的自然层次结构dag图–以更紧凑的方式给出了同样的信息–因为公共子表达式被标识出来了为赋值语句产生语法树的语法制导定义产生式语义规则Sid:=ES.nptr=mknode(:=,mkleaf(id,id.place),E.nptr)EE1+E2E.nptr=mknode(+,E1.nptr,E2.nptr)EE1*E2E.nptr=mknode(*,E1.nptr,E2.nptr)E-E1E.nptr=mkunode(uminus,E1.nptr)E(E1)E.nptr=E1.nptrEidE.nptr=mkleaf(id,id.place)WenshengLiBUPT@20086语法树表示:dag图形表示:赋值语句a:=b*-c+b*-c的图表示法assigna+**buminusbuminusccassigna+*buminuscWenshengLiBUPT@20087语法树的实现——存储结构每一个结点用一个记录表示,该记录包括一个运算符号域和若干个指向其子结点的指针域assignida+**idbidbuminusuminusidcidc0idb1idc2uminus13*024idb5idc6uminus57*468+379ida10assign9811...把所有的结点看成是一个记录的数组,结点的位置作为指向结点的指针WenshengLiBUPT@20088二、三地址代码三地址代码–三地址语句组成的序列–类似于汇编语言的代码–语句可以有标号–有控制流语句三地址语句的形式:x:=yopz–x是名字、临时变量–op代表运算符号,如定点、浮点、或逻辑算符等–y、z是名字、常数、或临时变量WenshengLiBUPT@20089三地址语句的种类赋值语句x:=yopzx:=opyx:=y转移语句gotoLifxrelopygotoL过程调用语句paramxcallp,n数组赋值语句x:=y[i]x[i]:=y指针赋值语句x:=&yx:=*y*x:=yWenshengLiBUPT@200810赋值语句a:=b*-c+b*-c的三地址代码对应语法树的代码t1:=-ct2:=b*t1t3:=-ct4:=b*t3t5:=t2+t4a:=t5对应dag的代码t1:=-ct2:=b*t1t5:=t2+t2a:=t5WenshengLiBUPT@200811三地址语句的实现——四元式四元式–(op,arg1,arg2,result)–(op,arg1,,result)–(param,arg1,,)–(goto,,,语句标号)赋值语句a:=b*-c+b*-c的四元式表示oparg1arg2result(14)uminusct1(15)*bt1t2(16)uminusct3(17)*bt3t4(18)+t2t4t5(19):=t5aWenshengLiBUPT@200812三元式:(op,arg1,arg2)–为避免把临时变量名也存入符号表,可不引入临时变量–把由一个语句计算出来的中间结果直接提供给引用它的语句–用计算中间结果的语句的指针代替存放中间结果的临时变量赋值语句a:=b*-c+b*-c的三元式表示oparg1arg2(14)uminusc(15)*b(14)(16)uminusc(17)*b(16)(18)+(15)(17)(19):=a(18)三地址语句的实现——三元式WenshengLiBUPT@200813语句x[i]:=y和x:=y[i]的三元式序列语句x[i]:=y语句x:=y[i]oparg1arg2(0)[]=xi(1)assign(0)yoparg1arg2(0)=[]yi(1)assignx(0)WenshengLiBUPT@200814间接三元式–间接码表:为三元式序列建立的一个指针数组,其每个元素依次指向三元式序列中的一项赋值语句a:=b*-c+b*-c的间接三元式表示间接码表三元式oparg1arg2(14)uminusc(15)*b(14)(16)uminusc(17)*b(16)(18)+(15)(17)(19)assigna(18)语句(0)(14)(1)(15)(2)(16)(3)(17)(4)(18)(5)(19)三地址语句的实现——间接三元式WenshengLiBUPT@2008158.2赋值语句的翻译假定赋值语句出现的环境可用下面的文法描述:PMD;SMDD;D|Did:T|Dprocid;ND;SNTinteger|real|array[num]ofT1|T1|recordDendSid:=E一、赋值语句中仅涉...