第八章中间代码生成 C中间语言 C简单表达式的中间代码生成 原子语句的中间代码生成 结构语句的中间代码生成 声明的中间代码
第八章 中间代码生成 中间语言 简单表达式的中间代码生成 原子语句的中间代码生成 结构语句的中间代码生成 声明的中间代码
中间语言 后缓式-—逆波兰式 三地址中间代码(三元式、四元式) 图结构中间代码(语法树、DAG)
中间语言 后缀式----逆波兰式 三地址中间代码(三元式、四元式) 图结构中间代码(语法树、DAG)
三地址中间代码 三元式:i:(o,op1,op2) 四元式:(o,op1,op2, result) 如:a:=b×c+b×d 三元式 四元式 (1)(×,b,c) (1)(×,b,C,t1) (2)(×,b,d) (2)(×,b,d,t2) 3)(+,(1),(2)(3)(+,tl,t2,t3) (4)(:=,(3),a) (4)(:=,t3,a
三地址中间代码 三元式:i:(,op1,op2) 四元式:( ,op1,op2,result) 如:a:= b×c+b×d 三元式 四元式 (1) (×, b, c) (1) (×, b, c, t1) (2) (×, b, d) (2) (×, b, d, t2) (3) (+, (1), (2)) (3) (+, t1, t2, t3) (4) (:=, (3), a) (4) (:=, t3, a, -)
简单表达式的中间代码形式 E≡G Tuple(E)==, ARG(E)=C. val ◆E≡x Tuple(E)=F, ARG(E)=x.val E1 0 E2 Tuple(E)=Tuple(E)II Tuple(E2) I(a, ARG(E,), ARG(E2),t) ARG(E)=t,t是临时变量
简单表达式的中间代码形式 ⬧ E C Tuple(E)=空,ARG(E)= C.val ⬧ E x Tuple(E)=空,ARG(E)= x.val ⬧ E E1 E2 Tuple(E)= Tuple(E1)|| Tuple(E2) || (,ARG(E1),ARG(E2),t) ARG(E)= t, t是临时变量
表达式的语义信息: 表达式种类:E.kind 表达式的类型:E.type 表达式的结果值ARG:E.Arg或ARG(E) 标号L:ARG(L)= Labe l Form?(L 整数G:ARG(0)= Valefor3(C) 源程序变量X:ARG(X)= Addr Form?(L,0ff,Mode) 临时变量T:ARG(T)= AddrForm3(-1,off,Mode) 表达式的中间代码:E. tuple 产生一条中间代码的子程序 Gen Code(o): 运算分量(栈顶和次栈顶)类型检查; 如需类型转换:生成类型转换中间代码; 生成o操作的中间代码; 从栈中删除运算分量的语义信息; 表达式结果的语义信息压栈
表达式的语义信息: 表达式种类:E.kind 表达式的类型:E.type 表达式的结果值ARG:E.Arg 或 ARG(E) 标号L:ARG(L)= LabelForm’(L) 整数C:ARG(C)= ValueForm’(C) 源程序变量X:ARG(X)= AddrForm’(L,Off, Mode) 临时变量T:ARG(T)= AddrForm’(-1, off, Mode) 表达式的中间代码:E.tuple 产生一条中间代码的子程序GenCode(): 运算分量(栈顶和次栈顶)类型检查; 如需类型转换:生成类型转换中间代码; 生成操作的中间代码; 从栈中删除运算分量的语义信息; 表达式结果的语义信息压栈