简体   繁体   中英

Looking for an expression evaluator

I'm looking for an evaluator for simple condition expressions. Expressions should include variables (read only), strings, numbers and some basic operators.

Eg expressions something like this:

${a} == "Peter" && ( ${b} == null || ${c} > 10 )

So far i implemented a rather "magical" parser that returns an AST that i can evaluate, but i can't believe that i'm the first one to solve that problem.

What existing code could i use instead?

Have you looked at MVEL ? They provide a getting started guide and performance analysis .

Here's one of their simple examples:

// The compiled expression is serializable and can be cached for re-use.
CompiledExpression compiled = MVEL.compileExpression("x * y"); 

Map vars = new HashMap();
vars.put("x", new Integer(5));
vars.put("y", new Integer(10));

// Executes the compiled expression
Integer result = (Integer) MVEL.executeExpression(compiled, vars); 
assert result.intValue() == 50; 

Also (answering my own question) MVEL seems to provide some support for bytecode generation .

Other alternatives, culling from the above answers and my own:

Sounds like JEXL might work well for you. Check out its syntax reference.

Why don't you use Rhino ? It's a JavaScript engine already present inside the JDK.

It can evaluate whatever you like to write in JS.. take a look here

这个简单的递归下降解析器将常量计算为没有参数的命名函数。

A very simple and easy to use alternative with a lot of built in excel functions for string, date and number formatting.

The library also allows easy addition of custom functions. A lot of examples available on the git page. A simple example using variables

  ExpressionsEvaluator evalExpr = ExpressionsFactory.create("LEFT(City, 3)");
  Map<String, Object> variables = new HashMap<String, Object>();
  variables.put("City", "New York");
  assertEquals("New", evalExpr.eval(variables));

Here is a little library I've worked on that supports expression evaluation (including variables, strings, boolean, etc...).

A little example :

String expression = "EXP(var)";
ExpressionEvaluator evaluator = new ExpressionEvaluator();
evaluator.putVariable(new Variable("var", VariableType.NUMBER, new BigDecimal(20)));

System.out.println("Value of exp(var) : " + evaluator.evaluate(expression).getValue());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM