6语义分析与中间代码生成.ppt
文本预览下载声明
多分支语句的翻译 switch语句的语法: switch expression begin case valuE1: statement1 case valuE2: statement2 ......................... ........ case value n-1:statement n-1 defalt:statement n end switch语句翻译成的三地址代码控制流程: 1.对表达式求值; 2.在列出的valuE1, valuE2,…,value n-1 这些值中寻找与表达式的值相等的值。 如果没有这样的值存在,则让“缺席值” 与表达式匹配; 3.执行在(2)中寻找到的值相联系的语 句(某个statement)。 switch语句的目标代码结构: 对expression求值并置于t的有关代码 goto test L1: 有关statement1的代码 goto next L2: 有关statement2的代码 goto next …………………………………… Ln-1: 有关statement n-1的代码 goto next Ln: 有关statementn的代码 goto next (接上页) test : if t=value1 goto L1 if t=value2 goto L2 ……………………. if t=valuen-1goto Ln-1 goto Ln next: expression: 选择器,将被计算出一个值。 valueE1,valueE2,…,value n-1: 表达式可能取的 值。 default: “缺席值”。用来在expression的值不等 于任何value i时来匹配expression。 6.5.4 数组元素的引用 数组元素的三地址代码是什么? 如何生成数组元素的三地址代码。 一. 数组元素地址的计算公式 ◆ 数组A的下标为i的元素的开始地址 int a[20]; 求 a[i]的地址. base+(i-low )* w (7.4) =bace-low*w + i*w 常量部分(可在编译时计算出来)+变量部分 其中, base 是分配给数组的相对地址, low为数组下标的下界. ◆对于一个二维数组,可以按行或按列存放 若按行存放,则可用如下公式计算A[i1,i2] 的相对地址: base+((i1 - low1)* n2+i2 - low2)*w) = base-((low1 *n2)+low2)*w + ((i1*n2)+i2)* w (7.5) 令 C= ((low1 *n2)+low2)*w ◆计算元素A[i1,i2,...,ik] 相对地址的推广公式((...((i1*n2+i2)*n3+i3...)*nk+ik)*w+base-((...((low1*n2+low2)*n3+low3...)*nk+lowk)*w (7.6) C= ((...((low1*n2+low2)*n3+low3)...)*nk +lowk) * w a[i1,i2,…in]的地址 =base-c+变量部分 x:=a[i1,i2] 三地址代码结构: t1: =变量部分 t2:=base-c t3:=t2[t1]
显示全部