私が式を有する場合:数式を解析してC#でツリーを構築するにはどうすればよいですか?
A = 2+3*5-6/3+2
をどのように私は、私は簡単に左から右へのボトムアップからの木、に基づいて結果を計算することができ、ノードをツリーとして式を構築することができます。
誰かが必要なパーサーや参考文献のサンプルを提供してもらえますか?
私が式を有する場合:数式を解析してC#でツリーを構築するにはどうすればよいですか?
A = 2+3*5-6/3+2
をどのように私は、私は簡単に左から右へのボトムアップからの木、に基づいて結果を計算することができ、ノードをツリーとして式を構築することができます。
誰かが必要なパーサーや参考文献のサンプルを提供してもらえますか?
は、解析に多くの可能な戦略があります。
あなた自身で解析コードを書きたい場合は、良い戦略はRecursive descent parserです。これは難しいことではありません。私はC#言語のために自分自身のものを書きました。
パーサージェネレータツールを使用する場合は、従来のGNU flex/bisonの組み合わせを使用するか、「C#パーサジェネレータ」のgoogleを使用してC#を検索して、Cで記述する必要はありません。これによりLALR parserが生成されます。
算術演算の場合は、you can leverage javascript within C# to "eval" the stringです。適切なパーサを構築したい場合は、文法を作成し、その文法からパーサを生成し、パーサの出力を処理するインタプリタを構築する必要があります。 GOLD Parsing Systemはそのタスクに非常に役立ち、.NET engines, including C#です。その他のオプションには、ANTLR Parser GeneratorとLEX and YACCがあります。
本当にあなた自身をロールしたい場合は、そこに多くのリソースがあります。 GOLD解析システムページは、実際にすでにそれについて多くの情報を持っている:
などが
単純な数式であれば、1つの方法はそれを逆ポーランド表記に変換することです。この表記では、表現がツリーを(スタックに)「線形化」するため、表現を計算するのは非常に簡単です。その後、実際のタスクを解析し、RPN表記法で変換します(実際には非常に簡単です)。
[http://en.wikipedia.org/wiki/Reverse_Polish_notation#Example]
計算する方がはるかに簡単だったので、RPNを使用するために使用される非常に古い電卓。
いくつか詳細を追加できますか?数式にかっこは付いていますか?減算、乗算、除算は唯一の演算ですか? – vlad
[この質問](http://stackoverflow.com/questions/28256/equation-expression-parser-with-precedence)はC#に固有ではありませんが、非常によく似ています。それはあなたが始めるのを助けるかもしれません。 –
これは私にとって宿題のように聞こえる。何か試しましたか? –