第七章語义分析和中间代码生成.doc

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

第七章 语义分析和中间代码生成 知识结构: 语义分析 语法分析概述 语法制导翻译 逆波兰式表示 三元式表示 语义分析和中 中间语言 图型表示 间代码生成 四元式表示 三地址语句表示 赋值语句的翻译 布尔表达式的翻译 中间代码生成 控制语句的翻译 说明语句的翻译 过程语句的翻译 第一节 语法制导翻译概述 一、语义分析的任务 在词法分析和语法分析的基础上进一步分析其含义,主要的工作是进行静态语义检查和翻译。 二、语义分析的功能 1、类型检查 检查运算的合法性(运算对象的一致性)。 2、一致性检查 一个对象(标识符等)在一个分程序中只能被定义一次。 3、相关名字检查 如果一个名字必须出现多次,检查使用的名字是否相同的。 4、控制流检查 控制流语句必须使控制转移到合法的地方。 5、确定类型 确定标识符所关联得数据类型。 6、识别含义 确认程序中各种成分组合到一起的含义,并作相应的语义处理,对可执行的语句生成中间语言或目标语言。 三、生成的语言 1、直接生成目标语言 根据源程序中各语法成分的语义,直接生成机器语言或汇编语言。其特点: ⑴ 编译时间较短; ⑵ 存储空间较大; ⑶ 目标语言的质量较差。 2、生成中间语言 介于源程序语言和机器语言之间的机内表示形式。其特点: ⑴ 编译程序的逻辑结构简单; ⑵ 有利于编译程序的移植; ⑶ 便于目标语言的优化。 四、语义分析方法 1、语法制导翻译方法 在语法分析过程中,使用语法规则进行归约的同时,根据每个产生式的语义动作进行翻译(在语法规则的制导下,通过对语义规则的计算,完成对输入字符串的翻译)的方法。 2、属性翻译方法 指明语义规则的计算次序,陈述一些实现细节,以表达语义动作在语法分析过程中的执行时刻。 五、语义规则 为文法中的每一条产生式配置计算属性的计算规则。 六、语法制导翻译 为文法中每个产生式配备一组语义规则。 1、语义规则 语义规则计算包括:产生代码、在符号表中存放信息、在分析工作栈中填写语义值(属性值),并生成相应的中间代码。 2、自上而下分析 用一条产生式与输入符号匹配成功时, 执行相应语义子程序生成中间代码。 3、自下而上分析 用一条产生式进行的归约时, 执行相应语义子程序生成中间代码。 七、翻译简例 表达式文法和相应的翻译模式:(P179) S→id:=E { p:=Lookup(id.name); if p nil then emit (p‘:=’E.place) else error} E.place 为属性值(语义变量),代表存放E值的变量名在符号表的入口地址或指向代表E值的临时变量的整数值。 E→E1+E2 {E.place:=newtemp; emit( E.place‘:=’E1.place‘+’E2.place)} 语法分析工作栈进行扩充,增加相应的语义值,语法分析同时(如归约时),执行语义规则(语义子程序)。 例:x:=y+z的语法制导翻译 ⑴用E→E1+E2归约 执行语义规则 E2 E2.place {E.place:=T1; + - 归约后 E E.place emit(T1:=’y‘+’z)} E1 E1.place 符号 语义值 生成一条中间代码 符号 语义值 ⑵用S→id:=E归约 执行语义规则 E E.place { p:=Lookup(x); := - 归约后 s E.place emit (x‘:=’ T1)} id id.place 符号 语义值 生成一条中间代码。 符号 语义值 这样语法分析结束时也就生成了中间代码: (0) T1:=y+z (1) x:= T1 注意: 语义工作栈中的值与状态工作栈中的值一一对

文档评论(0)

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

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

1亿VIP精品文档

相关文档