【发布时间】:2012-11-27 11:20:10
【问题描述】:
我正在为一种简单(类 C)语言编写编译器的代码生成部分。我对“if”语句有疑问。我想为条件的每个部分生成相应的跳转指令,就像 GCC 一样。保存布尔表达式结构的结构是抽象语法树。
到目前为止,我编写了一个函数,它可以为比较以及逻辑和逻辑否定生成相应的标签。但是,当我试图使这个函数在逻辑上工作时,我遇到了一个巨大的问题。
对于简单的语句,比如
if (25 < 19) then
print 99
statements
我希望我的代码如下所示:
cmp 25, 19
jge label0
label1:
print 99
label0:
statements
(对于这个简单的示例,我的函数确实显示了类似的内容)。
在处理否定时,您只需对这些条件的测试进行否定(将 jge 转换为上面的 jl)。对于逻辑与,您只需以简单的方式依次为左右连词生成相应的代码。但对于 OR,我遇到了许多具有挑战性的问题。如果条件 fails 则不是跳转到 if(或下一个 else 分支)之后的语句,对于所有其他情况,我将不得不跳转到代码所在的实际位置,如果要么OR 的操作数成立。然后,当您有两个 OR 时,情况会变得更糟,因为 AST 使用二进制节点表示 OR,而 尝试翻译 的函数会转换为我们选择的中间表示。
有人可以就这个问题提供帮助吗?我也尝试过咨询“工程编译器”,但我没有从那里找到任何有用的东西。
【问题讨论】:
标签: if-statement compiler-construction code-generation