编译原理第7章-中间代码生成
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 参与运算时,这些分量的地址需要计算得到!
Compiler Construction Principles & Implementation Techniques
-13-
College of Computer Science & Technology
• V[E]
下标变量的四元式代码
V.code E.code (*, E.arg, V.ElemType.size, t1) (AADD, V.arg, t1, t2)
• 表达式的中间代码生成就是依据原表达式的语 义产生出正确计算表达式值的四元式中间代码
• 例如:表达式:a * ( 3.5 + i * b ),假设 a、b 为 实型变量,i 为整型变量,则生成的四元式中间 代码如下:
( FLOAT , i , ─ , t1 ) ( MULTF , t1 , b , t2 ) ( ADDF , 3.5 , t2 , t3 ) ( MULTF , a , t3 , t4 )
--- 传函数
– (PROACT, id, offset, size )
--- 传过程
Compiler Construction Principles & Implementation Techniques
四元式
College of Computer Science & Technology
• 分支语句 – (THEN, t, _, _) – (ELSE, _, _, _) – (ENDIF, _, _, _)
(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)
int A[10]; float B[5][5]; A[5]+B[2][3]
(MULTI, 5, 1,t1) (AADD, A,t1,t2) (MULTI,2,10,t3) (AADD, B, t3,t8) (MULTI,3,2,t4) (AADD,t8,t4,t5) (FLOAT,t2,-,t6) (ADDF, t6,t5,t7)
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)
中
M1
源程序的抽象语法树
间 代 中间代码
…
码
生
成
Mn
器
Compiler Construction Principles & Implementation Techniques
-3-
几种常见的中间代码表示
College of Computer Science & Technology
• 后缀式(逆波兰式)
College of Computer Science & Technology
• 中间代码生成是将源程序翻译成某种中间表示
的过程.
• 中间代码生成不是编译程序的必经阶段
• 便于优化:在中间代码级别上,可以进行源程序和目标代码上不 能进行的优化
• 便于移植:生成中间代码后,修改编译程序的后端,就可以生成不 同目标机上的目标代码.
– (RETURN, -,-, -)
– (RETURN, -,-, t)
– (ENDFUNC,-,-,-)
--- 函数出口
• 传递参数
– (VARACT, id, offset, size )
--- 传地址
– (VALACT, id, offset, size )
--- 传值
– (FUNACT, id, offset, size)
-4-
三地址中间代码
College of Computer Science & Technology
• 每个运算涉及三个地址:操作分量(2)、结果(1) • 三元式:用三元式的编号代表结果地址 • 四元式:引入临时变量表示结果地址
a*d + b*c + e
三元式
四元式
(1) (*, a, d)
(*, a, d, t1)
+
• 中缀式:a*b • 前缀式:*ab • 后缀式:ab*
• 抽象语法树AST
+
e
*
*
• 无环有向图DAG
a
da
d
• 共享的AST
• 三地址中间代码:
• 三元式
+
+
e
• 四元式
*
ad
Compiler Construction Principles & Implementation Techniques
-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 操作
(2) (*, b, c)
(*, b, c, t2)
(3) (+, (1), (2))
(+, t1, t2, t3)
(4) (+, (3), e)
(+, t3, e, t4)
Compiler Construction Principles & Implementation Techniques
-5-
Compiler Construction Principles & Implementation Techniques
四元式
• 函数 College of Computer Science & Technology
– (ENTRY, label, size, level)
--- 函数入口
– (CALL, f, true/false, Result) --- 调用函数f,返回值给Result
标号
– (LABEL, _, _, label) --- 定义label为标号,并且定位于 当前位置
跳转
– (JUMP, _, _, label)
--- 无条件转向标号label
– (JUMP0, id, _, label) --- 如果id为假则转向标号label
– (JUMP1, id, _, label) --- 如果id为真则转向标号label
– 标号: (labelKind, label)
– 变量: (varKind, level, offset, mode)
– 函数/过程:
• 实在函数/过程: (funKind, actual, label)
• 形参函数/过程: (funKind, formal, level, offset)
Compiler Construction Principles & Implementation Techniques
-15-
College of Computer Science & Technology
• *V
指针变量的四元式代码
V.code (ASSIG, V.arg, 1, t1)
int* p; …… *p+10
(ASSIG, p,1,t1) (ADDI, t1, 10,t2)
Compiler Construction Principles & Implementation Techniques
College of Computer Science & Technology
第7章 中间代码生成
7.1 中间代码生成概述 7.2 表达式的四元式代码 7.3 原子语句的四元式代码 7.4 结构语句的四元式代码 7.5 声明的四元式代码 7.6 一些相关问题
Compiler Construction Principles & Implementation Techniques
-1-
College of Computer Science & Technology
7.1 中间代码生成概述
• 中间代码生成是否必须? • 几种常见的中间代码表示
Compiler Construction Principles & Implementation Techniques
-2-
7.1 中间代码生成概述
Compiler Construction Principles & Implementation Techniques
四元式
College of Computer Science & Technology
地址加
– (AADD, id1, id2, id3) --- id1对应的地址加上id2后得到 的地址赋值给id3
• 循环语句 – (WHILE, _, _, _) – (DO, t, _, _) – (ENDWHILE, _, _, _)
Compiler Construction Principles & Implementation Techniques
7.2 表达式的四元式代码
College of Computer Science & Technology
-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;
– (READI, _, _, id)
--- 输入整数到id
– (READF, _, _, id)
--- 输入实数到id
– (WRITE, _, _, id)
--- 把id的值输出
• 类型转换
– (FLOAT, id1, _, id2) --- 把整数id1转换成实数赋值给id2
• 赋值
– (ASSIG, id1, n, id2) --- 把id1的值赋值给id2(长度为n)
-6-
College of Computer Science & Technology
操作分量的抽象地址
• 变量的ARG结构
– 一般变量: (varkind, L, off, dir)
来自百度文库
– 形参变量
• 引值: (varKind, L, off, dir) • 引址: (varKind, L, off, indir)
Compiler Construction Principles & Implementation Techniques
-14-
College of Computer Science & Technology
• V.id
域名变量的四元式代码
V.code (AADD, V.arg, id.offset, t1)
– 临时变量:
• 直接 (varKind, -1, off, dir) • 间接(varKind, -1, off, indir)
• 为了简便起见, 在课件和书中有时用对应的变量名 , 函数名或者标号, 值等代替相应的ARG结构;
Compiler Construction Principles & Implementation Techniques
(ADDI, t1, t2, t3)
t1,t2,t4和t7的mode是indir;
Compiler Construction Principles & Implementation Techniques
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
Compiler Construction Principles & Implementation Techniques
-13-
College of Computer Science & Technology
• V[E]
下标变量的四元式代码
V.code E.code (*, E.arg, V.ElemType.size, t1) (AADD, V.arg, t1, t2)
• 表达式的中间代码生成就是依据原表达式的语 义产生出正确计算表达式值的四元式中间代码
• 例如:表达式:a * ( 3.5 + i * b ),假设 a、b 为 实型变量,i 为整型变量,则生成的四元式中间 代码如下:
( FLOAT , i , ─ , t1 ) ( MULTF , t1 , b , t2 ) ( ADDF , 3.5 , t2 , t3 ) ( MULTF , a , t3 , t4 )
--- 传函数
– (PROACT, id, offset, size )
--- 传过程
Compiler Construction Principles & Implementation Techniques
四元式
College of Computer Science & Technology
• 分支语句 – (THEN, t, _, _) – (ELSE, _, _, _) – (ENDIF, _, _, _)
(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)
int A[10]; float B[5][5]; A[5]+B[2][3]
(MULTI, 5, 1,t1) (AADD, A,t1,t2) (MULTI,2,10,t3) (AADD, B, t3,t8) (MULTI,3,2,t4) (AADD,t8,t4,t5) (FLOAT,t2,-,t6) (ADDF, t6,t5,t7)
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)
中
M1
源程序的抽象语法树
间 代 中间代码
…
码
生
成
Mn
器
Compiler Construction Principles & Implementation Techniques
-3-
几种常见的中间代码表示
College of Computer Science & Technology
• 后缀式(逆波兰式)
College of Computer Science & Technology
• 中间代码生成是将源程序翻译成某种中间表示
的过程.
• 中间代码生成不是编译程序的必经阶段
• 便于优化:在中间代码级别上,可以进行源程序和目标代码上不 能进行的优化
• 便于移植:生成中间代码后,修改编译程序的后端,就可以生成不 同目标机上的目标代码.
– (RETURN, -,-, -)
– (RETURN, -,-, t)
– (ENDFUNC,-,-,-)
--- 函数出口
• 传递参数
– (VARACT, id, offset, size )
--- 传地址
– (VALACT, id, offset, size )
--- 传值
– (FUNACT, id, offset, size)
-4-
三地址中间代码
College of Computer Science & Technology
• 每个运算涉及三个地址:操作分量(2)、结果(1) • 三元式:用三元式的编号代表结果地址 • 四元式:引入临时变量表示结果地址
a*d + b*c + e
三元式
四元式
(1) (*, a, d)
(*, a, d, t1)
+
• 中缀式:a*b • 前缀式:*ab • 后缀式:ab*
• 抽象语法树AST
+
e
*
*
• 无环有向图DAG
a
da
d
• 共享的AST
• 三地址中间代码:
• 三元式
+
+
e
• 四元式
*
ad
Compiler Construction Principles & Implementation Techniques
-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 操作
(2) (*, b, c)
(*, b, c, t2)
(3) (+, (1), (2))
(+, t1, t2, t3)
(4) (+, (3), e)
(+, t3, e, t4)
Compiler Construction Principles & Implementation Techniques
-5-
Compiler Construction Principles & Implementation Techniques
四元式
• 函数 College of Computer Science & Technology
– (ENTRY, label, size, level)
--- 函数入口
– (CALL, f, true/false, Result) --- 调用函数f,返回值给Result
标号
– (LABEL, _, _, label) --- 定义label为标号,并且定位于 当前位置
跳转
– (JUMP, _, _, label)
--- 无条件转向标号label
– (JUMP0, id, _, label) --- 如果id为假则转向标号label
– (JUMP1, id, _, label) --- 如果id为真则转向标号label
– 标号: (labelKind, label)
– 变量: (varKind, level, offset, mode)
– 函数/过程:
• 实在函数/过程: (funKind, actual, label)
• 形参函数/过程: (funKind, formal, level, offset)
Compiler Construction Principles & Implementation Techniques
-15-
College of Computer Science & Technology
• *V
指针变量的四元式代码
V.code (ASSIG, V.arg, 1, t1)
int* p; …… *p+10
(ASSIG, p,1,t1) (ADDI, t1, 10,t2)
Compiler Construction Principles & Implementation Techniques
College of Computer Science & Technology
第7章 中间代码生成
7.1 中间代码生成概述 7.2 表达式的四元式代码 7.3 原子语句的四元式代码 7.4 结构语句的四元式代码 7.5 声明的四元式代码 7.6 一些相关问题
Compiler Construction Principles & Implementation Techniques
-1-
College of Computer Science & Technology
7.1 中间代码生成概述
• 中间代码生成是否必须? • 几种常见的中间代码表示
Compiler Construction Principles & Implementation Techniques
-2-
7.1 中间代码生成概述
Compiler Construction Principles & Implementation Techniques
四元式
College of Computer Science & Technology
地址加
– (AADD, id1, id2, id3) --- id1对应的地址加上id2后得到 的地址赋值给id3
• 循环语句 – (WHILE, _, _, _) – (DO, t, _, _) – (ENDWHILE, _, _, _)
Compiler Construction Principles & Implementation Techniques
7.2 表达式的四元式代码
College of Computer Science & Technology
-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;
– (READI, _, _, id)
--- 输入整数到id
– (READF, _, _, id)
--- 输入实数到id
– (WRITE, _, _, id)
--- 把id的值输出
• 类型转换
– (FLOAT, id1, _, id2) --- 把整数id1转换成实数赋值给id2
• 赋值
– (ASSIG, id1, n, id2) --- 把id1的值赋值给id2(长度为n)
-6-
College of Computer Science & Technology
操作分量的抽象地址
• 变量的ARG结构
– 一般变量: (varkind, L, off, dir)
来自百度文库
– 形参变量
• 引值: (varKind, L, off, dir) • 引址: (varKind, L, off, indir)
Compiler Construction Principles & Implementation Techniques
-14-
College of Computer Science & Technology
• V.id
域名变量的四元式代码
V.code (AADD, V.arg, id.offset, t1)
– 临时变量:
• 直接 (varKind, -1, off, dir) • 间接(varKind, -1, off, indir)
• 为了简便起见, 在课件和书中有时用对应的变量名 , 函数名或者标号, 值等代替相应的ARG结构;
Compiler Construction Principles & Implementation Techniques
(ADDI, t1, t2, t3)
t1,t2,t4和t7的mode是indir;
Compiler Construction Principles & Implementation Techniques
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