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