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

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

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

表达式的类型应该是这样的:

varA == "xyz" and varB==123 

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

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

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

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

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

你看过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加载新function的fork。

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

快速轻量级表达评估器怎么样? 它允许您设置变量并支持逻辑运算符 。

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

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

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

更新

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

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

结束更新

富有表现力的工具可以在以下网站获得: GitHub或Nuget 。

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

可变支持

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

function

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

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