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

C# 我需要一个快速的运行时表达式解析器,c#,asp.net-4.0,C#,Asp.net 4.0,我需要找到一个快速、轻量级的表达式解析器 理想情况下,我希望向它传递一个名称/值对列表(例如变量)和一个包含要计算的表达式的字符串。我所需要的只是一个真/假值 表达式的类型应符合以下要求: varA == "xyz" and varB==123 基本上,它只是一个简单的逻辑引擎,其表达式是在运行时提供的 更新 至少它需要支持==,!=,>,>= 这辆车怎么样?它让你和支持 如果你需要更强大的东西并且有时间,你也可以设计你自己的表达语言。你看过和吗 它是可扩展的、快速的(例如有自己的缓存),使您

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

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

表达式的类型应符合以下要求:

varA == "xyz" and varB==123
基本上,它只是一个简单的逻辑引擎,其表达式是在运行时提供的

更新
至少它需要支持==,!=,>,>= 这辆车怎么样?它让你和支持

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

你看过和吗

它是可扩展的、快速的(例如有自己的缓存),使您能够通过处理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和许多数据类型。如果你想更改语法,它附带一个鹿角锉。还有一个fork支持MEF加载新函数


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

Hisystems的解释器支持自定义函数、运算符和文字,是轻量级的纯c#可移植代码。目前通过MonoTouch在iOS上运行,应在任何其他Mono环境以及windows上运行。免费供商业使用。可在GitHub上获得。

我完全理解这个答案有多晚,但是我想加入我的解决方案,因为我相信如果有人希望在多个平台上使用表达式,它可以比公认的答案添加更多

--更新--

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

虽然Java和Swift是计划好的,但从未正式发布。相反,现在支持
.NET标准
,支持
Xamarin
应用程序

--结束更新--

Expressive是一种工具,可在以下位置获得: 或者

网站上有大量的文档,但为了防止链接腐烂,这里有一个关于如何使用它的示例:

可变支持

var expression = new Expression("1 * [variable]");
var result = expression.Evaluate(new Dictionary<string, object> { ["variable"] = 2);
它的设计目的是尽可能地匹配NCalc,但是它增加了对诸如“null”关键字之类的东西的支持。

这里的自我提升 我为c#编写了一个通用解析器生成器
您可以在我的github上找到一个表达式parseras示例。您可能需要定制它以满足您的需要

不知道任何现成的东西,但自己编写似乎不太困难(取决于需求)。==是唯一的比较器吗?vars在C#中区分大小写,还是在vb.net中不区分大小写?允许使用布尔运算符(and或not)。试图弄清楚这是否真的是可以用代码编写的任何表达式,或者用户仅限于=B@ChrisLively,这里有几种很好的方法,解析器需要快速,还是只需要计算?@CodeInChaos:我不确定我是否理解这个问题。>通常你只分析字符串一次,然后经常计算它(如有不同的论点)下面提到的NCalc是通过一个缓存实现的,它可以从多个线程工作。我看到了这个,但不确定是否有人实际使用过它。你有使用它的实际经验吗?@Chris-我在修补自己的表达式解析器时遇到了它。它可以按照宣传的方式工作,但我的要求不包括fast,所以你可能需要进行基准测试。a同样,它可能是轻量级的,也可能不是轻量级的,这取决于你如何定义它;)。我投了你一票,但最终决定反对。下载后,我看到它是所有的vb代码;我确信这很好,但我的某些东西(可能是20多年的开发)拒绝与vb相关的任何东西合作,如果我有选择的话为了我。它比NCALCO快,试试这个老栗子。我今天仍然使用它,而且效果很好。刚刚测试过。看起来很棒。仍然需要对其进行负载测试,但该项目非常容易实现。ace,如果您有任何问题,请随时在Ncalc讨论页面中发布。在使用7个月后,您必须发布更新。简单地说,它的岩石。它很快,很容易实现,甚至更容易用我们自己的自定义函数进行扩展。我强烈推荐nCalc。谢谢Chris,很高兴听到:)我非常喜欢使用Framework,我可以在代码的单元测试中看到,那里有一个测试,看看布尔表达式是否短路,所以我想答案是肯定的。
var expression = new Expression("sum(1,2,3,4)");
var result = expression.Evaluate();