编译原理-第七章辩析.ppt

  1. 1、本文档共85页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
TJNU-COCIE-WJW 编译原理 ——第七章 语义分析和中间代码产生 王金伟 计算机与信息工程学院 天津师范大学 第七章 语义分析和中间代码产生 在词法分析和语法分析之后的阶段就是语义分析和中间代码生成 本章把第六章介绍的有关语法制导翻译的相关方法和技术用在中间代码生成和语义分析上 主要工作 静态语义检查 翻译 静态语义检查 类型检查:如果操作符作用于不相容的操作数,编译程序必须报告出错信息。 例如,在C语言中”.”因该作用与结构体变量,若作用于指针变量应用“-” 控制流检查:控制流语句必须使控制转移到合法的地方。 例如,在C语言中break语句使控制跳离包括语句的最小while、for或switch语句。如果不存在包括它的这样的语句应该报错。 静态语义检查 一致性检查:很多场合要求对象只能被定义一次 例如,Pascal语言规定同一标识符在一个分程序中只能被说明一次,同一case语句的标号不能相同,枚举类型的元素不能重复出现等等。 相关名字检查:有时,同一名字必须出现两次或多次。 例如,Ada语言程序中,循环或程序块可以有一个名字,它出现在这些结构的开头和结尾,编译程序必须检查这两个地方用的名字是相同的。 其他:如名字的作用域分析等。 翻译(产生中间代码) 采用独立于机器的中间代码的好处: 便于进行与机器无关的代码优化工作 使编译程序改变目标机更容易 使编译程序的结构在逻辑上更为简单明确。以中间语言为界面,编译前端和后端的接口更清晰 第七章 语义分析和中间代码产生 7.1中间语言 中间语言 源程序的中间表示方法 中间语言的形式 后缀式 图表示法 三地址代码 一、后缀式 把运算量(操作数)写在前面,把算符写在后面。 例如: 原式 后缀式 a+b, ab+ a*b, ab* 1.表达式E的后缀表示递归定义 如果E是变量和常数,则E的后缀表示是E本身 如果E是形如E1 op E2的表达式,其中op是任意的二元算符,则E的后缀表示是E1’ E2’ op,其中E1’和E2’分别是E1和E2的后缀表示 如果E是形如op E1的表达式,其中op是一元算符,则E的后缀表示是E1’ op,其中E1’ 是E1的后缀表示 如果E是形如(E1)的表达式,则E1的后缀表示也是E的后缀表示 注意:后缀式不需要括号 例:赋值语句 a := b *(- c)+ b *( - 34) 的后缀式: 二、图表示法 1.特点和形式 描述了源程序的自然层次结构 语法树(抽象语法树) 有向无环图(DAG) 例:a := b * - c + b * - c 后缀式是抽象语法树的线性表示 后根序遍历 a b c uminus * b c uminus * + := 2.产生赋值语句抽象语法树的属性文法 产生式 语义规则 S→ id := E S.nptr := mknode(‘:=’, mkleaf(id, id.place), E.nptr ) E→ E1 + E2 E.nptr := mknode(‘+’, E1.nptr, E2.nptr ) E→ E1 * E2 E.nptr := mknode(‘*’, E1.nptr, E2.nptr ) E→ -E1 E.nptr := mknode(‘uminus’, E1.nptr ) E→ ( E1 ) E.nptr := E1.nptr E→ id E.nptr := mkleaf(id , id.place ) 三、三地址代码 1.一般形式 包含三个地址:两个操作数,一个结果 x := y op z 一系列的上述形式 x, y, z是名字、常数和编译器产生的临时变量 op是算符,定点、浮点、逻辑,只能有一个 例:x + y * z翻译成 t1 := y * z t2 := x + t1 1.一般形式(续) 三地址代码是AST或DAG的线性化表示 DAG图对应的三地址代码可能比相应的AST对应的三地址代码要优化,因为可以复用中间结果 2.三地址代码的种类 (1)赋值语句: x := y op z,op是二元算术算符或逻辑算符 (2)赋值语句: x := op z,op是一元算符,如:负号,逻辑非not等 (3)复写语句: x := y 2.三地址代码的种类(续1) (4)无条件转移: goto L,L是下一步要执行的三地址语句的标号 (5)条件转移语句: if x relop y goto L 根据逻辑运算的结果决定是否执行转移 if a goto L a为真跳到L执行,否则执行if后边的语句 2.三地址代码的种类(续2) (6)过程调用语句: param

文档评论(0)

知识宝库 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档