1

Delphi XE には、いくつかの複雑な式を次のようなバイナリ式の結果に分解するルーチンがあります。

(1&((1|0)|1)&1)

私のアプリケーションは SQL Server 上にあるので、簡単に SELECT (1&((1|0)|1)&1) As Result を実行でき、SQL Server はロジックを評価して 1 または 0 の結果を返します。

二項式の文字列表現を取得して評価するネイティブな Delphi の方法を見つけることができないようです。

XE に追加された Live Bindings Evaluators を調べましたが、and/or 演算子を使用しようとするとパーサー エラーがスローされるため、これはより数学的なプロセスであると考えられます。

また、いくつかのパーサーも調べましたが、実際に飛び出したものはありませんでした。

では、次のようなことをするにはどうすればよいですか。

iSomeInt := Evaluate('(1&((1|0)|1)&1)');

ところで..式を完全に作り直して、 &|.. の代わりに and/or を使用することができます.

4

1 に答える 1

1

問題は、LiveBindings パーサーが数学的プロセスが Pascal 演算子で表現されることを期待するほど、それが「数学的プロセス」であるということではありませんが、& と | です。C 演算子です。

LiveBindings パーサーで文字列を評価する LiveBindingsEval という関数があると仮定して、次のようなことを試してください。

function PreprocessExpression(const expr: string): string;
begin
   result := StringReplace(expr, '|', ' or ', [rfReplaceAll]);
   result := StringReplace(result, '&', ' and ', [rfReplaceAll]);
end;

iSomeInt := LiveBindingsEval(PreprocessExpression('(1&((1|0)|1)&1)'));

これを少し改善する必要があるかもしれませんが、正しい道を歩み始めるにはこれで十分なはずです...

于 2013-08-14T19:14:34.180 に答える