- 1、本文档共70页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
天津大学编译原理Part7语义分析与中间代码生成
数据库原理与Oracle——SQL语言 语义分析与中间代码生成 授课:胡静 语义分析的位置和作用 紧跟在语法分析和语法分析之后,编译程序要做的工作就是进行静态语义检查和翻译。 编译器必须要检查源程序是否符合源语言规定的语法和语义要求。这种检查称为静态检查,检查并报告程序中某些类型的错误。 静态语义检查 静态语义检查通常包括: 类型检查:如果操作符作用于不相容的操作数,编译器应该报错 控制流检查:引起控制流从某个结构中跳转出来的语句必须能够决定控制流转向的目标地址 唯一性检查:有时,有的对象只能被定义一次。比如,同一case语句的标号不能相同,枚举类型的元素不能重复。 与名字相关的检查:有时候要求同一名字在特定位置出现两次或多次(如,标识结构的开始和结尾) 中间语言 源语言的中间表示方法 抽象语法树 后缀式 三地址代码(包括三元式、四元式、间接三元式) DAG图表示 后缀式 后缀式表示又称逆波兰表示法。 这种表示法是:把运算量(操作数)写在前面,把算符写在后面(后缀)。 一个表达式的后缀形式可以如下定义: 如果E是一个变量或常量,则E的后缀式是E自身 如果E是E1opE2形式的表达式,这里op是任何二元操作符,则E的后缀式为E1’E2’op。这里E1’和E2’分别是E1和E2的后缀式。 如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式 这种表示法用不着使用括号。 只要知道每个算符的目数,对于后缀式,无论从那一端进行扫描,都能对它正确的进行唯一分解 后缀式 表达式翻译为后缀式的语义规则描述: 其中E.code表示E的后缀式,op表示任何二元操作符,“||”表示后缀形式的连接 图表示法 图表示法主要包括DAG( Directed Acyclic Graph )与抽象语法树 语法树描述了源程序的自然层次结构。DAG以更紧凑的形式给出了相同的信息。两者不同的是: 在一个DAG中代表公共子表达式的结点具有多个父结点 在一颗抽象语法树中公共子表达式被表示为重复的子树。 抽象语法树 语法树中的边不会显式的出现在后缀表达式中,可以根据结点出现的顺序及结点上的操作符所要求的操作数的个数来恢复。其恢复过程类似使用栈对后缀表达式求值。 如果函数mknode(op, child)和mknode(op, left, right)尽可能返回一个指向一个存在的结点的指针以代替建立新的结点,那么就会生成DAG图。 抽象语法树的表示形式 三地址代码 三地址代码是下列一般形式的语句序列 x := y op z 其中,x、y和z是名字,常量或编译器生成的临时变量 op代表任何操作符(定点运算符、浮点运算符、逻辑运算符等) 这里不允许组合的算术表达式,因为语句右边只有一个操作符。 像x+y*z这样的表达式要翻译为如下; T1 := y * z T2 := x + T1 其中T1 ,T2为编译时产生的临时变量。 三地址代码 这种复杂算术表达式和嵌套控制流语句的拆解使得三地址码适用于目标代码生成及优化。 由程序计算出来的中间值的名字的使用使得三地址码容易被重排列——而不像后缀表达式那样 三地址码可以看成是语法树或DAG的线性表示。 三地址码的得名原因是每条语句通常包含三个地址,两个是操作数地址,一个是结果地址。 在实际的实现中,有程序员定义的名字被一个指向改名字的符号表表项的指针所代替。 三地址码 三地址语句的类型 三地址语句类似于汇编语言代码。语句可以由符号标号,而且存在各种控制流语句。 符号标号代表存放中间代码的数组中三地址代码语句的下标。下面列出本书中使用的三地址语句的种类: 形如x:= y op z的赋值语句,其中op为二元算术算符或逻辑算符 形如x:= op y的赋值语句,其中op为一元算符。 形如x:= y的复制语句,将y的值赋给x 形如goto L的无条件跳转语句,即下一条将被执行的语句是带有标号L的三地址语句 三地址语句的类型 下面列出本书中使用的三地址语句的种类: 形如if x relop y goto L或 if a goto L的条件跳转语句。 第一种形式使用关系运算符号relop(,等) 第二种a为布尔变量或常量 用于过程调用的语句param x和call p, n,以及返回语句return y。源程序中的过程调用p(x1,x2,…,xn): param x1 param x2 …… param x2 call p, n n表示实参个数。return y中y为过程返回的一个值 三地址语句的类型 下面列出本书中使用的三地址语句的种类: 形如x := y[i]及x[i] := y的索引赋值。 形如x := y, x := *y和*x := y的地址和指针赋值。 设计中间代码形式时,运算符的选择是非
文档评论(0)