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

[工学]ch8-语法制导翻译和中间代码生成2.ppt

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

具有不同类型的赋值语句的语义描述 类型转换的语义处理 运算符的优先级 1、布尔表达式的翻译方法 布尔表达式文法G[E]: E→E and E∣E or E∣not E∣(E)∣true|false∣i rop i 数值表示法-用数值表示逻辑值 【例】布尔表达式 a ∨ b ∧ ┐c 翻译 【例】 a<b关系表达式的翻译方式 【例】根据数值表示法对布尔表达式 ab ∨ cd ∧ ef 翻译为三地址代码。 2、控制语句中布尔表达式的翻译 【例】布尔表达式 E:ab or cd and ef 的翻译。 分析语句 if ab ∨cd and ef then S1 else S2 拉 链 法 语句 if ab ∨c then S1 else S2的回填描述 布尔表达式翻译涉及的公共变量、过程与函数 E→E(1)∨E(2) ∧ T E (1) E (2) F T F “真”出口 “假”出口 它应该有下面的代码序列: E(1).code E(1).true: E(2).code 考虑表达式 E→E(1)∧E(2) 若 E(1) 为假,则立即知道 E 也为假,因此,E(1)的假出口也就是整个 E 的假出口; 若 E(1) 为真,则 E(2) 必须被计值,此时 E(2) 的第一个四元式就是 E(1) 的真出口。 当然,E(2) 的真假出口也就是整个 E 的真假出口。 E.false=E(1).false=E(2).false E.true=E(2).true E(1).true=E(2)第一个四元式 布尔表达式的翻译: 考虑表达式 E→ ┐E(1) 若 E(1) 为假,则 E 为真,因此,E(1)的假出口是 E 的真出口; 若 E(1) 为真,则 E 为假,因此,E(1) 的真出口是 E 的假出口。 E.false=E(1).true E.true =E(1).false 布尔表达式的翻译: 四元式指针 nextstat 始终指向下一条将要产生的四元式的地址(序号),其初值为1。每当执行一次emit语句后,nextstat自动增1。 设置非终结符 E 的语义变量 E.codebegin 表示非终结符 E 的第一个四元式标号。 回填过程 Backpatch(p,t) 把链首 p 所链接的每个四元式的第四区段(即result)都改写为地址 t。 链接函数 merge(p1,p2) 把以 p1 和 p2 为链首的两条链合并为一条以 p2 为链首的链(即返回链首值p2)。 语义子程序 (1)E→true { E.true = nextstat; E.codebegin = nextstat; emit(goto -); } (2)E→false { E.false = nextstat; E.codebegin = nextstat; emit(goto -); } (3)E→i(1) rop i(2) { E.true = nextstat; E.false = nextstat+1; E.codebegin = nextstat; emit(if i(1).place rop i(2).place goto -); emit(goto -); } (4)E→(E(1)) { E.true = E(1).true; E.false = E(1).false; E.codebegin = E(1).codebegin; } (6) E→E(1)∨E(2) { Backpatch(E(1).false,E(2).codebegin); E.codebegin = E(1).codebegin; E.true = merge(E(1).true,E(2).true); E.false = E(2).false; } (7)E→E(1)∧E(2) { Backpatch(E(1).true,E(2).codebegin); E.codebegin = E(1).codebegin; E.true = E(2).true; E.false = merge(E(1).fasle,E(2).false); } 语义子程序 (5)E→ ┐E(1) { E.true = E(1).false; E.false = E(1).true; E.codebegi

文档评论(0)

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

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

1亿VIP精品文档

相关文档