内部表示可以通过多种方式完成。例如,我理解数学表达式可能会转换为前缀或后缀表示法,然后存储在堆栈中,这样当您弹出一些操作数时,它们会弹出相应的运算符旁边,程序可以继续计算。现在,另一种形式的内部表示形式是元组,最常见的是(?)三个或四个元素:
例如,
(4+5)/(2+x)
可以表示为元组集合
(1)(+,4,5)
(2)(+,2,x)
(3)(/,(1),(2))
以这种方式内部。我相信这就是所谓的两个/三个地址代码,或者至少与它有关。
这一切都很好,但我的问题是如何以这种方式控制流语句?我知道还有其他方法可以在内部表示它们,比如在抽象语法树和类似的东西中,但是这种具体方式呢?可以控制流语句在内部表示为一组n元组,还是这种表示法对数学运算有用?为了澄清,我不是在谈论任何一个特定编译器的实现;我只是问这个'符号'。
编辑:更正错误的数学。
答案 0 :(得分:1)
这种类型的中间表示(通常用语法编写,例如%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)