中间语言表示

中间语言表示,包括后缀表示、图形表示(语法树和DAG)以及三地址代码

#编译器构成

编译器分为前端和后端:

前端:依赖于源语言,独立于目标机器。包括词法分析器、语法分析器、语义分析器和中间代码生成器。

后端:依赖于目标机器,独立于源语言。包括代码优化器和代码生成器。

#中间语言表示

#后缀表示

  • 如果 $E$ 是变量或常数,那么 $E$ 的后缀表示就是 $E$ 本身。
  • 如果 $E$ 是形式为 $E_1 \ op \ E_2$ 的表达式,那么 $E$ 的后缀表示是 $E_1^{\prime}\ E_2^{\prime} \ op$,其中 $E_1^{\prime}$ 和 $E_2^{\prime}$ 分别是 $E_1$ 和 $E_2$ 的后缀表示。
  • 如果 $E$ 是形式为 $(E_1)$ 的表达式,那么 $E_1$ 的后缀表示也是 $E$ 的后缀表示。
  • 后缀表示不需要括号。

🌰 (8 - 4) + 2 的后缀表示是 8 4 - 2 +

#图形表示——语法树有向无环图 DAG

语法树和 DAG 表示

#三地址代码

三地址代码是语法树或 DAG 的一种线性表示。

一般形式:$x := y\ op\ z$,其中,如果 x 不是最终结果,那么 x 作为临时变量放在活动记录的临时变量区中。

🌰 $a := ( -b + c \times d ) + c \times d$ 的 DAG 的三地址代码

t1 = -b;
t2 = c * d;
t3 = t1 + t2;
t4 = t2 + t3;
a = t4;
updatedupdated2022-05-032022-05-03