我需要找到一个快速,轻量级的表达式解析器。
理想情况下,我想传递一个名称/值对列表(例如变量)和一个包含要评估的表达式的字符串。我需要的只是一个真/假值。
表达式的类型应该是:
varA == "xyz" and varB==123
基本上,只是一个简单的逻辑引擎,其表达式是在运行时提供的。
更新
至少它需要支持==,!=,>,> =,<,< =
关于速度,我希望每个请求大约执行5个表达式。我们会看到附近的某个地方/请求一秒钟。我们当前的页面往往在50ms以内执行。通常,任何表达式中只涉及2或3个变量。但是,我需要在执行之前将大约30加载到解析器中。
更新2012/11/5
有关性能的更新。我们近2年前实施了nCalc。从那以后,我们扩大了它的使用范围,使得我们在帖子背面平均覆盖300多个变量的40多个表达式。现在每秒发生数千次回发,性能严重下降。
我们还扩展了它,包括一些额外的功能,同样没有性能损失。简而言之,nCalc满足了我们的所有需求并超出了我们的期望。
答案 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
个应用。
- 结束更新 -
富有表现力的工具,可在以下位置获得: GitHub或Nuget。
该网站上有相当数量的文档,但是为了防止链接腐烂,这是一个如何使用它的示例:
可变支持
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示例。您可能需要根据自己的需要进行自定义