编译原理清华大学第8章语法制导翻译和中间代码生成解读.ppt

编译原理清华大学第8章语法制导翻译和中间代码生成解读.ppt

  1. 1、本文档共149页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * 8.7 简单说明语句的翻译 程序设计语言中的说明语句旨在定义各种形式的有名实体,如常量、变量、数组、记录(结构)、过程、子程序等等,说明语句的种类也多,对象说明、变量说明、类型说明、过程说明等等。 程序设计语言中最简单的说明句的语法描述为:  D→integer〈namelist〉|real〈namelist〉 〈namelise〉→〈namelist〉,id|id 用上述文法来制导翻译(自下而上)存在着这样一个问题,我们只能在把所有的名字都归约成namelist后才能把它们的性质登记进符号表。这意味着namelist必须用一个队列(或栈)来保存所有这些名字。 文法改写:   D→D1,id     |integer id     |realid 翻译方案: (1) D→integerid {enter(id,int);           D.ATT∶=int} (2) D→realid {enter(id,real);           D.ATT∶=real} (3) D→D1,id {enter(id,D1.ATT);           D.ATT∶=D1.ATT} 8.8 含数组元素的赋值语句的翻译 数组的一般定义 a [l1:u1,l2:u2,…,lk:uk,…,ln:un] (1≤k≤n) 其中a是数组名,lk称为数组下界,uk称为数组上界,变量k是数组的维数。 一维数组a [l1:u1]: a [i] =起始地址 + 元素在数组中的线性序号 – 1 =b1 + ( i - l1) b1是数组a的起始地址。 考虑存储宽度ω, 则: a [i] =起始地址 + 元素在数组中的线性序号 – 1 =b1 + ( i - l1) * ω 整理后有: a [i] =(b1 - l1) * ω + i * ω 令C=(b1 - l1) * ω, 则有: a [i] =C+ i * ω 二维数组a [l1:u1,l2:u2]: 必须事先约定存储顺序。常见的有按行存放和按列存放两种。如有一个2行3列的二维数组a [1:2,1:3],则有: 按行存放顺序为:a[1,1],a[1,2],a[1,3],a[2,1],a[2,2],a[2,3] 按列存放顺序为:a[1,1],a[2,1],a[1,2],a[2,2],a[1,3],a[2,3] 存放顺序不一样则数组元素存储地址的计算就不一样,下面我们仅讨论按行存放方式的数组元素存储地址的计算。 例:A是10×20的二维数组。 按行存放: A[1 , 1] A[1 , 2] 第一行 . A[1, 20] A[2, 1] 第二行 A[10, 20] 第十行 . . . . . . . . . . . 按列存放: A[1 , 1] A[2 , 1] 第一列 . A[20, 1] A[1, 2] 第二列 A[1, 20] 第十列 . . . . . . . . . . . 例如:对于二维数组a [1:2,1:3], a [ i,j ] =起始地址 + 元素在数组中的线性序号 – 1 =b + ( i - 1) * 3+ ( j - 1) 一般地二维数组a [l1:u1,l2:u2],数组元素a [ i,j ] 的存储地址计算为: a [ i1,i2 ] =起始地址 + 元素在数组中的线性序号–1 =b +[(行数-1) * 每行个数+ 列数] - 1) =b + [((i1 - l1+1)- 1) * (u2- l1+1) + (i2 - l2+ 1) ]- 1) =b + [(i1 - l1) * n2 + (i2 - l2+ 1) ]- 1) =b-( l1* n2+ l2)+ [(i1* n2)+ i2] =C+ [(i1* n2)+ i2] 其中:n2=(u2- l1+1) 考虑存储宽度则有: a [ i1,i2 ] =C+

文档评论(0)

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

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

1亿VIP精品文档

相关文档