我需要一个快速运行时表达式解析器

时间:2010-12-08 20:33:49

标签: c# asp.net-4.0

我需要找到一个快速,轻量级的表达式解析器。

理想情况下,我想传递一个名称/值对列表(例如变量)和一个包含要评估的表达式的字符串。我需要的只是一个真/假值。

表达式的类型应该是:

varA == "xyz" and varB==123

基本上,只是一个简单的逻辑引擎,其表达式是在运行时提供的。

更新
至少它需要支持==,!=,>,> =,<,< =

关于速度,我希望每个请求大约执行5个表达式。我们会看到附近的某个地方/请求一秒钟。我们当前的页面往往在50ms以内执行。通常,任何表达式中只涉及2或3个变量。但是,我需要在执行之前将大约30加载到解析器中。

更新2012/11/5
有关性能的更新。我们近2年前实施了nCalc。从那以后,我们扩大了它的使用范围,使得我们在帖子背面平均覆盖300多个变量的40多个表达式。现在每秒发生数千次回发,性能严重下降。

我们还扩展了它,包括一些额外的功能,同样没有性能损失。简而言之,nCalc满足了我们的所有需求并超出了我们的期望。

5 个答案:

答案 0 :(得分:32)

您看过https://ncalc.codeplex.com/https://github.com/sheetsync/NCalc了吗?

它是可扩展的,快速的(例如有自己的缓存)使您能够通过处理EvaluateFunction / EvaluateParameter事件在运行时提供自定义函数和变量。它可以解析的示例表达式:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)");

  e.Parameters["Pi2"] = new Expression("Pi * Pi");
  e.Parameters["X"] = 10;

  e.EvaluateParameter += delegate(string name, ParameterArgs args)
    {
      if (name == "Pi")
      args.Result = 3.14;
    };

  Debug.Assert(117.07 == e.Evaluate());

它还处理unicode&许多数据类型原生。如果你想改变语法,它会附带一个鹿茸文件。还有一个支持MEF加载新功能的fork。

它还支持逻辑运算符,日期/时间的字符串和if语句。

答案 1 :(得分:13)

Fast Lightweight Expression Evaluator怎么样?它允许您set variables并支持logical operators

如果你需要更强大的东西并且有时间,你也可以用Irony设计自己的表达语言。

答案 2 :(得分:6)

Hisystems的Interpreter支持自定义函数,运算符和文字,是轻量级的纯c#可移植代码。目前通过MonoTouch在iOS上运行,并且应该在任何其他Mono环境以及Windows上运行。免费用于商业用途。可在GitHub上https://github.com/hisystems/Interpreter获取。

答案 3 :(得分:2)

我完全理解这个答案有多晚了但是我想提出我的解决方案,因为我相信如果有人希望在多个平台上使用表达式,它可以在使用NCalc之后添加更多的答案。< / p>

- 更新 -

我为C#创建了一个解析器,并计划在接下来的几个月内为Java和Swift实现它。这意味着您可以在多平台上评估表达式,而无需对每个平台进行调整。

虽然计划使用Java和Swift,但它还没有完全发布。相反,现在支持.NET Standard支持Xamarin个应用。

- 结束更新 -

富有表现力的工具,可在以下位置获得: GitHubNuget

该网站上有相当数量的文档,但是为了防止链接腐烂,这是一个如何使用它的示例:

可变支持

var expression = new Expression("1 * [variable]");
var result = expression.Evaluate(new Dictionary<string, object> { ["variable"] = 2);

<强>功能

var expression = new Expression("sum(1,2,3,4)");
var result = expression.Evaluate();

它旨在尽可能地匹配NCalc,但它增加了对'null'关键字等内容的支持。

答案 4 :(得分:0)

在这里自我推销  我为c#https://github.com/b3b00/csly写了一个通用的解析器生成器 你可以在我的github上找到一个表达式parseras示例。您可能需要根据自己的需要进行自定义