网站大量收购独家精品文档,联系QQ:2885784924

编译原理 教学课件 作者 康慕宁 林奕 讲稿_4.ppt

编译原理 教学课件 作者 康慕宁 林奕 讲稿_4.ppt

  1. 1、本文档共112页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 语法制导的代码生成 一个编译器的目的是把源程序翻译成目标程序(也称为目标代码)。目标代码必须和源程序有相同的语义,也就是说,即使二者的表示方法不同,但对于给定的输入,必须计算出相同的结果。 仅关心源程序的词法和语法的正确性,这些是编译程序的前端的工作,即识别语法上正确的源程序。 本章我们把注意力转到编译程序的后端,即如何生成目标代码。 语义处理含有两个主要功能,一个是检查每个语法结构的表态语义,验证一个语法上合法的程序是否真正有意义,另一个是在表态语义正确的前提下,进行代码的翻译,即生成程序的另一种表示形式的中间语言代码或直接生成目标代码。 传统的方法是采用所谓“语法制导”方式完成这个翻译工作的。 分析器严格按照被分析的源程序的语法和语义,构造合适的中间(或目标多或少)代码序列。其中,对语法的依赖多于对语义的依赖。 4.1 常见的中间语言简介 逆波兰表示 波兰逻辑学家J.Lukasiewicz于1929年提出了一种表示表达式的方法。 按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。 特点:表达式中各个运算是按运算符出现的顺序进行的,故无需使用括号来指示运算顺序,因而又称为无括号式。下面我们对照地给出一些表达式的两种表示。 由于后缀表示中的各个运算是按顺序执行的,因此,它的计值很容易实现。 仅需从左到右依次扫视表达式中的各个符号,每遇一运算对象,就把它压入栈顶暂存起来; 每遇一个二元(或一元)运算符时,就取出栈顶的两个(或一个)运算对象进行相应的运算,并用运算结果去替换栈顶的这两(或一)个运算对象。 继续扫视余留的符号,直到扫视完整个表达式为止。 当上述过程结束时,整个表达式的值将留于栈顶。 逆波兰表示不仅能用于表示表达式,还可用于表示其他的语法结构。 此时的运算符不再限于算术运算符、关系运算符和逻辑运算符。 每个运算符的操作对象也可以不止两个。 例如,赋值语句x=a+b*c可按后缀式写为x abc*+=。 为了用后缀式表示一些控制语句,我们假定将后缀式的各符号存放在一个一维数组P[n]中。 此外,还需引入一些转移操作符。 p J—无条件把控制转至P[p](即从P[p]开始继续执行,下同)。 e p JZ— e是某表达式e的后缀表示,当e的值为0时,转向P[p]。 e1 e2 p JL—e1和e2分别是表达式e1和e2的后缀表示,当e1e2时,转向P[p]。 类似地,我们还可以定义JN(非零转)、JP(正号转)、JM(负号转)等。 条件语句 IF e THEN S1 ELSE S2 可写成 e p1 JZ S1 p2 JR S2 其中,e,S1和S2分别是e,S1,S2的后缀表示。另外,p1表示S2在数组P中的起始位置;p2表示位于S2之后那个符号的位置。 4.1.2 四元式 四元式是一种更接近目标代码的中间代码形式。由于这种形式的中间代码便于优化处理,因此,在目前许多编译程序中得到了广泛的应用。 四元式实际上是一种“三地址语句”的等价表示。它的一般形式为: (op, arg1, arg2, result) 其中,op为一个二元(也可是一元或零元)运算符;arg1、arg2分别为它的两个运算(或操作)对象,它们可以是变量、常数或系统定义的临时变量名;运算的结果将放入result中。四元式还可写为类似于Pascal语言赋值语句的形式: result:=arg1 op arg2 需要指出的是,每个四元式只能有一个运算符,所以,一个复杂的表达式需由多个四元式构成的序列来表示。例如,表达式A+B*C可写为序列 T1:=B*C T2:=A+T1 其中,T1,T2是编译系统所产生的临时变量名。 当op为一元、零元运算符(如无条件转移)时,arg2甚至arg1应缺省,即result:=op arg1或 op result ;对应的一般形式为: (op,arg1, ,result) 或 (op, , ,result) 在实际产生的四元式中,op往往用一整型数表示(操作符的代码),它可能附带有不止一种属性。例如,加运算可以分为定点加法和浮点加法两种,我们可用不同的整数值区分这两种加法。 四元式中运算对象arg1、arg2和结果域result,它们可以是指向符号表中某项的指示字,也可以是某个临时变量的序号. 因此,在实际的翻译过程中,还需要进行相应的查填符号表工作。 在本章中,我们只作原理性讨论。 4.1.3 其他表示法 除前面所述的逆波兰式、四元式外,常见的中间语言还有三元式表示和树形表示,以及接近Pascal形式的P代码,接近C格式的C代码等。 在本章以下的各节中,我们将分别对一些常见语法结构的语法制导翻译进行讨论。为方便起见,我们假定翻译过程所采用的是自底向

您可能关注的文档

文档评论(0)

118压缩包课件库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档