调车场:运营商缺少参数

时间:2010-07-20 16:06:30

标签: c++ algorithm parsing wikipedia shunting-yard

我正在实施shunting-yard algorithm。我在检测运营商缺少参数时遇到问题。 wikipedia entry在这个主题上非常糟糕,他们的代码也崩溃了以下示例。

例如3 - (5 + )不正确,因为+缺少参数。

在算法到达)之前,运算符堆栈包含- ( +,操作数堆栈包含3 5。然后就是这样:

  • 从操作员堆栈中弹出+
  • 发现+是二元运算符
  • 弹出两个操作数,应用运算符并将结果(8)推送到操作数堆栈
  • 然后从堆栈中弹出匹配的(,然后继续

那么如何才能检测到+缺少一个参数?如果你还更新维基百科,还有额外的荣誉: - )

2 个答案:

答案 0 :(得分:5)

对于仅二进制运算符表达式,后缀表达式具有在表达式的任何前缀中的不变量,操作数的数量>运营商的数量,最后,这个差异恰好是一个。

因此,您可以通过维持操作数的运行计数 - 运算符的数量来验证RPN表达式在分流码的每个阶段的有效性。如果它低于1,或者最后变为多于1,则表示您有错误。

它没有查明错误,但至少让你知道有错误。

(注意:我没有尝试证明上述事实,但似乎它会起作用)

答案 1 :(得分:0)

您可以构建状态机。它可以发现出现问题的令牌。

当你开始阅读表达式时,需要一个前缀运算符或一个操作数。 如果您读取前缀运算符,则需要前缀运算符,操作数或左括号。

如果您读取操作数,则需要后缀或中缀运算符或右括号。

如果您阅读了后缀运算符expect和infix运算符或右括号。

如果您读取中缀运算符,则需要前缀运算符,操作数或左括号。

如果您阅读左括号,则需要前缀运算符,操作数或左括号。

如果您阅读右括号,则需要后缀或中缀运算符或右括号。

您可以轻松地将这些ifs转换为开关。 :)