当前位置:文档之家› 编译原理第7章-中间代码生成

编译原理第7章-中间代码生成


-16-
表达式代码生成的例子
College of Computer Science & Technology
class[5].age + *ptr.age
typedef struct { char name[30]; int age; float height; }person;
int x[10]; person class[10]; person *ptr;
(cSlaUsBs[I5,]5, 0,t4t5) (MULTI, t5, 33, t6) cla(sAsA[5D].aDg,eclasst,1t6, t4) (AADD , t4, 30, t1) *p(t*Arp.astsgrieg,ptt7tr2, _, t7) (AADD , t7, 30, t2)
-7-
四元式
• 表达式运算符 College of Computer Science & Technology
– ADDI, ADDF, SUBI, SUBF, MULTI, MULTF,
– DIVI, DIVF, MOD,
– AND, OR, EQ, NE, GT, GE, LT, LE
• I/O 操作
Compiler Construction Principles & Implementation Techniques
-12-
7.2 表达式的四元式代码
College of Computer Science & Technology
• 表达式的运算分量可以很复杂:
– 多维数组下标变量:A[i][j][k] – 结构体域名变量:st.address.city – 函数调用:f(x,y) – 指针引用:*(p+1) – ……
College of Computer Science & Technology
• 操作分量
操作分量的抽象地址
– 常量: 整数或者实数
– 标号: 标号名
– 变量: 需要更多信息用于形成其目标地址
– 函数/过程:需要更多信息用于得到其代码的目标地址
• 操作分量的ARG结构 --- 抽象地址结构
– 常量: (valKind, C)
(ADDI, t1, t2, t3)
t1,t2,t4和t7的mode是indir;
Compiler Construction Principles & Implementation Techniques
标号
– (LABEL, _, _, label) --- 定义label为标号,并且定位于 当前位置
跳转
– (JUMP, _, _, label)
--- 无条件转向标号label
– (JUMP0, id, _, label) --- 如果id为假则转向标号label
– (JUMP1, id, _, label) --- 如果id为真则转向标号label
• 循环语句 – (WHILE, _, _, _) – (DO, t, _, _) – (ENDWHILE, _, _, _)
Compiler Construction Principles & Implementation Techniques
7.2 表达式的四元式代码
College of Computer Science & Technology
College of Computer Science & Technology
第7章 中间代码生成
7.1 中间代码生成概述 7.2 表达式的四元式代码 7.3 原子语句的四元式代码 7.4 结构语句的四元式代码 7.5 声明的四元式代码 7.6 一些相关问题
Compiler Construction Principles & Implementation Techniques
– (RETURN, -,-, -)
– (RETURN, -,-, t)
– (ENDFUNC,-,-,-)
--- 函数出口
• 传递参数
– (VARACT, id, offset, size )
--- 传地址
– (VALACT, id, offset, size )
--- 传值
– (FUNACT, id, offset, size)
--- 传函数
– (PROACT, id, offset, size )
--- 传过程
Compiler Construction Principles & Implementation Techniques
四元式
College of Computer Science & Technology
• 分支语句 – (THEN, t, _, _) – (ELSE, _, _, _) – (ENDIF, _, _, _)
– (READI, _, _, id)
--- 输入整数到id
– (READF, _, _, id)
--- 输入实数到id
– (WRITE, _, _ 类型转换
– (FLOAT, id1, _, id2) --- 把整数id1转换成实数赋值给id2
• 赋值
– (ASSIG, id1, n, id2) --- 把id1的值赋值给id2(长度为n)
(2) (*, b, c)
(*, b, c, t2)
(3) (+, (1), (2))
(+, t1, t2, t3)
(4) (+, (3), e)
(+, t3, e, t4)
Compiler Construction Principles & Implementation Techniques
-5-
-6-
College of Computer Science & Technology
操作分量的抽象地址
• 变量的ARG结构
– 一般变量: (varkind, L, off, dir)
– 形参变量
• 引值: (varKind, L, off, dir) • 引址: (varKind, L, off, indir)
struct student{ char name[10]; int age;} st[100];
st[5].age +10
(MULTI, 5, 11,t1) (AADD, st,t1,t2) (AADD,t2,10,t3) (ADDI, t3, 10,t4)
Compiler Construction Principles & Implementation Techniques
+
• 中缀式:a*b • 前缀式:*ab • 后缀式:ab*
• 抽象语法树AST
+
e
*
*
• 无环有向图DAG
a
da
d
• 共享的AST
• 三地址中间代码:
• 三元式
+
+
e
• 四元式
*
ad
Compiler Construction Principles & Implementation Techniques

M1
源程序的抽象语法树
间 代 中间代码




Mn

Compiler Construction Principles & Implementation Techniques
-3-
几种常见的中间代码表示
College of Computer Science & Technology
• 后缀式(逆波兰式)
-1-
College of Computer Science & Technology
7.1 中间代码生成概述
• 中间代码生成是否必须? • 几种常见的中间代码表示
Compiler Construction Principles & Implementation Techniques
-2-
7.1 中间代码生成概述
• 表达式的中间代码生成就是依据原表达式的语 义产生出正确计算表达式值的四元式中间代码
• 例如:表达式:a * ( 3.5 + i * b ),假设 a、b 为 实型变量,i 为整型变量,则生成的四元式中间 代码如下:
( FLOAT , i , ─ , t1 ) ( MULTF , t1 , b , t2 ) ( ADDF , 3.5 , t2 , t3 ) ( MULTF , a , t3 , t4 )
-4-
三地址中间代码
College of Computer Science & Technology
• 每个运算涉及三个地址:操作分量(2)、结果(1) • 三元式:用三元式的编号代表结果地址 • 四元式:引入临时变量表示结果地址
a*d + b*c + e
三元式
四元式
(1) (*, a, d)
(*, a, d, t1)
College of Computer Science & Technology
• 中间代码生成是将源程序翻译成某种中间表示
的过程.
• 中间代码生成不是编译程序的必经阶段
• 便于优化:在中间代码级别上,可以进行源程序和目标代码上不 能进行的优化
• 便于移植:生成中间代码后,修改编译程序的后端,就可以生成不 同目标机上的目标代码.
– 临时变量:
• 直接 (varKind, -1, off, dir) • 间接(varKind, -1, off, indir)
• 为了简便起见, 在课件和书中有时用对应的变量名 , 函数名或者标号, 值等代替相应的ARG结构;
相关主题