编译原理:第七章语义分析和中间代码产生.ppt

编译原理:第七章语义分析和中间代码产生.ppt

  1. 1、本文档共104页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二维数组A 每维的下界:low1、low2、...、lowk 每维的长度:n1、n2、...、nk 存储方式:按行存放 数组元素A[i1,i2,...,ik]的位置: ( (…( (i1?n2+i2)?n3+i3 )…)?nk+ik )?w + base - ( (…( (low1?n2+low2)?n3+low3 )…)?nk+lowk )?w S属性定义 S?L:=E E?E1+E2 E?(E1) E?L L?id | id [ Elist ] Elist?Elist1 , E | E 属性及函数设计 L 综合属性L.place和L.offset 简单变量: L.offset=null L.place=符号表入口指针 数组元素(下标变量): L.offset=计算公式第一项,指存放VARPART (可变项)的临时变量的整数码 L.place=计算公式第二项,指存放CONSPART(不变项)的 临时变量的整数码 E 综合属性E.place,保存E值的变量在符号表中的位置 Elist 综合属性Elist.array,ndim,place Elist.array:数组名在符号表中的位置 Elist.ndim:目前已经识别出的下标表达式的个数 Elist.place:保存递推公式中em值的临时变量在符号表中的位置 函数 limit(array, j):返回array指向的数组第j维的长度 invariant(array):返回array指向的数组的地址计算公式中的不变项 S属性定义翻译方案 S?L:=E L?id 举例 已知: 设A为一个10?20的数组,即 n1=10,n2=20; 并设域宽 w=4; 数组的第一个元素为A[1,1], 则有 low1=1,low2=1 所以: (low1?n2+low2)?w = (1?20+1)?4 = 84 问题: 将赋值语句 x:=A[y,z] 翻译为三地址代码。 赋值语句 x:=A[y,z]的分析树 利用翻译方案翻译布尔表达式 ab or cd and ef 例: if ab or cd and ef then A1 else A2; while ab do A3 产生式S?→goto L的语义动作: { 查找符号表; IF L在符号表中且定义否栏为已 THEN GEN(J,-,-,P) ELSE IF L不在符号表中 THEN BEGIN 把L填入表中; 置定义否为未,地址栏为NXQ; GEN(J,-,-,0) END ELSE BEGIN Q:=L的地址栏中的编号; 置地址栏编号为NXQ; GEN(J,-,-,Q) END } 带标号语句的产生式: S→label S label → i: label → i: 对应的语义动作: 1. 若i所指的标识符(假定为L)不在符号表中,则把它填入,置类型为标号,定义否为已,地址为nextquad ; 2. 若L已在符号表中但类型不为标号或定义否为已,则报告出错; 3. 若L已在符号表中,则把标号未改为已,然后,把地址栏中的链头(记为q)取出,同时把nextquad填在其中,最后,执行BACKPATCH(q,nextquad )。 7.5.3 CASE语句的翻译 语句结构 case E of C1: S1; C2: S2; … Cn-1: Sn-1; otherwise: Sn end 翻译法(一): T:=E L1: if T?C1 goto L2 S1的代码 goto next L2: if T?C2 goto L3 S2的代码 goto next L3: … Ln-1: if T?Cn-1 goto Ln Sn-1的代码 goto next Ln: Sn的代码 next: 改进: 翻译法(二): 计算E并放入T中 goto test L1: 关于S1的中间码 goto next … Ln-1: 关于Sn-1的中间码 goto next Ln: 关于Sn的中间码 goto next test: if T=C1 goto L1 if T=C2 goto L2 … if T=Cn-1 goto Ln-1 goto

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档