网站大量收购闲置独家精品文档,联系QQ:2885784924

编译原理第7-9章.ppt

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

第七章 语义分析 第七章 语义分析与 中间代码产生 第六章介绍的属性文法和语法制导翻译方法和技术应用于语义分析和中间代码产生;中间代码的种类;各类语法单位翻译成中间代码的方法 §7.0 引言 一、本章主要内容: 静态语义检查和翻译中间代码; 二、静态语义检查的内容: 类型检查、控制流检查、一致性检查、相关名字检查、 名字的作用域分析等; 三、翻译产生中间代码的优点: 便于进行与机器无关的代码优化工作、使编译程序改变目标 机更容易、使编译程序的结构在逻辑上更为简单明确; 四、静态语义检查和中间代码产生在编译程序中的地位: §7.1 中间语言(中间代码的种类) 一、后缀式(逆波兰) 1、表达式E的后缀式形式E'的定义: 若E是变量或常量:E'为E; 若E是E1 op E2:E'为E1'E2'op; 若E是(E1):E'为E1'; 2、中缀形式的表达式翻译为后缀式的语义规则: (E.Code:构成E后缀式;|| :捻接后缀式;op :二元算符) E→E1 op E2 {E.Code := E1.Code||E2 .Code||op} E→( E1 ) {E.Code := E1.Code} E → id {E.Code :=id} 3、例:a+b : ab+ , a*b : ab*, abc+* :a*(b+c) , ab+cd+* :(a+b) * (c+d) 二、图表示法 1、抽象语法树。 2、有向无环图(DAG): (1)构造:表达式的每个子表达式对应DAG中一个结点,内部结 点代表操作符,其孩子代表操作数; (2)与抽象语法树区别:抽象语法树描述源程序的自然层次结 构,DAG也可以,但可标识出公共子表达式; 例: 3、与后缀式的关系:表达式的抽象语法树形式的中间代码与后 缀式等价,后缀式是抽象语法树的线性表现形式,是树的结点序列(每个结点都在其所有子结点之后立即出现 )。 4、产生赋值语句抽象语法树的属性文法: ① 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(`@`,E1.nptr)} ⑤ E → (E1) {E.nptr:=E1.nptr} ⑥ E → id {E.nptr:=mkleaf(id ,id.place)} 5、抽象语法树表示(存储结构): 法1:每个结点用一个记录,每记录含运算符域和算量指针域; 法2:所有结点信息安排在一个记录数组中,结点的索引为指针。 三、三地址代码 1、含义:每条代码最多可以有三个操作数,是抽象语法树或DAG 的一种线性表示,为中间代码的一种抽象形式 2、基本格式:x := y op z 3、代码种类: (1)计算、赋值:x:=y op z 、x:=op y 、x:=y ; (2)流程控制:goto L、if x relop y goto L、if a goto L ; (3)过程调用:param x 、call p ,n; (4)数组元素引用:x:=y[i] 、x[i]:=y ; (5)地址、指针:x:=y 、x:=*y 、*x:=y ; 例 为如下定义赋值语句和简单算术表达式的文法设计属性文 法,将赋值语句翻译成三地址代码 S→id:=E E→E+E|E*E|-E|(E)|id 例(续):(1)属性:code—对应语法单位(非终结符)的三地址代码; E.place—E的值(存放位置:临时变量或符号表入口); id.place—id的值(存放位置:id的符号表入口); (2)子程序:NewTemp——分配一个新的临时变量 Gen——生成一个新的三地址代码 (3)产生三地址代码的属性文法 ① E→id {E.place:=id.place;E.code:=``;} ② E→(E1) {E.place:=E1.place;E.code:=E1.code;} ③ E→- E1 {E.place:=NewTemp; E.code:=E1.c

文档评论(0)

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

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

1亿VIP精品文档

相关文档