【问题标题】:Backpatching Intermediate Code Generation For Boolean ExpressionsBackpatching 布尔表达式的中间代码生成
【发布时间】:2015-03-22 12:49:00
【问题描述】:

我正在研究 Dragon Book,以便为我的 DECAF 编译器创建一个中间代码生成器。

我正在阅读 backpatching 方法,它建议对布尔表达式进行以下翻译:

我发现一切都很清楚。然而,当我根据这本书实现我的翻译器时,我发现了一个问题,例如:

boolean a = false;
if(a){
    x= 0;
}

我的问题是我不知道如何在没有操作数的布尔表达式中管理变量。当我有这样的事情时:

if(x>200){
   ....
}

翻译工作正常。如果我有一个变量作为控制流布尔表达式,谁能告诉我该怎么做?

【问题讨论】:

    标签: compiler-construction


    【解决方案1】:

    您需要发出某种测试和跳转运算符。例如,您可以假装if(a)if(a!=0) 相同(具有适当的类型安全性,但仍假设在您的VM 中布尔false 为0)并以类似于E1 relop E2 案例的方式进行。 (这里 E1 是表达式,E2 是文字 0。)

    Dragon book 示例不考虑布尔变量;请注意,它有效地恒定折叠truefalse。这对于教学目的可能是有效的;在真正的编程语言中,布尔类型必须具有某种整数表示,并且布尔变量需要进行适当的测试。

    【讨论】:

    • 感谢您的回答。还有一个问题:我必须为 methodCalls 做同样的事情,对吧?
    • @PabloEstrada:我不会特殊情况变量。您可以将它用于关系或布尔表达式以外的任何表达式。 (这可能会迫使您显式地进行常量折叠。)
    • @PabloEstrada:Rici 是对的。您真的希望“B -> E”作为附加语法规则,并通过类型检查 E 产生布尔结果类型。我回答了你的字面问题。
    【解决方案2】:

    将“B -> 变量”添加到您的语法规则中。

    然后按照规则 5 为它设置补丁。

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      相关资源
      最近更新 更多