7.1中间语言 7.1.4静态单赋值形式 ·一种便于某些代码优化的中间表示 和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值 三地址代码 静态单赋值形式 p=a+b P1=a +b q=p-c 41=p1-c p=q*d P2=q1*d p=e-p P3=e-p2 q=p+q q2=p3+q1
7.1 中 间 语 言 7.1.4 静态单赋值形式 • 一种便于某些代码优化的中间表示 • 和三地址代码的主要区别 – 所有赋值指令都是对不同名字的变量的赋值 三地址代码 静态单赋值形式 p = a +b p1 = a +b q = p − c q1 = p1 − c p = q d p2 = q1 d p = e − p p3 = e − p2 q = p + q q2 = p3 + q1
7.1中间语言 7.1.4静态单赋值形式 ·一种便于某些代码优化的中间表示 和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值 -一个变量在不同路径上都定值的解决办法 if (flag)x=-1;else x 1; y=x*a 改成 if (flag)x1=-1;else x2 1; X3=p(1,x2); /由f1ag的值决定用x还是x2
7.1 中 间 语 言 7.1.4 静态单赋值形式 • 一种便于某些代码优化的中间表示 • 和三地址代码的主要区别 – 所有赋值指令都是对不同名字的变量的赋值 – 一个变量在不同路径上都定值的解决办法 if (flag) x = −1; else x = 1; y = x a; 改成 if (flag) x1 = −1; else x2 = 1; x3 = (x1 , x2 ); //由flag的值决定用x1还是x2
7.2声明语句 本节介绍 为局部名字建立符号表条目 为它分配存储单元 符号表中包含名字的类型和分配给它的存储 单元的相对地址等信息
7.2 声 明 语 句 本节介绍 • 为局部名字建立符号表条目 • 为它分配存储单元 • 符号表中包含名字的类型和分配给它的存储 单元的相对地址等信息
7.2声明语句 7.2.1过程中的声明
7.2 声 明 语 句 7.2.1 过程中的声明
7.2声明语句 计算被声明名字的类型和相对地址 P-→{offset=0}D;S D→D;D D->id T fenter id.lexeme,T.type,offset): offset offset T.width T->integer {T.type integer;T.width 4 T->real {T.type real;T.width 8} T→array num】ofT, {T.type array (num.val,Ti.type); T.width num.val x T.width) T-→个T1{T.pe=pointer(T1ype);T,width=4
7.2 声 明 语 句 计算被声明名字的类型和相对地址 P → {offset = 0} D; S D → D ; D D → id : T {enter ( id.lexeme, T.type, offset); offset = offset + T.width } T → integer {T.type = integer; T.width = 4 } T→ real {T.type = real; T.width = 8 } T→ array [ num ] of T1 {T.type = array (num.val, T1 .type); T.width = num.val T1 .width} T→ T1 {T.type = pointer (T1 .type); T.width = 4 }