3

私はshunting-yard アルゴリズムを実装しています。演算子に欠落している引数がある場合、検出に問題があります。ウィキペディアのエントリはこのトピックに関して非常に悪く、以下の例でもコードがクラッシュします。

たとえば、 には引数3 - (5 + )がないため、正しくありません。+

アルゴリズムが に到達する直前に)、演算子スタックには が含まれ- ( +、オペランド スタックには が含まれます3 5。次に、次のようになります。

  • +オペレータースタックからポップします
  • +二項演算子であることを発見
  • 2 つのオペランドをポップし、演算子を適用し、結果 ( 8) をオペランド スタックにプッシュします。
  • (次に、一致するものをスタックからポップし、続行します

+では、引数が欠落していることをどのように検出できますか? ウィキペディアも更新する場合は、さらに称賛します:-)

4

2 に答える 2

5

二項演算子のみの式の場合、後置式には、式の任意の接頭辞で、オペランドの数 > 演算子の数であり、最終的にその差は 1 であるという不変条件があります。

したがって、オペランド数 - オペレーター数の実行中のカウントを維持することにより、分流ヤードの各段階で RPN 式の妥当性を検証できます。それが 1 を下回ったり、最後に 1 を超えたりすると、エラーが発生します。

エラーを特定することはできませんが、少なくともエラーがあることを知らせてくれます。

(注:上記の事実を証明しようとはしていませんが、うまくいくようです)

于 2010-07-20T16:19:51.220 に答える
1

ステートマシンを構築できます。何かが間違っているトークンを見つけることができます。

式を読み始めるときは、前置演算子またはオペランドが必要です。前置演算子を読む場合は、前置演算子、オペランド、または開き括弧が必要です。

オペランドを読み取る場合は、後置または中置演算子または閉じ括弧が必要です。

後置演算子を読み取る場合は、中置演算子または閉じ括弧を期待します。

中置演算子を読み取る場合は、前置演算子、オペランド、または開き括弧が必要です。

左括弧を読み取る場合は、前置演算子、オペランド、または左括弧が必要です。

閉じ括弧を読む場合は、後置または中置演算子または閉じ括弧を期待してください。

これらのifを簡単にスイッチに変えることができます。:)

于 2010-12-11T18:54:47.537 に答える