コンソール型計算プログラムをつくりたいんだけど part02

実験データまとめるのに飽きたので、ちょっとまたこっち考えます。

数式の構造解析アルゴリズム検討

前回言ったように、与えられた1本の数式を先頭から解析していってはいけません。
1+2*3
という数式を、先頭から解析していき
1+2
から計算してはいけないのと同じです。ここで考えられる対処法は、計算を優先させるオペレータを順に拾っていき、そこから計算していくという方法です。ちょっと長い数式を例にとりますと、
1+2*3-4/5+6
という数式を先頭から解析していくときに、
1+2
まで読むと、オペレータは「+」の1つだけです。しかし更に読み進めていくと
1+2*3
となり、この時点で「+」より「*」を先に計算しなければならないと判断するようにします。更に読み進めて
1+2*3-4/5
まで来たところで、「*」と「/」を優先して計算する必要があることが判断されます。結局最後まで読んだところで
1+2*3-4/5+6
となり、
1+2*3-4/5+6
=1+ 6 -0.8+6
=13.8
と計算できればOKなわけですね。
てな訳で、オペレータの優先順位を決めていく方法としては、

  • 与えられた数式に使われているオペレータを一通りチェックしてから、優先度の高いものから計算していく。

というのが思い浮かびます。ただ、これ以外にも

  • 与えられた数式を先頭から読んでいき、最弱オペレータで式を分割する。

なんて方法もあるでしょう。つまり先の数式を例に挙げると
1+2*3-4/5+6
を最弱オペレータの「+」と「-」で区切り
「1」と「2*3」と「4/5」と「6」
で分け、それぞれの括弧内を計算する。計算し終わったらその結果を元の数式に戻す。そうすれば、最強オペレータは数式を最後まで読まないとわかりませんが、最弱オペレータは「+」と「-」の2つだけですから、先頭から順に処理していくことができるはずです。このかたまりをクラスで組んで、かたまりごとにインスタンスをつくればいいのかなとか考えています。これをここで「部分数式」とでも呼びますと、

  • 部分数式
    • 符号(プラスorマイナス)
    • 数式

でやればOKかと。数式はその中で更に構造分析をするからpublicで、符号は部分数式がこれ以上計算ができない単位になるまで一切変更しないからprivateでいいと思います。