2

我正在为一种简单(类 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',但我还没有从那里找到任何有用的东西。

4

1 回答 1

1

I remember doing something similar to this when I was in school.

You should focus on having your compiler generate a result for every condition in these kinds of expressions and then use "and" or "or" instructions provided by the CPU to "merge" the results and then do your jump based on the "merged" result.

于 2012-12-11T00:16:18.653 回答