71中间语言 7.1.4静态单赋值形式 种便于某些代码优化的中间表示 和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值 三地址代码 静态单赋值形式 p=a+b p1=a+b gp-C p=g* d qppq q1* d p=e-p p g=p+ g p3 t q
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
71中间语言 7.1.4静态单赋值形式 种便于某些代码优化的中间表示 和三地址代码的主要区别 所有赋值指令都是对不同名字的变量的赋值 个变量在不同路径上都定值的解决办法 if (flag)x=-1; else x=1; y=x*a 改成 if (flag)x=-1; else x2=1; x3=p(x1,x2;∥由fag的值决定用x1还是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
72声明语句 本节介绍 °为局部名字建立符号表条目 为它分配存储单元 符号表中包含名字的类型和分配给它的存储 单元的相对地址等信息
7.2 声 明 语 句 本节介绍 • 为局部名字建立符号表条目 • 为它分配存储单元 • 符号表中包含名字的类型和分配给它的存储 单元的相对地址等信息
72声明语句 721过程中的声明
7.2 声 明 语 句 7.2.1 过程中的声明
72声明语句 计算被声明名字的类型和相对地址 P>offset=0 D; S D→D:D D>id: T enter (idlexeme, T type, offset) offset = offset T width y T->integer T type= integer, Twidth=4) T-> real T type= real; Twidth=8 7→> array I num of 11 IT type= array(num,val, T,type); Twidth =num.val x T widthy T→个T1{Tpe= pointer(T1,pe);rith=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 }