我现在正在制作一个简单的字节码解释器,它使用RPN表示符号,并且确实用于任何事情的后缀表示法,但是现在我遇到的问题是:短路评估实际上可以用于后缀表达式?例如,在评估表达式时(false&&(factorial(7)> factorial(5)))C ++知道&&amp ;;的结果。两个操作数上的运算符在它到达第二个操作数之前计算为false,因为(false&& anything)总是等于false。现在当你把它放在RPN中时,你得到(假(7因子5因子>)&&)。
我想构建一个高效的RPN表达式解析器,所以问题是这样的:如何通过短路评估创建一个有效的RPN表达式解析器?
答案 0 :(得分:1)
您将分两个阶段评估RPN
表达式。
阶段1:解析RPN
,并构造RPN的树表示。因此,在此树中,例如,&&
节点对于表达式的每一半都有两个子节点。构造此树的过程与评估RPN
几乎相同,除了评估部分,它被构造新节点的操作所取代,并将其子节点链接到新的父节点,然后推送父节点节点返回RPN
评估堆栈。
阶段2:使用递归下降来评估构造的树。在这一点上,短路评估变得微不足道:评估&&
的左手孩子,然后决定你是否真的想要评估右手孩子。
同样适用于||
节点......