我现在正在制作一个简单的字节码解释器,它使用RPN作为表达式表示法,并真正用于任何东西的后缀表示法,但现在我要问的问题是:短路评估实际上能用于后缀表达式吗?例如,当计算表达式(false && (fac引流(7)>阶乘(5))时,C++知道两个操作数上的&&运算符的结果,它甚至在到达第二个操作数之前就计算为false,因为(false & anything)总是等于false。现在,当您将其放入RPN中时,会得到(false (7阶乘5阶乘>) &)。
我想要构建一个高效的RPN表达式解析器,所以问题是:如何使一个高效的RPN表达式解析器具有短路评估功能?
发布于 2016-07-22 16:52:57
您将分两个阶段计算一个RPN表达式。
阶段1:解析RPN,并构造RPN的树表示。因此,例如,在这个树中,&&节点有两个子节点,每个子节点对应表达式的一半。构建这棵树与计算RPN是一个几乎完全相同的过程,除了计算部分之外,计算部分被构造新节点的操作所取代,并将其子节点链接到新的父节点,然后将父节点推回RPN计算堆栈。
第二阶段:使用递归下降计算构造的树。在这一点上,短路评估变得微不足道:评估一个&&的左手子,然后决定你是否真的想要评估右边的孩子。
同样适用于||节点等..。
https://stackoverflow.com/questions/38531525
复制相似问题