【问题标题】:RPN short circuit evaluation [closed]RPN短路评估[关闭]
【发布时间】:2016-11-26 15:46:25
【问题描述】:

我现在正在制作一个简单的字节码解释器,它使用 RPN 来表示表达式,真正使用后缀表示法,但现在我遇到的问题是:短路评估是否真的可以用于后缀表达式?例如,在计算表达式 (false && (factorial(7) > factorial(5))) 时,C++ 知道两个操作数上的 && 运算符的结果在到达第二个操作数之前就计算为 false,因为 (false && any ) 总是等于假。现在,当您将其放入 RPN 时,您会得到 (false (7 factorial 5 factorial >) &&)。

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

【问题讨论】:

  • 你写代码。我们不是来为您设计系统,也不是教您如何设计。
  • @MarcB 感谢您提供的信息。无论如何,我确实得到了一个有用的答案,所以是的。
  • RPN 和后缀表示法是一回事,不是两个不同的东西。您不会将 RPN 解析器构建到解释器中。输入已经被解析并且可以线性处理。如果要进行短路评估,则需要引入分支。

标签: c++ bytecode postfix-notation short-circuiting rpn


【解决方案1】:

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

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

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

|| 节点等...

【讨论】:

  • 谢谢这是完美的! :)
  • 问题:如果我改用 PN 代替 RPN 会有什么不同吗?
  • 当然,第一阶段会有所不同。构建树的不同逻辑。或者,可以编写 PN 解析器,使其带有“忽略”标志,它只解析和吞下输入,而不评估它,递归地向下传递标志;使用 &&|| 运算符设置右侧评估的标志,如果左侧评估使得无需评估右侧。
猜你喜欢
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 2021-10-10
  • 2015-11-14
  • 2017-01-21
  • 2012-02-10
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多