是否存在基于元组的控制流语句的内部表示?

Does a tuple-based internal representation of control flow statements exist?

内部表示可以通过多种方式完成。例如,我知道数学表达式可能会转换为前缀或后缀表示法,然后存储在堆栈中,这样当您弹出一些操作数时,它们会弹出到相应的运算符旁边,程序可以进行计算。现在,另一种形式的内部表示是元组,最常见的是(?)三个或四个元素:

例如,
(4+5)/(2+x)
可以表示为元组集
(1)(+,4,5)
(2)(+,2,x)
(3)(/,(1),(2))
在内部以这种方式。我相信这就是所谓的 two/three-address 代码,或者至少与之相关。

这一切都很好,但我的问题是如何以这种方式表示控制流语句?我知道还有其他方法可以在内部表示这些内容,例如抽象语法树和类似的东西,但是这种特定方式呢?控制流语句是否可以在内部表示为一组 n 元组,或者这种表示法是否专门用于数学运算?为了澄清起见,我不是在谈论任何一个特定编译器中的实现;我只是问 'notation'.

是否可行

编辑:更正了错误的数学。

这种中间表示形式(通常用%1 = 4+5%1 = add 4, 5等语法书写)也称为三地址码。三地址码可以表示任意的控制流,而不仅仅是表达式。请注意,汇编语言和机器语言也有一个平面结构,由具有固定数量操作数的指令组成,因此它与三地址代码并没有太大区别。显然汇编可以包含任意控制流。

这样做的方法是使用分支指令。最简单的是你可以有两个:一个接受无条件分支的目标地址,另一个接受目标和布尔参数作为条件。所有类型的循环和条件语句都可以编译为跳转。例如,循环 while (condition) { body } ...restOfTheCode 可以编译成这样(其中 T 应该将给定的表达式转换为我们的 IR):

  %cond = T(condition)
checkCond:
  brif %cond, loop
  br endLoop
loop:
  T(body)
  br checkCond
endLoop:
  T(...restOfTheCode)