资源描述:
《编译原理 第七章.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第七章中间代码生成序7.1中间语言7.2说明语句7.3赋值语句7.4布尔表达式7.6回填7.7过程语句练习1序◆“中间代码生成”程序的任务是:把经过语法分析和语义分析的源程序或源程序的中间表示翻译为中间代码表示。◆方法:语法制导翻译。◆采用独立于机器的中间代码的好处:1.便于编译系统的建立和编译系统的移植;2.便于进行独立于机器的代码优化工作。27.1中间语言语法树后缀式三地址代码表示7.1.1图表示法语法树,有向非循环图和后缀式表示源程序的自然层次结构,例如:a:=b*-c+b*-c3assigna+*bcuminus(a)语法树*uminus
2、cb4assigna+*bcuminus(b)Dag(DirectedAcyclicGraph)5表7.1产生赋值语句语法树的语法制导定义S.nptr:=mknode('assign',mkleaf(id,id.place),E.nptr)E.nptr:=mknode('+',E1.nptr,E2.nptr)E.nptr:=mknode('*',E1.nptr,E2.nptr)S→id:=EE→E1+E2E→E1*E2产生式语义规则6E.nptr:=mknode('uminus',E1.nptr)E.nptr:=E1.nptrE.nptr:=mk
3、leaf(id,id.place)E→-E1E→(E1)E→id产生式语义规则7赋值语句:a:=b*-c+b*-c后缀式:abcuminus*bcuminus*+assignassign+*uminusidaidcidb*uminusidcidb8赋值语句:a:=b*-c+b*-cidbidcunimus1*02idbidcunimus5*46+37idaassign98...012345678910图7.2对应7.1(a)的两种表示法97.1.2三地址代码◆一般形式x:=yopz图7.3相应于图7.1的树和dag的三地址代码t1:=-ct1:=
4、-ct2:=b*t1t2:=b*t1t3:=-ct5:=t2+t2t4:=b*t3a:=t5t5:=t2+t4a:=t5(a)对于语法树的代码(b)对于dag的代码107.1.3三地址语句的种类(1)赋值语句x:=yopz,op为二目算术算符或逻辑算符;(2)赋值语句x:=opy,op为一目算符,如一目减uminus、逻辑非not、移位算符及转换算符;(3)复制语句x:=y;(4)无条件转移语句gotoL;(5)条件转移语句ifxrelopygotoL,关系运算符号relop(<,=,>=等等);11(接上页)(6)过程调用语句paramx和ca
5、llp,n;过程返回语句returny;(7)索引赋值x:=y[i]及x[i]:=y;(8)地址和指针赋值x:=&y,x:=*y和*x:=y。◆在设计中间代码形式时,选择多少种算符需要tradeoff.127.1.4语法制导翻译生成三地址代码S.code:=E.code
6、
7、gen(id.place':='E.place)E.place:=newtemp;E.code:=E1.code
8、
9、E2.code
10、
11、gen(E.place':='E1.place'+'E2.place)E.place:=newtemp;E.code:=E1.code
12、
13、E2.
14、code
15、
16、gen(E.place':='E1.place'*'E2.place)S→id:=EE→E1+E2E→E1*E2产生式语义规则13(接上表)产生式语义规则E.place:=newtemp;e.code:=E1.code‖gen(E.place´:=´´uminus´E1.place)E.place:=E1.place;E.code:=E1.codeE.place:=id.place;E.code:=‘’E→-E1E→(E1)E→id表7.2产生赋值语句三地址代码的语法制导定义14(1)E.place表示存放E值的名字。(2)E.cod
17、e表示对E求值的三地址语句序列。(3)newtemp是个函数,对它的调用将产生一个新的临时变量。◆三地址语句序列是语法树的线性表示,用临时变量代替语法树中的结点。◆实际实现中,三地址语句序列往往是被存放到一个输出文件中,而不是将三地址语句序列置入code属性之中157.1.5三地址代码的具体实现1.四元式op,arg1,arg2,result2.三元式op,arg1,arg23.间接三元式间接码表+三元式表◆四元式需要利用较多的临时单元,四元式之间的联系通过临时变量实现。◆中间代码优化处理时,四元式比三元式方便的多,间接三元式与四元式同样方便,两
18、种实现方式需要的存储空间大体相同。16对于语句a:=b*-c+b*-c的三种表示方法(0)(1)(2)(3)(4)(5)uminus*u