(タイトルと本文の両方を編集し、発生したスピンオフの質問を作成しました)
このアプリケーションでは、論理式の単純な DSL を解析するのが理想的です。ただし、これを行う方法は、(実行時に) 入力テキストを解析して、式を遅延評価された構造 (式テンプレート) に変換し、後でパフォーマンスに敏感なコード内で使用できるようにすることです。
理想的には、この手法を使用して可能な限り迅速に評価を行うのが理想的です。この手法は、毎回プレースホルダーに異なる値を代入して何度も使用されるためです。式テンプレートが、指定された入力テキスト文字列と同じ関数をモデル化するハードコードされた関数と同等のパフォーマンスを発揮するとは思っていません。つまり、実際にコンパイルするルートを下る必要はありません。実行中のプログラム(他の質問には動的ライブラリのコンパイル/ロードが含まれると思います)。
ブーストから例を読んだ私自身の考えは、ブースト::精神を使用して入力テキストの解析を行うことができ、必要な文法を開発できると確信しています。ただし、パーサーを boost::proto と組み合わせて、実行可能な式テンプレートを作成する方法がわかりません。私が見た精神のほとんどの例は、単なるインタープリターであるか、ある種の構文ツリーを構築するだけで、それ以上のことはしません。私が見た proto のほとんどの例では、DSL がホスト ソース コードに埋め込まれており、文字列から最初に解釈する必要がないことを前提としています。boost::spirit が実際に boost::proto で実装されていることは承知していますが、これが問題に関連しているかどうか、またはその事実が便利な解決策を示唆しているかどうかはわかりません。
繰り返しますが、次のようなものを実現できる必要があります。
const std::string input_text("a && b || c");
// const std::string input_text(get_dsl_string_from_file("expression1.dsl"));
Expression expr(input_text);
while(keep_intensively_processing) {
...
Context context(…);
// e.g. context.a = false; context.b=false; context.c=true;
bool result(evaluate(expr, context));
...
}
最小限の例、または後でコンテキストで評価される入力テキストから式を作成する上に構築できる小さなカーネルでさえ、本当に感謝しています。
これはここに投稿された質問とまったく同じではないと思います:ブーリアン式をブーストスピリットで解析 することは、非常に巧妙に見えますが、これが必ずしもこれを行う最速の実行方法であると確信していないためです。やがて、投稿されたすべての回答のベンチマークを実行しようとします。