基础
DAG
语法树是一种图形化的中间表示。但语法树中,公共子表达式每出现一次,就有一个对应的子树,产生了大量冗余,
因此定义了另一种中间表示:有向无环图(Directed Acyclic Graph, DAG)
有向无环图的构造与抽象语法树类似。
三地址代码
一般包括一个运算符和之多三个运算分量(地址),所以叫做三地址代码。这里的地址包括:变量、常量、临时变量。
- 指令集合
- 运算/赋值指令:x=y op z ,x = op y
- 复制指令:x=y
- 无条件转移指令:goto L
- 条件转移指令:if x goto L ,ifFalse x goto L
- 条件转移指令:if x relop y goto L
- 过程调用/返回 p(x1, x2, …, xn)
• param x1 //设置参数
• param x2
• …
• param xn
• call p, n //调用子过程p,n为参数个数 - 带下标的复制指令:x=y[i] x[i]=y • 注意:i表示离开数组位置第i个字节,而不是数组的第i个元素
- 地址/指针赋值指令: • x=&y x=*y *x=y
- 三地址代码的四元式表示
格式(字段): op arg1 arg2 result
如:+ x y z
对于有些指令,一些参数是空缺的,如
param x1 null null
[if goto] x null L
- 三地址代码的三元式表示
op arg1 arg2
使用三元式的位置来引用三元式的运算结果