【问题标题】:How can I evaluate a string containing a binary formula in Delphi?如何在 Delphi 中评估包含二进制公式的字符串?
【发布时间】:2013-08-14 18:54:48
【问题描述】:

在 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)');

顺便说一句.. 我可以完全修改公式并使用和/或代替 &|.. 这只是为了使它与 SQL Server 一起工作。

【问题讨论】:

  • JCL TEvaluator 看起来不错。参考这个之前的SO问题stackoverflow.com/questions/13592136/…
  • JCL 表达式求值器确实不错。尽管它对小数分隔符的处理很差,并且缺少强力运算符。我已经在自己的分支中修复了这两个遗漏,但是我可以说服任何 JEDI 开发人员做必要的事情吗?我能不能!当开源项目死亡时令人沮丧。而且似乎没有明显的方法可以让它恢复生机。

标签: string delphi binary evaluation livebindings


【解决方案1】:

问题不在于它是一个“数学过程”,而在于 LiveBindings 解析器希望您的数学过程用 Pascal 运算符表示,而是 & 和 |是 C 运算符。

假设您有一个名为 LiveBindingsEval 的函数,该函数使用 LiveBindings 解析器评估字符串,请尝试这样的操作:

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)'));

您可能需要对此稍作改进,但这应该足以让您走上正确的道路...

【讨论】:

  • &和 |为了 SQL Server 的兼容性。不过,我会回去再试一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多