第六章 中间代码生成.pptx

  1. 1、本文档共167页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第六章 中间代码生成

编译原理 Principle of Compiler;在编译器的“分析-综合”模型中,前端对源程序进行分析并产生中间表示,而关于目标机器的细节则在后端处理。 本章内容涉及中间代码表示、静态类型检查和中间代码生成。;“中间代码生成”的任务把经过语法分析和语义分析而获得的源程序中间表示翻译为中间代码表示。 不同的编译器对中间表示的选择和设计各有不同。 中间表示可以是一种真正的语言,也可以是各个处理阶段共享的多个内部数据结构。 早期的C++编译器就把C语言作为中间表示 方法: 语法制导翻译 采用独立于机器的中间代 码的好处 1. 便于编译系统建立和编译系统的移植; 2. 便于进行独立于机器的代码优化工作。;中间语言 语法树 有向非循环图DAG 三地址代码表示 类型检查 常用语句的中间代码生成方法 说明语句 赋值语句 布尔表达式与控制流语句 回填;常用的中间代码(语言) 语法树 后缀式(逆波兰式) 三地址代码表示 特点 形式简单、语义明确、便于翻译 独立于目标语言;抽象语法(Abstract Syntax) 从具体语法中抽象出语言结构的本质性的东西,而不考虑语言的具体符号表示,从而可简化语义的形式描述。 在不同的语言中赋值语句有不同的写法 ? x=y;? x:=y;? y→x 等等 可以用抽象形式 ??? ??????assignment(variable, expression) 把前面各种具体形式统一起来。;抽象语法(Abstract Syntax) 抽象语法树(AST)反映了抽象的语法结构,而分析树反映的是具体语法结构。语法树是分析树的抽象形式或压缩形式。 在抽象语法树表示中,每一个叶结点都表示诸如常量或变量这样的运算对象,而其它内部结点则表示运算符。抽象语法树不同于分析树,它展示了一个操作过程并同时描述了源程序的层次结构。;语法规则中包含的某些符号可能起标点符号作用,也可能起解释作用。 回顾前述的赋值语句,其产生式规则是 S→V = e 其中的赋值号“=”仅仅起标点符号作用,目的是把V和e分隔开 而条件语句的产生式规则: S→if B then S1 else S2 其中的关键字if、then、else起注释作用,说明当布尔表达式B为真时执行S1语句,否则执行S2;赋值语句的本质部分是V和e 条件语句的???质部分是B, S1和S2 把语法规则中本质部分抽象出来而将非本质部分去掉后,便得到抽象语法规则 这种去掉不必要信息的做法可以获得高效的源程序中间表示。上述语句的抽象语法规则为: (1) 赋值语句: 左部 表达式 (2) 条件语句: 表达式 语句1 语句2;根据这种方法得到两种语句的语法树如下:;赋值语句x=a+b*c的抽象语法树和分析树;表达式的语法树构建方法(利用语法制导定义) 辅助函数: 1. mknode(op, left, right) 建立一个运算符号结点,标号是op,两个域left和right指向运算分量结点的指针。 2. mkleaf(id,entry) 建立一个标识符结点,由标号id标识,一个域entry指向标识符符号表中相应的项。 3. mkleaf(num,val) 建立一个数结点,标号为num,域val用于存放数的值。返回新建立结点的指针。;建立表达式语法树的语法制导定义;表达式a-4+c的语法树建立过程;表达式a-4+c的语法树建立过程;建立赋值语句语法树的语法制导定义;赋值语句a := b *-c的语法树构建过程;赋值语句a := b *-c的语法树构建过程;表达式的有向非循环图表示(DAG,Directed Acyclic Graphs) 用途: 提取表达式中的公共子表达式,以取得目标程序的局部优化。 方法:执行mknode和mkleaf时,检查是否已有相同的结点,若有,则返回相应结点的指针。 与语法树的区别:语法树中公共子表达式由重复的子树表示,而 DAG 中只用一个子树表示,因此代表公共子表达式的结点有多个父节点;表达式a+a*(b-c)+(b-c)*d的语法树和DAG;表达式a+a*(b-c)+(b-c)*d的语法树和DAG;表达式a+a*(b-c)+(b-c)*d的语法树和DAG;波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示法。 这种表示法把运算量(操作数)写在前面,把运算符写在后面,因而又称后缀表示法。例如,把a+b写成ab+,把a*(b+c)写成abc+*。 一般,若e1,e2为任意的后缀表达式,Θ 为任意双目运算符,则用Θ作用于e1和e2所代表的结果用后缀式e1e2 Θ表示。 推而广之, Θ为k目运算符,则Θ作用于e1e2…ek的结果用 e1e2…ek Θ来表示。;中缀式: a*d + b*c + e;25;后缀表示法的优点:

文档评论(0)

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

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

1亿VIP精品文档

相关文档