- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章中间代码生成序7.1中间语言7.2说明语句7.3赋值语.ppt
◆过程lookup(id.name)检查是否在符号表中存在相应此名字的表项。 采用最近嵌套作用域规则查找非局部名字时,lookup过程先通过top(tblptr)指针在当前符号表中查找名字为name的表项。 若找到,返回有关信息。 若未找到,lookup就利用当前符号表表头 的指针找到该符号表的外围符号表,然后在那里查找名字为name的表项,直到所有外围过程的符号表中均无此name表项,则lookup返回nil,表明查找失败。 图7.8 产生赋值语句三地址代码的翻译模式 S→id:=E {p:=lookup(id.name); if pnil then emit(p:= E.place) else error } E→E1+E2{E.place=newtemp; emit(E.place:=E1.place+E2.place)} E→E1*E2{E.place=newtemp; emit(E.place:=E1.place*E2.place)} E →-E { E.place:=newtemp; emit(E.place ′ := ′ ′uminus′E1.place} E→(E1) {E.place:=E1.place} E→id {p:=lookup(id.name); if pnil then E.place:=p else error} lookup(id.name)= id.entry nil emit 它将生成的三地址代码送到输出文件上。 语义动作应包括类型分析,文法符号应有类型属性,在类型分析的基础上,进行相容和赋值相容检查,生成类型转换的三地址代码。 7.3.2 数组元素地址分配 数组元素的三地址代码是什么? 如何生成数组元素的三地址代码。 一. 数组元素地址的计算公式 ◆ 数组A的下标为i的元素的开始地址 VAR a:ARRAY [low..high] OF real; 求 a[i]的地址. base+(i-low )* w (7.3) =bace-low*w + i*w 常量部分(可在编译时计算出来)+变量部分 其中, base 是数组元素a[low]的地址。 ◆对于一个二维数组,可以按行或按列存放 若按行存放,则可用如下公式计算A[i1,i2] 的相对地址: base+((i1 一low1)* n2+i2 一low2)*w) = base-((low1 *n2)+low2)*w + (i1*n2)+i2)* w (7.4) 令c= ((low1 *n2)+low2)*w 则常量部分=a[low1,low2]-c. ◆计算元素A[i1,i2,...,ik] 相对地址的推广公式((...((i1*n2+i2)*n3+i3...)*nk+ik)*w+base-((...((low1*n2+low2)*n3+low3...)*nk+lowk)*w (7.5) c=((...((low1*n2+low2)*n3+low3)...)*nk +lowk) * w 变量部分= ((...((i1*n2+i2)*n3+i3...)*nk+ik)*w a[i1,i2,…in]的地址 =base-c+变量部分 x:=a[i1,i2] 三地址代码结构: t1: =变量部分 t2:=base-c t3:=t2[t1] x:=t3 ◆计算动态数组元素地址的公式与在固定长度 数组情况下是同样的,只是上、下界在编译 时是未知的。 * 第七章 中间代码
文档评论(0)