【问题标题】:Code generation for if statementsif 语句的代码生成
【发布时间】: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


    【解决方案1】:

    我记得我在学校的时候做过类似的事情。

    您应该专注于让您的编译器为这些表达式中的每个条件生成一个结果,然后使用 CPU 提供的“与”或“或”指令来“合并”结果,然后根据“合并”结果。

    【讨论】:

    • 我不知道谁对您的评论投了反对票。我知道这种技术,但我只想尝试直接生成跳跃。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多