为布尔表达式回溯中间代码生成
Backpatching Intermediate Code Generation For Boolean Expressions
我正在研究 Dragon Book 来为我的 DECAF 编译器创建一个中间代码生成器。
我正在阅读回补方法,它建议对布尔表达式进行以下翻译:
我觉得一切都很清楚。然而,在根据这本书实现我的翻译器时,我发现有 if 语句时出现问题,例如:
boolean a = false;
if(a){
x= 0;
}
我遇到的问题是我不知道如何在没有操作数的布尔表达式中管理变量。当我有这样的事情时:
if(x>200){
....
}
翻译很好。如果我有一个变量作为控制流布尔表达式,谁能告诉我该怎么做?
将 "B -> variable" 添加到您的语法规则中。
然后类似于规则 5 为其设置补丁。
您需要发出某种测试和跳转运算符。例如,您可以假装 if(a)
与 if(a!=0)
相同(具有适当的类型安全性,但仍然假设在您的 VM 中 boolean false 是 0
)并以类似于E1 relop E2 案例。 (这里 E1 是表达式,E2 是文字 0。)
龙书示例没有考虑布尔变量;请注意,它有效地常量折叠 true
和 false
。这对于教学目的可能是有效的;在真正的编程语言中,布尔类型必须具有某种整数表示形式,并且布尔变量需要进行适当的测试。
我正在研究 Dragon Book 来为我的 DECAF 编译器创建一个中间代码生成器。
我正在阅读回补方法,它建议对布尔表达式进行以下翻译:
我觉得一切都很清楚。然而,在根据这本书实现我的翻译器时,我发现有 if 语句时出现问题,例如:
boolean a = false;
if(a){
x= 0;
}
我遇到的问题是我不知道如何在没有操作数的布尔表达式中管理变量。当我有这样的事情时:
if(x>200){
....
}
翻译很好。如果我有一个变量作为控制流布尔表达式,谁能告诉我该怎么做?
将 "B -> variable" 添加到您的语法规则中。
然后类似于规则 5 为其设置补丁。
您需要发出某种测试和跳转运算符。例如,您可以假装 if(a)
与 if(a!=0)
相同(具有适当的类型安全性,但仍然假设在您的 VM 中 boolean false 是 0
)并以类似于E1 relop E2 案例。 (这里 E1 是表达式,E2 是文字 0。)
龙书示例没有考虑布尔变量;请注意,它有效地常量折叠 true
和 false
。这对于教学目的可能是有效的;在真正的编程语言中,布尔类型必须具有某种整数表示形式,并且布尔变量需要进行适当的测试。