If statement if语句的代码生成 我正在编写一个简单的(C类)语言编译器的代码生成部分。我对“如果”语句有问题。我想为条件的每个部分生成相应的跳转指令,就像GCC一样。保存布尔表达式结构的结构是一个抽象语法树

If statement if语句的代码生成 我正在编写一个简单的(C类)语言编译器的代码生成部分。我对“如果”语句有问题。我想为条件的每个部分生成相应的跳转指令,就像GCC一样。保存布尔表达式结构的结构是一个抽象语法树,if-statement,compiler-construction,code-generation,If Statement,Compiler Construction,Code Generation,到目前为止,我编写了一个函数,它将生成相应的标签用于比较,也用于逻辑和逻辑否定。然而,当我试图使这个函数同时适用于逻辑or时,我遇到了一个巨大的问题 对于简单语句,例如 if (25 < 19) then print 99 statements (对于这个简单的示例,我的函数确实显示了类似的内容) 在处理否定时,您只需否定这些条件下的测试(将上面的jge转换为jl)。对于逻辑and,您只需以一种简单的方式依次为左和右连接生成相应的代码。但对于OR,我遇到了许多具有挑战性的问题。与所有

到目前为止,我编写了一个函数,它将生成相应的标签用于比较,也用于逻辑和逻辑否定。然而,当我试图使这个函数同时适用于逻辑or时,我遇到了一个巨大的问题

对于简单语句,例如

if (25 < 19) then
  print 99
statements
(对于这个简单的示例,我的函数确实显示了类似的内容)

在处理否定时,您只需否定这些条件下的测试(将上面的jge转换为jl)。对于逻辑and,您只需以一种简单的方式依次为左和右连接生成相应的代码。但对于OR,我遇到了许多具有挑战性的问题。与所有其他情况一样,如果条件失败,我不会跳转到if(或下一个else分支)之后的语句,而是必须跳转到代码所在的实际位置(如果or的任一操作数保持不变)。当您有两个OR时,情况会变得更糟,因为AST使用二进制节点表示OR,而试图转换为所选中间表示的函数使用此AST


谁能在这个问题上提供帮助?我也尝试过咨询“设计编译器”,但我没有从中找到任何有用的东西。

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


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

我不知道是谁否决了您的评论。我知道这项技术,但我只想尝试直接生成跳跃。
cmp 25, 19
jge label0
label1:
print 99
label0:
statements