当前位置:文档之家› 第七章 中间代码生成(2)

第七章 中间代码生成(2)


(RETURN, _, _, E.Form)
函数调用语句
f(E1, …, En) 从符号表中获取f 的属性

– Level, params, type

生成中间代码
E1.code …… En.code 形实参结合
(VALACT, 实参.Form, offset, size) (VARACT, 实参.Form, offset, size) (call, f, true, t) (call, f, false, t)
复合变量的四元式生成
复合变量:下标变量 A[i][j], 域名变量 , 指针 变量 *p 复合变量的中间代码是计算复合变量地址的四元式

变量的语法: V id V1 V2 [E] V1 V2.id
地址: addr(V) = addr(id) addr(V1) = addr(V2)+(E-low+1)*Elesize addr(V1) = addr(V2)+offset(id)
7.4 原子语句的中间代码生成
赋值语句: V = Exp; I/O 语句

– Read(V); – Write(Exp);
Goto 语句 : Goto Label 标号语句: Label: Statement; 函数调用返回语句: Return Exp; 函数调用: F(Exp1, …, Expn)

id<Push(id)> <GenCode(*)> Ts <GenCode(+)> Es) <GenCode(*)> Ts Es b) <Push(id)> <GenCode(*)> Ts <GenCode(+)> Es )<GenCode(*)> Ts Es ) <GenCode(*)> Ts <GenCode(+)> Es )<GenCode(*)> Ts Es ) Ts <GenCode(+)> Es )<GenCode(*)> Ts Es ) <GenCode(+)> Es ) <GenCode(*)> Ts Es ) Es ) <GenCode(*)> Ts Es ) ) <GenCode(*)> Ts Es ) <GenCode(*)> Ts Es Ts Es Es
第七章 中间代码生成
7.1 几种常见的中间表示 7.2 中间代码中生成的几个问题
7.3 表达式的中间代码生成
7.4 原子语句的中间代码生成 7.5 结构语句的中间代码生成 7.6 声明的中间代码生成
7.2 中间代码生成中的几个问题
1.

语义信息的获取和保存

目标代码阶段保留符号表,则可用标识符在符号表中的 地址 不保留符号表,则用FORM结构保存标识符的语义信息
产生一条中间代码子程序GenCode()
产生一条中间代码子程序GenCode() 调用该函数时,左右操作数已进语义栈Sem; 分别取出左右操作数; 检查类型是否相同,不同则进行转换,产生类型转 换四元式; 产生中间代码( *, Sem[top-1], Sem[top],t) pop(2); //弹出左右分量 push(t) //压入结果t的类型和Form
top
R.typ, R.form L.typ, L.form
Sem
7.3 表达式的中间代码生成

表达式的中间代码就是依据原表达式的语 义产生出正确计算表达式值的四元式中间 代码(即将计算顺序体现出来)
– 表达式的运算分量可以是简单变量、复杂变
量和函数调用 – 表达式的运算符可以是算术运算符,关系运 算符,逻辑运算符等

变量及操作:

7.2 中间代码生成中的几个问题
3.
常用的语义子程序
申请临时单元 new_dir(t): 在临时变量区申请一个单元t,且t是直接 寻址 new_indir(t): t是间接寻址
存放中间代码子程序Generate(,left,right,result) 将一条四元式中间代码存放到中间代码区中
第七章 中间代码生成
7.1 几种常见的中间表示 7.2 中间代码中生成的几个问题
7.3 表达式的中间代码生成
7.4 原子语句的中间代码生成 7.5 结构语句的中间代码生成 7.6 声明的中间代码生成
7.5 结构语句的中间代码生成

条件语句
– If 语句 – Switch 语句
int x[10]; (L, 0) person class[10]; (L, 10) person *ptr; (L, 340)
第七章 中间代码生成
7.1 几种常见的中间表示 7.2 中间代码中生成的几个问题
7.3 表达式的中间代码生成
7.4 原子语句的中间代码生成 7.5 结构语句的中间代码生成 7.6 声明的中间代码生成

E T Es P Ts Es id <Push(id)> Ts Es <Push(id)> Ts Es Ts Es *P<GenCode(*)>Ts Es P <GenCode(*)> Ts Es (E)<GenCode(*)> Ts Es E) <GenCode(*)> Ts Es T Es) <GenCode(*) Ts Es P Ts Es) <GenCode(*)> Ts Es C <Push(C)> Ts Es )<GenCode(*)> Ts Es <Push(C)> Ts Es )<GenCode(*)> Ts Es
首先给出简单算术表达式的中间代码生成 复合变量的中间代码生成

表达式的四元式
表达式E a *(3.5 + i *b) 假设a,b为实型变量,i为整型变量 E生成的四元式如下:

– (FLOAT, i, -, t1) – (MULTF, t1, b, t2)
– (ADDF, 3.5, t2, t3)


<Push(C)> Ts Es )<GenCode(*)> Ts Es +i*b) Ts Es) <GenCode(*)> Ts Es +i*b) Es )<GenCode(*)> Ts Es +i*b) + T <GenCode(+)> Es )<GenCode(*)> Ts Es + i*b) T<GenCode(+)> Es )<GenCode(*)> Ts Es i*b) PTs <GenCode(+)> Es) <GenCode(*)> Ts Es i*b) id <Push(id)> Ts <GenCode(+)> Es )<GenCode(*)> Ts Es i*b) <Push(id)> Ts <GenCode(+)> Es )<GenCode(*)> Ts Es *b) Ts <GenCode(+)> Es )<GenCode(*)> Ts Es *b) *P <GenCode(*)> Ts <GenCode(+)> Es )<GenCode(*)> Ts Es *b) P <GenCode(*)> Ts <GenCode(+)> Es )<GenCode(*)> Ts Es b)
V1 *V2
addr(V1) = content(addr(V2))
下标变量的四元式生成

一维下标变量 a[i]和多维下标变量 a[i][j][k]
Var A:array [L1..U1][L2..U2]…[Ln…Un] of T;(n>=1)
数组第1行的宽度是 D1=U1-L1+1; 数组第i行的宽度是 Di=Ui-Li+1; 设类型T所占单元数为,则数组A占单元数为 size(A) = D1*D2*…*Dn* 下标变量A[E1][E2]…[Ek]地址为: Addr(A) + ((E1-L1)*S1 + …(Ek-Lk)*Sk)*size(T) 其中 当 i =1时,s1 = 1,否则 si = Di+1*Di+2*…*Dn sn = 1
Exp.code
(READ, _, _, V.Form)
(WRITE, _, _, Exp.Form)
Goto语句和Label语句

Goto L

L: S
(LABEL, _, _, LL)
(JUMP, _, _, LL)
S.code
Return语句

Return E
E.code

Return
(RETURN, _, _, _ )
a*(3.5+i*b) a*(3.5+i*b) a*(3.5+i*b) a*(3.5+i*b) *(3.5+i*b) *(3.5+i*b) *(3.5+i*b) (3.5+i*b) (3.5+i*b) 3.5+i*b) 3.5+i*b) 3.5+i*b) 3.5+i*b) +i*b)
相关主题