编译器构成
编译器分为前端和后端:
前端:依赖于源语言,独立于目标机器。包括词法分析器、语法分析器、语义分析器和中间代码生成器。
后端:依赖于目标机器,独立于源语言。包括代码优化器和代码生成器。
中间语言表示
后缀表示
- 如果 E E E是变量或常数,那么 E E E的后缀表示就是 E E E本身。
- 如果 E E E是形式为 E 1 o p E 2 E_1 \ op \ E_2 E1 op E2的表达式,那么 E E E的后缀表示是 E 1 ′ E 2 ′ o p E_1^{\prime}\ E_2^{\prime} \ op E1′ E2′ op,其中 E 1 ′ E_1^{\prime} E1′和 E 2 ′ E_2^{\prime} E2′分别是 E 1 E_1 E1和 E 2 E_2 E2的后缀表示。
- 如果 E E E是形式为 ( E 1 ) (E_1) (E1)的表达式,那么 E 1 E_1 E1的后缀表示也是 E E E的后缀表示。
- 后缀表示不需要括号。
?(8 - 4) + 2 的后缀表示是8 4 - 2 +
图形表示
语法树有向无环图DAG
三地址代码
三地址代码是语法树或DAG的一种线性表示。
一般形式:
x
:
=
y
o
p
z
x := y\ op\ z
x:=y op z,其中,如果x不是最终结果,那么x作为临时变量放在活动记录的临时变量区中。
?
a
:
=
(
−
b
+
c
∗
d
)
+
c
∗
d
a := (-b + c*d ) + c*d
a:=(−b+c∗d)+c∗d的DAG的三地址代码
t1 = -b;
t2 = c * d;
t3 = t1 + t2;
t4 = t2 + t3;
a = t4;