これは、3つのステップで行うのが最適なようです。
まず、何を評価するのかを正確に把握する必要があります。これは通常、スキャンと解析と呼ばれる2つのステップで実行されます。スキャンの役割は、入力文字列を一連のトークン、つまりテキストを構成する小さな論理単位に分割することです。たとえば、文字列が与えられた
(a && b)
これをトークンに分割します
(
a
&&
b
)
通常、これは正規表現を使用して行われますが、手動で行うこともできます。主なアイデアは、文字列の断片を決定するタスクを、それらの断片がどのように関連しているかを確認するタスクから分離することです。
入力をスキャンしたら、それを解析して何が言われているかを判断する必要があります。つまり、トークンを完全な数式エンコーディング演算子の優先順位、使用されているオペランドなどに再構成します。これを行うためのアルゴリズムは多数ありますが、おそらく最も簡単なのは、ダイクストラの操車場アルゴリズムです。埋め込む。この解析ステップの出力は、入力の構造をエンコードするツリー構造である抽象構文ツリーを使用して保存する可能性があります。
この時点で、評価する式の意味を明確に解釈できるので、実際に評価する必要があります。これを行うには、おそらく、ASTノードごとに、そのノードから値を生成する関数を定義します。&&のような演算子の場合、左と右の部分式を評価してから、それらのANDを計算します(または、lhsがfalseの場合は、短絡を使用してrhsの計算を回避します)。個々の文字については、リフレクションを使用して対応するメソッドを呼び出すか、(必要なセキュリティに応じて)名前を関数にマッピングするテーブルを作成できます。
コーディングに関する潜在的な最適化として、ASTの構築を省略し、必要な値を計算することを検討することをお勧めします。操車場アルゴリズム(およびトップダウンLL(1)やボトムアップLR(1)パーサーなど、他の多くのパーサー)では、通常、構成式の観点から式の全体的な値を計算できます。この方法でコーディングする方が簡単な場合があります。ただし、データベースなどの巨大なデータセットで説明されている関数を使用することを計画している場合、ASTを計算すると、データベース内の各値で呼び出して必要な値を生成できるオブジェクトが得られます。
膨大なデータセットに対して非常に複雑なクエリを実行することを計画している場合は、さらに一歩進んで、生成された式を実際にC#コードに変換し、それをコンパイルして実行中のプログラムにロードすることもできます。これが非常に効果的に使用されたJavaの例を見てきましたが、これは非常に高性能なアプリケーション用であり、他のすべてのオプションを使い果たしていない限り、おそらくやり過ぎです。
お役に立てれば!