编译7语义分析和中间代码产生1(zss).ppt_第1页
编译7语义分析和中间代码产生1(zss).ppt_第2页
编译7语义分析和中间代码产生1(zss).ppt_第3页
编译7语义分析和中间代码产生1(zss).ppt_第4页
编译7语义分析和中间代码产生1(zss).ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理(第三版) 陈火旺等编著,(2012年9月-12月) 主讲:朱世松 计算机学院,2,2019/8/6,概述,一、语义分析的任务 审查每一个语法结构的静态语义,即验证语法正确的结构是否有意义。 如:赋值语句:x=x+y,左边变量类型与右边变量类型是否一致。 在语义正确的基础上生成一种中间代码或目标代码。,3,2019/8/6,二、语义分析的范围 1.确定类型:确定标识符所关联的数据类型。 2.类型检查:按语言的类型规则,检查运算的合法性与运算分量类型的一致性,必要时作类型转换。 3.识别含义:根据语言的语义定义(形式或非形式),识别程序中各构造成分组合到一起的含义,并作相应的语义处理(生成中间代码或目标代码) 4.控制流检查:控制流语句必须转移到合法的地方。 如:C中,break语句规定跳出最内层的循环或switch语句.,4,2019/8/6,5.一致性检查:在很多场合要求对象只能被说明一次(避免重复定义)。 6.相关名字检查:如:Ada,循环或块可以有一个名字,它出现在这些结构的开头或结尾。编译程序必须检查这两个地方用的名字是否相同。,5,2019/8/6,三、语义描述工具和语义分析方法 语义描述工具 目前流行:用属性文法作为描述语义的工具。 语义分析方法 根据描述属性文法的语义规则的方式不同,语义分析方法分为: 语法制导定义方法 翻译方案,6,2019/8/6,1 中间语言 中间语言:它介于源程序到目标语言程序中间程序的语言 中间语言程序:用中间语言表示的程序。 作用:用于编译程序,将源程序翻译成等价的中间语言程序,再将中间语言程序转化成目标程序(即将语义分析和目标代码生成分开处理) 源程序 中间语言程序 目标程序 中间语言是表示语法制导翻译的结果。,等价变换,转化,7.1 中 间 语 言,7,2019/8/6,好处: 中间语言与机器无关,使采用中间语言进行翻译的编译程序系统易于移植。 易于优化翻译后的代码。 使编译程序的结构在逻辑上更简单明确。 2 中间语言的表示 常见:逆波兰表示 四元式表示和三地址代码、三元式 图表示: DAG和树形表示,8,2019/8/6,7.1.1 逆波兰表示 由波兰逻辑学家J.Lukasiewicz(卢卡西维兹)首先提出用来表示表达式的方法,后来推广到表示程序设计语言中的其它语法成分。 表达式的逆波兰表示 表达式的表示: 中缀表示: 运算符居中,运算对象在左右两边:a+b 波兰表示: 前缀表示:运算符在前,运算对象在后:+ab 后缀表示:运算对象在前,运算符在后:ab+ (逆波兰表示),9,2019/8/6,例:逆波兰表示的例子,10,2019/8/6,(1)表达式逆波兰表示的定义: 设E是一般表达式,则: 一般表达式 逆波兰表达式 若E为变量或常量 E (E) E的逆波兰式 E(1)opE(2)(二目运算) E(1)的逆波兰式 E(2)的逆波兰式 op opE(单目运算) E的逆波兰式 op,11,2019/8/6,把表达式翻译成后缀式的语义规则描述,产生式 EE(1)op E(2) E (E(1) Eid,语义动作 E.code:= E(1).code | E(2).code |op E.code:= E(1).code E.code:=id,E.code表示E后缀形式 op表示任意二元操作符 “|”表示后缀形式的连接。,12,2019/8/6,(2)逆波兰表示的特点 a.标识符(运算对象)出现的顺序(从左到右)和原有顺序相同。 b. 运算符是按实际计算顺序(从左到右)出现的。 c. 运算符紧跟在运算对象的后面出现,并且没有括号。,13,2019/8/6,(3) 好处:易于对表达式的计算处理 对于一般表达式的计算,系统需要用两个工作栈分别处理运算对象和运算符。 对于逆波兰表示的表达式计算处理只用一个工作栈。 一般的计算过程是:自左至右扫描后缀式,每碰到运算量就把它推进栈。每碰到k目运算符就把它作用于栈顶的k个项,并用运算结果代替这k个项。,14,2019/8/6,例:逆波兰式ab+c*的计算处理过程,遇运算对象a,b入栈,扫描ab+c*,栈,遇二目运 算符+c*,取出a,b,运算结果T入栈,取出c,T作运算,设结果T1,遇运算符*,c*,遇运算对象c入栈,15,2019/8/6,2. 形成逆波兰表示 怎样将一般表达式转换成逆波兰表示? 基本思想:从左到右扫描表达式,每遇到: 1o 表达式中的运算对象则往左去。 2o 表达式中的运算符,则与运算符栈顶元素比较优先数:,16,2019/8/6,逆波兰表示,表达式,运算对象,运算符,进栈,出栈,运算符栈,如果运算符栈顶元素的优先数大于或等于表达式中当前的运算符优先数,则栈顶元素退栈向左去。然后当前运算符继续与栈顶的新元素比较优先数。直到栈顶元素的优先数小于表达式中当前运算符为止。此时,才将表达式中当前运算符进栈。,17,2019/8/6,例:画出形成表达式a*(b+c/d)的逆波兰表示过程,18,2019/8/6,19,2019/8/6,形成逆波兰表示的过程,实质上是表达式的翻译过程。(算法不难写出) 例:a/b/c+d = ab/c/d+ (a+b)*(c-d/e) = ab+cde/-*,20,2019/8/6,数组POST存放后缀式:k为下标,初值为1 上述语义动作可实现为: 产生式 程序段 EE(1)op E(2) POSTk:=op;k:=k+1 E (E(1) Ei POSTk:=i;k:=k+1 例:输入串a+b+c的分析和翻译 POST: 1 2 3 4 5,EE(1)op E(2) E.code:= E(1).code | E(2).code |op E (E(1) E.code:= E(1).code Eid E.code:=id,a,b,+,c,+,21,2019/8/6,7.1.2 图表示法,图表示法 DAG 抽象语法树,22,2019/8/6,7.1.2 图表示法,无循环有向图(Directed Acyclic Graph,简称DAG) 对表达式中的每个子表达式,DAG中都有一个结点 一个内部结点代表一个操作符,它的孩子代表操作数 在一个DAG中代表公共子表达式的结点具有多个父结点,23,2019/8/6,a:=b*(-c)+b*(-c)的图表示法,24,2019/8/6,抽象语法树对应的代码: T1:=-c T2:=b*T1 T3:=-c T4:=b*T3 T5:=T2+T4 a:=T5,25,2019/8/6,DAG对应的代码: T1:=-c T2:=b*T1 T5:=T2+T2 a:=T5,抽象语法树对应的代码: T1:=-c T2:=b*T1 T3:=-c T4:=b*T3 T5:=T2+T4 a:=T5,26,2019/8/6,产生赋值语句抽象语法树的属性文法,产 生 式 语义规则 Sid:=E S.nptr:=mknode(assign, mkleaf(id,id.place),E.nptr) EE1+E2 E.nptr:=mknode(+,E1.nptr,E2.nptr) EE1*E2 E.nptr:=mknode(*,E1.nptr,E2.nptr) E-E1 E.nptr:=mknode(uminus,E1.nptr) E (E1) E.nptr:=E1.nptr Eid E.nptr:=mkleaf(id,id.place),27,2019/8/6,7.1.3 三地址代码,三地址代码 x:=y op z 三地址代码可以看成是抽象语法树或DAG的一种线性表示,28,2019/8/6,a:=b*(-c)+b*(-c)的图表示法,29,2019/8/6,T1:=-c T1:=-c T2:=b*T1 T2:=b*T1 T3:=-c T5:=T2+T2 T4:=b*T3 a:=T5 T5:=T2+T4 a:=T5 对于抽象语法树的代码 对于DAG的代码,30,2019/8/6,三地址语句的种类,x:=y op z x:=op y x:=y goto L if x relop y goto L或if a goto L param x和call p,n,以及返回语句return y x:=yi及xi:=y的索引赋值 x:=&y, x:=*y和*x:=y的地址和指针赋值,31,2019/8/6,生成三地址代码时,临时变量的名字对应抽象语法树的内部结点 id:=E 对表达式E求值并置于变量T中值 id.place:=T,32,2019/8/6,从赋值语句生成三地址代码的S-属性文法,非终结符号S有综合属性S.code,它代表赋值语句S的三地址代码。 非终结符号E有如下两个属性: E.place表示存放E值的名字。 E.code表示对E求值的三地址语句序列。 函数newtemp的功能是,每次调用它时,将返回一个不同临时变量名字,如T1,T2,。,33,2019/8/6,为赋值语句生成三地址代码的S-属性文法定义,产生式 语义规则 Sid:=E S.code:=E.code | gen(id.place := E.place) EE1+E2 E.place:=newtemp; E.code:=E1.code | E2.code | gen(E.place := E1.place + E2.place) EE1*E2 E.place:=newtemp; E.code:=E1.code | E2.code | gen(E.place := E1.place * E2.place) E-E1 E.place:=newtemp; E.code:=E1.code | gen(E.place := uminus E1.place) E (E1) E.place:=E1.place; E.code:=E1.code Eid E.place:=id.place; E.code= ,34,2019/8/6,三地址语句,四元式 一个带有四个域的记录结构,这四个域分别称为op, arg1, arg2及result op arg1 arg2 result (0) uminus c T1 (1) * b T1 T2 (2) uminus c T3 (3) * b T3 T4 (4) + T2 T4 T5 (5) := T5 a,35,2019/8/6,三地址语句,三元式 通过计算临时变量值的语句的位置来引用这个临时变量 三个域:op、arg1和arg2 op arg1 arg2 (0) uminus c (1) * b (0) (2) uminus c (3) * b (2) (4) + (1) (3) (5) assign a (4),36,2019/8/6,三地址语句,xi:=y op arg1 arg2 (0) = x i (1) y x:=yi op arg1 arg2 (0) = y i (1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论