Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I need a fast runtime expression parser

Tags:

c#

asp.net-4.0

I need to locate a fast, lightweight expression parser.

Ideally I want to pass it a list of name/value pairs (e.g. variables) and a string containing the expression to evaluate. All I need back from it is a true/false value.

The types of expressions should be along the lines of:

varA == "xyz" and varB==123 

Basically, just a simple logic engine whose expression is provided at runtime.

UPDATE
At minimum it needs to support ==, !=, >, >=, <, <=

Regarding speed, I expect roughly 5 expressions to be executed per request. We'll see somewhere in the vicinity of 100/requests a second. Our current pages tend to execute in under 50ms. Usually there will only be 2 or 3 variables involved in any expression. However, I'll need to load approximately 30 into the parser prior to execution.

UPDATE 2012/11/5
Update about performance. We implemented nCalc nearly 2 years ago. Since then we've expanded it's use such that we average 40+ expressions covering 300+ variables on post backs. There are now thousands of post backs occurring per second with absolutely zero performance degradation.

We've also extended it to include a handful of additional functions, again with no performance loss. In short, nCalc met all of our needs and exceeded our expectations.

like image 498
NotMe Avatar asked Dec 08 '10 20:12

NotMe


Video Answer


2 Answers

Have you seen https://ncalc.codeplex.com/ and https://github.com/sheetsync/NCalc ?

It's extensible, fast (e.g. has its own cache) enables you to provide custom functions and varaibles at run time by handling EvaluateFunction/EvaluateParameter events. Example expressions it can parse:

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

It also handles unicode & many data type natively. It comes with an antler file if you want to change the grammer. There is also a fork which supports MEF to load new functions.

It also supports logical operators, date/time's strings and if statements.

like image 76
GreyCloud Avatar answered Sep 21 '22 12:09

GreyCloud


How about the Fast Lightweight Expression Evaluator? It lets you set variables and supports logical operators.

If you need something beefier and have the time, you could also design your own expression language with Irony.

like image 29
Corbin March Avatar answered Sep 25 '22 12:09

Corbin March