1

C# 関連の投稿がまだ見つからず、見つけられなかった組み込みメソッドがいくつかある可能性があるため、この質問をしています。ある場合は、その旨をお知らせください。この質問を終了できます。

基本的に、私は一般的な状況を持っています:

  1. ユーザーは、1 つまたは 2 つの変数をいくつかの変数に書き込む関数を入力します。TextBlock
  2. この文字列を分析します
  3. 戻り値として、1 つまたは 2 つの入力 (変数) を取り、ユーザーが入力した内容に応じて関数値を返すメソッドへのデリゲートが必要です。

さて、文字列を段階的に分析して、最初に何を計算しなければならないか、何を計算する必要があるかを実際に調べるアルゴリズムを考えることができます (そして、私は頭脳を使いたいので、これを自分でやりたいと思います)。仕方。たとえば、最初に括弧をスキャンし、括弧のグループ内で式を探し、より一般的な関数に従って計算します。

しかし、最終的には、この分析のメソッドを「作成」して、正しい関数値を返すいくつかの引数を持つ通常のデリゲートとして簡単に使用できるようにしたいと考えています。そのために C# に既に含まれているメソッドはありますか、それとも自分ですべてをプログラミングする必要がありますか?

備考として、私は他の誰かのライブラリを使用したくありません..NETライブラリのみが受け入れられます.

編集:マットが式ツリーを指摘した後、私の問題の良い例であるこのスレッドを見つけました。

Edit2:指摘された例には単純な関数のみが含まれており、三角関数や指数関数などのより複雑な関数を含めたい場合は役に立ちません。

4

4 に答える 4

2

これを行う方法のいくつかの例については、NCalcをチェックしてください。ライブラリを使用する必要はありませんが、ソースを読むことはかなり教育的です。

于 2012-10-25T13:31:02.547 に答える
2

あなたが説明しているのはパーサーです。それらを実装するにはさまざまな方法がありますが、一般的に言えば、複雑な文法には「パーサージェネレーター」がよく使用されます。

パーサー ジェネレーターは、文法の記述を取得し、それをコードに変換します。このコードは、文法に準拠するテキストを解析して、プログラムで操作できる内部表現の形式 (解析ツリーなど) に変換します。

サードパーティのライブラリを避けたいとおっしゃっているので、パーサー ジェネレーターの使用も同様に除外され、独自のパーサーを実装する必要があると思います (幸いなことに、これは非常に興味深い課題です)。

再帰降下パーサーに関するウィキペディアのページは特に役立ちます。それを読んで、おそらくその中のサンプルコードを特定のユースケースに適応させることをお勧めします。私はこれを出発点としてさまざまな文法に対して何度も自分でこれを行ったので、その有用性を証明することができます.

このようなパーサーからの出力は「解析ツリー」になります。そして、これを実行可能なデリゲートに変換する方法には、いくつかの可能性があります。1 つのオプションはEvaluate()、解析ツリー ノードにメソッドを実装することです。このメソッドは一連の変数を取り、ユーザーの式を評価した結果を返します。他の人が述べたように、解析ツリーは .NET の式ツリーを利用するか、IL を直接出力するルートをたどることができます (後で必要に応じて使用するために、ユーザーの式からコンパイル済みの .NET アセンブリを生成できます)。

于 2012-10-25T13:34:08.873 に答える
2

式ツリーを見たいと思うかもしれません。

于 2012-10-25T13:25:49.430 に答える
0

C# 2.0 での解析を説明する非常に役立つ pdf を見つけました。このリンクは、C# で使用されるパーサーに関する非常に優れたチュートリアルにつながり、後で算術式にも適用されます。

これは私の質問に直接役立ち、回答するので、コメントや編集ではなく、回答として投稿しました。

于 2012-10-25T15:39:34.607 に答える