资源描述:
《编译程序的功能和组织结构》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译程序的功能和组织结构表处理词法分析源程序目标程序错误处理语法分析语义分析目标代码生成前端后端中间代码优化中间代码生成1第六章语法制导翻译6.1中间代码的形式6.2语法制导翻译的概述6.3自底向上的制导翻译2何谓中间代码:(Intermediatecode/Intermediaterepresentation/Intermediatelanguage)可以使编译程序的结构清晰、简单、明确。源程序的一种内部表示,不依赖目标机的结构,易于机械生成目标代码的中间表示。为什么要此阶段及使用原则主要优点是可移植(与具体目标程序无关),且易于目标代码优
2、化原则:1、形式比较简单,容易翻译成相应的目标机器代码。2、能充分反映源程序的特点。中间代码的几种形式逆波兰、四元式、三元式、树型6.1中间代码(源程序的中间形式)36.1.1逆波兰记号(后缀式)将运算对象写在前面,把运算符号写在后面表达式逆波兰式a+bab+a+b*cabc*+(a+b)*cab+c*a=b*c+b*dabc*bd*+=4后缀式的计算机处理后缀式的最大优点是易于计算机处理处理过程:从左到右扫描后缀式,每碰到运算对象就推进栈;碰到运算符就从栈顶弹出相应目数的运算对象施加运算,并把结果推进栈。最后的结果留在栈顶。bt1dct1t
3、2t1t3t1=-bt2=c*dt3=t1+t2例:表达式-b+c*d的后缀式b@cd*+的计值过程5逆波兰表示法的扩充逆波兰表示法很容易扩充到表达式以外的范围例如:语句逆波兰表示备注a:=b+cabc+:=:=看作二目运算符GOTOLLjmpjmp看成一目运算符,表示GOTOIfEthenS1elseS2ES1S2¥把¥看成三目运算符,表示if–then–else6逆波兰示例例:把下述产生式定义的算术表达式映射到后缀波兰表示:EE+TETTTFTFF(E)FaE=ET+E=TT=TFT=FF=EF=a产生式翻译成分7确定输入
4、a+aa的输出:(E,E)(E+T,ET+)(T+T,TT+)(F+T,FT+)(a+T,aT+)(a+TF,aFF+)(a+FF,aFF+)(a+aF,aaF+)(a+aa,aaa+)86.1.2三元式和树形表示格式:(算符,第一运算对象,第二运算对象)如:a=b*c+b*d(1)(*,b,c)(2)(*,b,d)(3)(+,(1),(2))(4)(=,(3),a)=a+**bcbd96.1.3四元式由于三元式中的结果是用它的编号表示的,当在三元式进行优化后,就要用一定的时间重新安排三元式的编号,很
5、费时间。为了防止优化后的重新编址,在三元式基础上增加了一个存放结果的单元,这就形成了四元式子,是一种最常用的形式。格式:(算符,第一运算对象,第二运算对象,结果)如:a=b*c+b*d(1)(*,b,c,t1)(2)(*,b,d,t2)(3)(+,t1,t2,t3)(4)(=,t3,-,a)10四元式的特点类似于三地址指令四元式虽然比三元式多了一结果的引用,但有利于优化和代码生成为了便于书写四元式也可以写成如下形式:<结果>:=<运算对象1><运算符><运算对象2>则表达式a+(-b*c+d)*e的四元式为:(1)t1:=-b(2)t
6、2:=t1*c(3)t3=t2+d(4)t4=t3*e(5)t5=a+t411同样要将算法语言翻译成相应的四元式,也要将四元式扩充到其他运算符,如(jmp,_,L)表示无条件转向第L条四元式。126.1.4汇编代码汇编语言是依赖于机器的低级程序设计语言,它是面向具体的计算机系统或相应的计算机系列的,它和三元式相比有以下优点:(1)能方便地翻译成目标机器指令。(2)不必直接计算转移地址。(3)可以使用各种数据表示法。136.2语法制导翻译的概述(如何把源程序翻译成相应的中间代码)基本思想:在语法分析过程中,随着分析的步步进展,每当使用一条产生式
7、进行推导(对于自上而下分析)或归约(对于自下而上分析),就执行该产生式所对应的语义动作,完成相应的翻译工作。语法制导翻译就是把语言的一些属性附加到代表语言结构的文法符号上,这些属性值是由附加到文法产生式的“语义规则”中计算的,也就是为每个产生式配备翻译子程序,即语义子程序。语法制导翻译法不论对自上而下分析或自下而上分析都适用14翻译的任务:语法结构的静态语义分析和正确性检查,若正确,则翻译成中间代码或目标代码。使用的方法:称作语法制导翻译。基本思想(简言之):根据翻译的需要设置文法符号的属性(这些属性代表与文法符号相关的信息),以描述语法结构
8、的语义。例如,一个变量的属性有类型,层次,存储地址等。表达式的属性有类型,值等。属性值的计算和产生式相联系。随着语法分析的进行,执行属性值的计算,完成语义分析和翻译