RPN短路评估

RPN short circuit evaluation

我现在正在制作一个简单的字节码解释器,它使用 RPN 作为表达式符号,真正使用后缀符号来表示任何东西,但现在我遇到的问题是:短路评估实际上可以用于后缀表达式?例如,在评估表达式 (false && (factorial(7) > factorial(5))) 时,C++ 知道两个操作数上的 && 运算符的结果在它到达第二个操作数之前评估为 false,因为 (false && anything ) 始终等于假。现在当你把它放在 RPN 中时,你会得到 (false (7 factorial 5 factorial >) &&)。

我想构建一个高效的 RPN 表达式解析器,所以问题是:如何制作一个具有短路评估的高效 RPN 表达式解析器?

您将分两个阶段评估 RPN 表达式。

阶段 1:解析 RPN,并构建 RPN 的树表示。因此,例如,在这棵树中,&& 节点有两个 children 节点,用于表达式的每一半。构建这棵树与评估 RPN 的过程几乎相同,除了评估部分,它被构建新节点的操作所取代,并将其 child 节点链接到它们的新 [=31] =] 节点,然后将 parent 节点推回 RPN 评估堆栈。

第 2 阶段:使用递归下降评估构建的树。在这一点上,short-circuit评估变得微不足道:评估&&的left-handchild,然后决定是否真的要评估right-hand[=28] =].

同上 || 节点等...