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

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

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

二维数组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)

1亿VIP精品文档

相关文档