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