从AST为条件表达式生成分支指令

问题描述 投票:0回答:1

我正在尝试针对特定领域的语言编写编译器,以非JVM的基于堆栈机的VM为目标。

我已经为我的语言生成了一个解析器,并且可以很容易地生成一个AST,我可以轻松地行走。我也没有将我的许多语言语句转换为适用于该VM的适当指令的问题,但是在遇到复杂的条件时,尤其是当它们遇到时,在处理适当的分支指令的生成方面遇到了障碍与(可能嵌套的)“和”类或“或”类操作相结合,应在适用时使用短路分支。

我不是要任何人为我写这篇文章。我知道我还没有足够详细地描述我的问题。我要的是一些有用的材料的指针,这些材料可以使我克服我所面临的这一障碍。就像我说的那样,我已经无法将我的语言中大约90%的语句转换为适用的指令,但是让我感到困惑的是条件条件的处理和生成适当的流控制指令。到目前为止,我在从AST生成代码时所能找到的许多信息似乎只处理与简单的类似命令式语句相对应的代码生成,但是条件和流控制的处理似乎更加稀缺。

除了我所描述的'和'和'或'类似结构的短路/惰性评估机制,我不关心处理任何其他优化。

if-statement compiler-construction code-generation abstract-syntax-tree lazy-evaluation
1个回答
0
投票

每个条件控制流都可以建模为流程图(或流程图),其中条件的两个分支具有不同的目标。考虑到布尔运算符发生短路,它们是控制流元素,而不是简单的表达式,因此需要对其进行建模。

对此的一种思考方式是将布尔运算符改写为三元条件运算符的实例。因此,例如,A and B变为A ? B : falseA or B变为A ? true : B [注1]。请注意,每个控制流程图都恰好具有两个输出点。enter image description here

要合并布尔表达式,只需替换为图表。例如,这里的A AND (B OR C)

enter image description here

您只需交换两个流出的含义即可实现NOT。>>

如果布尔表达式的最终使用是某种条件的,例如if语句或条件循环,则可以按原样使用控制流。如果要将布尔表达式保存到变量中或将其用作值,则需要用代码填充两个流出,以创建相关的常数,通常是true

false布尔常数,或(类似于C语言)为1或0。

注意:
  1. 写此等价关系的另一种方法是A and B ⇒ A ? B : A; A or B ⇒ A ? A : B,但是对于控制流视图而言,它的用处不大,并且也笼罩了一个事实,即每个表达式仅求值一次。这种形式(经过修改可重复使用A的初始计算)通常用于具有多个“假”值的语言(例如Python)。

© www.soinside.com 2019 - 2024. All rights reserved.