《编译原理第7章.ppt

  1. 1、本文档共85页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 语义分析和中间代码生成 紧接在词法分析和语法分析之后,编译程序要做的工作就是进行静态语义检查和翻译。 静态语义检查 (1)类型检查。如果操作符作用于不相容的操作数,编译程序必须报告出错信息。 (2)控制流检查。控制流语句必须使控制转移到合法的地方。 (3)一致性检查。在很多场合要求对象只能被定义一次。 (4)相关名字检查。 其它如名字的作用域分析等。 本章内容目录 中间语言 后缀式 图表示法 三地址代码 说明语句 过程中的说明谙旬 保留作用域信息 记录中的域名 中间语言 几种常见的中间语言形式 后缀式 三地址代码(包括三元式、四元式、间接三元式) DAG图表示 后缀式 后缀式表示法又称逆波兰表示法。 这种表示法是把运算量(操作数)写在前面,把算符写在后面(后缀)。 例如,把a十b写成ab+,把a*b写成ab*。 一个表达式E的后缀形式 (1)如果E是一个变量或常量,则E的后缀式是E自身。 (2)如果E是E1 op E2 形式的表达式,这里op是任何二元操作符,则E的后缀式为E1′E2′op,这里E1′和E2′分别为E1和E2的后缀式。 (3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。 后缀式表示法用不着使用括号。根据运算量和算符出现的先后位置,以及每个算符的目数,就完全决定了一个表达式的分解。 图表示法 包括DAG与抽象语法树 无循环有向图(Directed Acycli Graph简称DAG)。 与抽象语法树一样,对表达式中的每个子表达式,DAG中都有一个结点。一个内部结点代表一个操作符,它的孩子代表操作数。 与抽象语法树不同的是,在一个DAG中代公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树。 三地址代码 三地址代码是由下面一般形式的语句构成的序列: x := y op z 其中,x,y,z为名字、常数或编译时产生的临时变量;op代表运算符号如定点运算符、浮点运算符、逻辑运算符等等。每个语句的右边只能有一个运算符。 例如,源语言表达式x+y*z 可以被翻译为如下语句序列: T1:=y*z T2:=x+T1 其中,Tl,T2为编译时产生的临时变量。 四元式 一个四元式是一个带有四个域的记录结构,这四个域分别称为op、arg1, arg2 及result. 域op包含一个代表运算符的内部码。 三地址语句x:=y op z 可表示为:将y置于argl域,置于arg2域,x置于result域,:=为算符。 带有一元运算符的语句如:x:= -y 或者x:=y 的表示中不用arg2.而像param这样的运算符仅使用argl域。 条件和无条件转移语句将目标标号置于result域中。 三元式 为了避免把临时变量填入到符号表,可以通过计算这个临时变量值的语句的位置来引用这个临时变量。 这样表示三地址代码的记录只需三个域:op 、argl和 arg2 间接三元式 为了便于代码优化处理,有时不直接使用三元式表,而是另设一张指示器(称为间接码表),它将按运算的先后顺序列出有关三元式在三元表中的位置。 换句话说就是,用一张间接码表辅以三元式表的办法来表示中间代码。这种表示法称为间接三元式。 四元式与三元式和间接三元式作一些比较 四元式之间的联系是通过临时变量实现的。这一点和三元式不同。要更动一张三元表是很困难的,它意味着必须改变其中一系列指示器的值。但要更动四元式表是很容易的,因为调整四元式之间的相对位置并不意味着必须改变其中一系列指示器的值。因此,当需要对中间代码进行优化处理时,四元式比三元式要方便得多。 对优化这一点而言,四元式和间接三元式同样方便。 说明语句 当考查一个过程或分程序的一系列说明语句时,便可为局部于该过程的名字分配存储空间。 对每个局部名字,我们都将在符号表中建立相应的表项,并填入有关的信息如类型、在存储器中的相对地址等。 相对地址是指对静态数据区基址或活动记录中局部数据区基址的一个偏移量。 过程中的说明语句 在C, Pascal及FORTRAN等语言的语法中,允许在一个过程中的所有说明语句作为一个组来处理,把它们安排在一所数据区中。 从而需要一个全程变量如offset来跟踪下一个可用的相对地址的位置。 保留作用域信息 允许嵌套过程的语言,对于每一个过程,其中局部名字的相对地址计算可以采用图7.6的方法。 而当遇到一个嵌入的过程说明时,则应当暂停包围此过程的外围过程说明语句的处理。这种方法可以通过加入到如下的语言把有关语义动作来说明。 P→D D→D; D | id:T | p

文档评论(0)

you9391 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档