[理学]第7章 语法制导翻译和中间代码生成.pptVIP

[理学]第7章 语法制导翻译和中间代码生成.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[理学]第7章 语法制导翻译和中间代码生成

第七章 语法制导翻译和中间代码生成 语义处理的功能: 静态语义分析 生成中间代码 语义规则与产生式的关联 关联的方式:语法制导定义和翻译模式 注意:语法分析与语义分析逻辑上分开,实际上两者结合,以提高分析 效率。 对语义规则求值的一般过程 输入符号串 分析树 依赖图 语义规则的计算顺序 编译过程 属性文法 属性可以代表任何对象:类型、内存单元、数字、字符串或其他对象。 每个文法符号都有一个相关的属性集。 属性分为两个子集:综合属性和继承属性 一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在每个产生式上。 在语法分析过程中,按语义规则执行动作,实现语义处理(计算或翻译成中间代码)。 语义规则建立了属性间的依赖关系,可以用图来表示。 类型检查 语法制导定义的形式 在语法制导定义中,每个产生式A ? ?都有一个形如 b = f (c1,···,cn)的语义规则集合与之关联,其中f 是函 数,并满足下列两种情况之一: b是A的一个综合属性,且c1,···,cn是该产生式文法符号的属性。 b是产生式右部某个文法符号的一个继承属性,且c1,···,cn也是该产生式文法符号的属性。 语法制导翻译概述: 在语法分析的过程中,归约时根据产生式所对应的语义 规则执行相应的语义动作,这种方法称为语法制导翻译。 语法制导翻译具体实现途径:假设有一个LR语法分析 器,现在把它的分析栈扩充,使得每个文法符号都跟有语义 值,同时把LR分析器的能力扩大,使它不仅执行语法分析 任务,且能在用某个产生式进行归约的同时调用相应的语义 值保存在扩充的分析栈里“语义值”栏中。如果语义动作是产 生某种中间代码的动作,那么则可在语法分析的制导下,随 着分析的进展逐步生成中间代码。 继承属性 分析树中,一个节点的继承属性值是由该节点的父节点和(或)兄弟节点的属性决定的。 用继承属性来表示程序设计语言上下文结构的依赖性是很方便的。 虽然我们总是可以只用综合属性来改写语法制导定义,但是使用带有继承属性的语法制导定义会更自然。 中间代码的形式 逆波兰记号(后缀式) 表达式 逆波兰表示 a+b ab+ a+b*c abc*+ (a+b)*c ab+c* a:=b*c+b*d abc*bd*+:= 三元式和树形表示 三元式组成部分:算符op,第一运算对象ARG1,第二运算 对象ARG2。 例如:a:=b*c+b*d表示为 (*,b,c) (*,b,d) (*,(1),(2)) (:=,(3),a) 四元式 四元式的四个组成部分:算符op,第一运算对象ARG1,第 二运算对象ARG2,运算结果RESULT。 例如:a:=b*c+b*d表示为 (*,b,c,t1) (*,b,d,t2) (*,t1,t2,t3) (:=,t3,-,a) 简单赋值语句的翻译 产生式 语义规则 S ? id := E {p := lookup(id.name); if p != nil then emit (p ‘:=’ E.place) else error} E ? E1 + E2 {E.place := newtemp; emit (E.place ‘:=’ E1.place ‘+’ E2.place)} E ? E1 * E2 {E.place := newtemp; emit (E.place ‘:=’ E1.place ‘*’ E2.place)} E ? - E1 {E.place := newtemp; emit (E.place ‘:=’ ‘uminus’ E1.place)} E ? (E1) {E.place := E1.place} E ? id {p := lookup(id.name); if p != nil then E.place := p else error} 布尔表达式的翻译 5.1 布尔表达式的翻译方法 布尔表达式a or b and not c翻译成四元式为 t1 := not c t2 := b and t1 t3 := a or t2 ab 等价于if ab then 1 else 0 翻译成四元式为 if ab goto (4) t := 0 goto (5)

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档