编译原理基础(刘坚)第4章节.pptVIP

  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文档。上传文档
查看更多
4.4.4 记录的域名 记录把若干个相同类型或者不同类型的变量(还可以是记录)封装在一起,形成一个新的数据类型,所以,记录的域名也是嵌套的。对域名的处理与过程中的嵌套定义很相近。首先,扩充文法G4.3中关于D的定义,使其包括记录类型: D → record D end 关键字record的作用与G4.3中的proc相同,每出现一个record,则进入记录的一层嵌套,与过程定义的处理相似,得到修改的文法和语法制导翻译如下。 D → record L D end { T.type := record(top(tblptr)); T.width := top(offset); pop;} L →ε { t := mktable(null); push(t,0):} 4.5 简单算术表达式与赋值句 程序设计语言中最基本也是最重要的语句是赋值句,它将赋值号右边的表达式赋给左边的变量。即以赋值号为界,将右值赋给左值。所谓的简单算术表达式和赋值句,是指表达式和赋值句中的变量是不可再分割的简单变量,如整型数或字符等,而不是组合变量或组合变量的元素,如数组或记录或它们的分量。 本节的讨论基于下述简化了的文法: A → id := E E → E1 + E2 | E1 * E2 | - E1 | ( E1 ) | id (G4.5) 4.5.1 简单变量的语法制导翻译 将简单表达式和赋值句翻译成三地址码的语法制导翻译如下。其中,首先引入属性与过程。属性.place:用于存放E的变量名地址,它可以是符号表中地址或者临时变量; 过程emit(result := arg1 op arg2):产生一条result:= arg1 op arg2的三地址码指令。 (1) ?A → id := E { emit(entry() := E.place);} (2) ?E → E1 + E2 { E.place := newtemp emit(E.place:=E1.place+ E2.place);} (3) E → E1 * E2 { E.place := newtemp; emit(E.place := E1.place * E2.place);} (4) ?E → – E1 { E.place := newtemp; emit(E.place := – E1.place);} (5) ?E → ( E1 ) { E.place := E1.place;} (6) ?E → id { E.place := entry();} 4.5.2 变量的类型转换 为了程序设计的灵活性,程序设计语言往往允许算术表达式的变量可以是不同类型,如既可以是整型也可以是实型。类型不同,最终的目标代码所分配的空间大小也不同。如果允许表达式中变量的类型不同,则必须提供一种机制,使得不同类型的变量最终被分配的存储空间大小相同,从而可以进行运算。这种机制被称为强制(coercion)。它按照一定的原则,将不同类型的变量在内部转换为相同的类型,然后进行同类型变量的计算。为了不损失变量中的信息,一般原则是将占用存储空间小的类型转换为占用存储空间大的类型,如整型转换为实型,上述语法制导翻译中变量的类型转换原则如图4.13所示。 图4.13 类型转换原则 (a) 二元运算的类型转换;(b) 赋值运算的类型转换 为了进行类型转换,需要引入一个新的属性.mode,它可以取值int或real。同时还需要引入两个新的三地址码指令,进行整型和实型之间的类型转换: T := itr E:将E从整型变为实型,结果存放T中; T := rti E:将E从实型变为整型,结果存放T中。 赋值句中表达式类型的确定比较简单,赋值号左部变量是什么类型,表达式就被转换为什么类型。对产生式E → E1 op E2中各表达式E类型的确定稍微困难一些,可以用图4.14的判断树来确定。 图4.14 确定算术表达式的类型 加入类型转换后的赋值句和表达式的语法制导翻译如下,其中运算+和*在产生式中合并为op。 (1) A → id :=

您可能关注的文档

文档评论(0)

时间加速器 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档