2016-07-22 134 views
1

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

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

+0

您可以编写代码。我们不是为你设计你的系统,或是教你如何设计它。 –

+0

@MarcB感谢您提供的信息。无论如何,我确实得到了一个有用的答案,所以是的。 –

+0

RPN和postfix符号是相同的东西,而不是两个不同的东西。您不会将RPN解析器构建到解释器中。输入已被解析并可以线性处理。如果你想短路评估,你需要引入分支。 – EJP

回答

1

您会评估一个RPN表达式的两个阶段。

阶段1:解析RPN,并构建RPN的树形表示。因此,在此树中,例如,&&节点对于表达式的每一半都有两个子节点。构建此树与评估RPN几乎完全相同,除了评估部分被构建新节点的操作替换,并将其子节点链接到其新父节点,然后将父节点推回RPN评估堆栈。

阶段2:使用递归下降评估构建的树。此时,短路评估变得微不足道:评估&&的左侧孩子,然后决定是否真的要评估右侧孩子。

同上||节点等...

+0

谢谢你是完美的! :) –

+0

问题:如果我改用PN代替RPN,会不一样吗? –

+0

第一阶段当然会有所不同。构建树的不同逻辑。或者,可以编写PN解析器,以便它带有“忽略”标志,它只解析和吞下输入,不进行评估,递归地向下传递标志;如果左侧评估使得评估右侧不必要,那么使用&&'和'||'运算符为右侧评估设置标志。 –