含数组元素的算术表达式及赋值语句的翻译_第1页
含数组元素的算术表达式及赋值语句的翻译_第2页
含数组元素的算术表达式及赋值语句的翻译_第3页
含数组元素的算术表达式及赋值语句的翻译_第4页
含数组元素的算术表达式及赋值语句的翻译_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5.7 l在节中,我们已讨论了仅含简单变量的算术表达式和赋值语句的翻译问题。现在,我们进一步讨论含有数组含有数组元素元素()的算术表达式和赋值语句的翻译。l在编译过程中,的处理可以有两种方案:1.在语义分析阶段进行在语义分析阶段进行 即在此阶段中,根据下标变量在赋值语句中的作用,产生相应的中间代码;2.在目标代码生成阶段进行在目标代码生成阶段进行 即在语义分析阶段,把源程序中下标变量的有关信息保留在中间代码中,待生成目标代码时,再对它们产生相应的目标指令。 l本课中我们将采取前一种方式。因为它有利于进行代码的优化,以便产生高效的目标代码。特别是当数组元素数组元素出现在循环中时,代码优化的效果尤

2、为显著。 l一般说来,源程序中的每个变量(包括简单变量和下标变量)除它们的名字、类型等属性外,还有两种重要的属性:l一个变量出现在源程序中的环境不同,则它所代表的特征也就不同。例如,赋值语句 的语义为:把变量把变量的值的值( (即即 的数据单元的内容,也即的数据单元的内容,也即 的的) )送入送入 所代所代表的数据单元表的数据单元( ( 的的) )中去。中去。l对于含有的赋值语句,无论它出现在赋值号的左侧或右侧,在进行翻译时都要计算它的地址。l出现在赋值语句右部表达式的,应同时具有;出现在左部的,可只具有,但出现在左部的中的,仍具有。l对进行翻译的核心是计算它们的地址计算它们的地址。因此,我们

3、将首先讨论数组元素的地址计算方法数组元素的地址计算方法及数组元素引数组元素引用的中间代码形式用的中间代码形式,然后再介绍含有数组元素的赋值语句的语法制导翻译方法。5.7.1 下标变量地址的计算l数组元素在计算机中是按某种顺序存储的,即不管数组是几维的,一般总是把它映射为存储空间的一个向量.l数组的存储通常有两种方式:(1)按行存放,如PASCAL、C等语言; (2)按列存放,如FORTRAN语言.l程序中可以用下标变量的形式访问一数组的任意元素。因此,在编译时,就必须计算相应的下标变量的地址或该变量在数组存储映象中的位置。l显然,计算地址的方法与数组的存储方式有关。的的l假定数组按行存放,每个

4、数组元素占用一个机器字,并假定计算机是按字编址的,则对于用VARVAR ARRAYARRAY OFOF REALREAL; ;所说明的 维PASCAL数组 ,下标变量 的地址计算公式为( )=( )+ (5.185.18) )() 1()(111nnnjkkknjjjliluli的的l如果我们用 表示数组 的首地址( ),用dk表示数组第 维的下标界差,则上式可写成:( )=111)()(njnjknnkjjlidlia或( )=)()(111111 njnjknkjnjnjknkjidildla若仅考虑静态数组,则均为常量,这时前页中的等式右侧第一个括号内的值为一常量,在编译时已可计算出。因

5、此,公式可改写为( )=+ (5.21)其中,=,且111njnjknkjldlC 111njnjknkjidiVARPARTl为了按上述公式计算数组元素的地址,在编译程序对数组说明进行语义处理时,须把数组的等有关信息记录下来。l此外,如果数组是常界的,还可将以及上面公式中的常量 记录下来.l为了便于引用,通常是把上述信息存放于数组相应的“”之中.对的访问,可通过数组在符号表中相应登记项的域以间接寻址方式进行(即将其域作为指针用于存放内情向量的首地址)。 对于一个常界数组而言,有了上述内情向量之后,在计算的地址时,只须根据相应的下标以及各维界差,产生计算的中间代码,并从内情向量中查出和 ,产生

6、计算的中间代码即可。为简单起见,在下面的讨论中,我们假定数组各维的下界均为时计算时计算 的地址的公式的地址的公式=+= - ,=( ), 1111njnjkkdC 111njnjknkjidiVARPARTkkud为了提高效率,我们可将其按霍纳格式进行改写= (5.24)= (5.25) l在处理数组说明时,数组的全部信息已填写完毕,同时,编译程序也根据这些信息计算并记录了 之值.l因此,在处理数组元素引用时,只需产生计算(即)并将其赋给临时变量的四元式序列,以及计算并赋给临时变量 的四元式序列,然后产生按变址操作访问数组元素的四元式即可.l但需指出,一般在编译阶段并不给数组分配数据空间并不给

7、数组分配数据空间,故数组的首地址值 此时不能确定.尽管如此,我们仍可我们仍可按上述结构来产生数组元素引用的中间代码按上述结构来产生数组元素引用的中间代码,留待目标代码生成阶段和连接装配时留待目标代码生成阶段和连接装配时用于描述变值存取的四元式用于描述变值存取的四元式:(1),这需要涉及到该下标变量的;(2),即只涉及到该下标变量的.因此,为了产生含有的赋值语句中间代码,需要定义两种形式的四元式:(1)变址取数四元式其中,“”为操作符,其含义可解释为;(2)变址存数四元式 其中,“”是操作符,其含义则相当于. 5.7.2 我们假定,含有下标变量的表达式是,即它可以是由简单变量或下标变量组成的,仅

8、有运算的表达式。其文法为: l在把下标表达式串归约为非终结符号的过程中,需按公式()逐步产生计算的四元式序列,从而也就需经常查询数组内情向量中的有关信息(如).l所以,应将数组名与第一下标表达式联系起来,以便于把在符号表中的序号作为语义属性信息传递给,利用这一属性可查询数组内情向量的信息.l为此,我们把上述文法中关于非终结符号和的产生式改写为 () 文法符号的文法符号的有两个属性: 和是简单变量时,=变量在符号表中的序号,=0;为下标变量时,和分别用于记录存放和之值的两个地址(在表中的序号).有三个属性:1. 数组名在符号表中的;2. 用于记录;3. 在计算时,记录存放中间结果的名(地址).l

9、我们还需要使用的三个:l1从符号表第项的域所指示的内情向量中取出 值;2 含义同上,取内情向量中的 值;3 含义同上,取数组的第 维界差。 设有三维数组,则赋值语句 经上述文法翻译处理后所得的四元式序列为l对于(下标界是表达式下标界是表达式) ,其界差只有在运行时才能算出,故其地址的计算只能在运行时完成。l在含有的运行系统中,应设有给数组填写内情向量,动态分配存储空间,以及计算下标变量地址等子程序子程序。在程序运行中,每当需计算下标变量的地址时,就调用地址计算子程序进行计算。l所调用的子程序通常需要附带这样的入口信息:,.因此,在编译时就应产生进行这种调用的目标代码,其内容通常有:l1 1计算各维下标表达式之值并送入指定地方的指令;计算各维下标表达式之值并送入指定地方的指令;l2 2将相应内情向量首地址送入指定地方的指令;将相应内情向量首地址送入指定地方的指令;l3 3转入下标变量地址计算子程序的转入下标变量地址计算子程序的“”;l4 4处理子程序回送结果的有关指令。处理子程序回送结果的有关指令。l对于按列存储的数组,计算下标变量的公式见l若依霍纳

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论