- 1、本文档共33页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4.3.3 三地址代码 (3)间接三元式 间接三元式的提出是为了优化三元式代码: 作为中间代码,通常不直接使用三元式表示,而是另设一张间接码表,也称执行表。 先给出三元式表,再按照三元式的执行顺序,依次排列三元式的执行编号,通过“三元式表+执行表”的组合来给出中间代码,就是间接三元式。 4.3 几种常见的中间语言 4.3.3 三地址代码 (3)间接三元式举例 例如,相应于赋值语句: x = (a-b) * c; b = a-b; y= c*(a-b) 4.3 几种常见的中间语言 按照三元式表示,可写成: ? (-, a, b) ?(*, ?,c)?(=, ?,x) ?(=, ?,b) ?(-, a, b) ?(*,c, ?) ?(=, ?,y) 按照间接三元式: ? (-, a, b) ?(*, ?,c)?(=, ?,x) ?(=, ?,b) ?(=, ?,y) ? ? ? ? ? ? ? 第 9 讲 西北农林科技大学本科教程 主讲教师:赵建邦 第四章 语义分析和中间代码生成 4.1 语义分析概述 4.2 属性文法 4.3 几种常见的中间语言 4.4 表达式及赋值语句的翻译 4.5 控制语句的翻译 4.6 数组元素的翻译 4.7 过程或函数调用语句的翻译 4.8 说明语句的翻译 4.9 递归下降语法制导翻译方法简介 第四章《语义分析和中间代码生成》 4.1 语义分析概述 4.2 属性文法 4.3 几种常见的中间语言 重点掌握 语法翻译制导思想 逆波兰表示法 三地址代码(四元式、三元式) 本讲目标 4.1 语义分析概述 4.1.1 语义分析的内容 语义分析包括两部分: 1. 静态语义审查(编译阶段) (1)类型检查:检查运算的合法性和运算分量类型的相容性,必要时进行类型转换。 (2)控制流检查:保证控制语句有合法的转向点。 (3)一致性检查。 2. 生成目标代码或中间代码 生成中间代码的好处: (1) 使得编译结构在逻辑上更为简单明确 (2) 容易实现目标代码的优化 4.1 语义分析概述 4.1.1 如何实现语义分析? 语义分析不像词法分析和语法分析那样,分别可以用正规文法和上下文无关文法形式化地进行描述 语义分析的描述工具:属性文法 语义分析的实现方式:语法制导翻译 其中,属性文法是语法制导翻译的基础 4.1 语义分析概述 4.1.2 语法制导翻译方法(原理) 语法制导翻译的方法就是为每个产生式配上一个翻译子程序(称语义动作或语义子程序),并在语法分析的同时执行这些子程序。 语义子程序的作用:描述一个产生式所对应的翻译工作。 如:改变变量的值,查、填符号表、发现语义错误、 产生中间代码等。 所以,在语法分析过程中,当每一个产生式获得匹配(对应自顶向下推导)或成功规约(对应于自底向上)时,此产生式相应的语义子程序进入工作,最终完成翻译工作。 那么,语法制导翻译分为自顶向下和自底向上两种。 4.1 语义分析概述 4.1.2 语法制导翻译方法(实例) 假定有一个自底向上的LR分析器,原始功能是规约输入串。如:“#7+9*5#”。现在将它的功能加以扩大,使其在规约输入串的同时调用语义子程序计算输入串的语义。 产生式 语义动作(0) ?S→E print val[TOP](1) E→E(1)?+?E(2) val[TOP]= val[TOP] +val[TOP+2](2) E→E(1)*E(2) val[TOP]=val[TOP]* val[TOP+2](3) ?E→(E(1)) val[TOP]=val[TOP+1](4) ?E→i val[TOP]=lexval (注:lexval为i的整型内部值) 图4-1 扩充后的LR分析栈 注意语义栈的功能:完成语义动作后,保存语义值 状态栈、符号栈和 语义栈三者同步变化 2. 在用某一规则进行归约之后,调用相应语义子程序完成语义动作,将改变的语义值保存在语义栈中 表4.1 表达式“7?+?9*5#”的语义分析和计值过程 产生式 语义动作(0) ?S→E print val[TOP]
文档评论(0)