寻找表达式评估器

时间:2010-10-24 21:59:01

标签: java

我正在寻找简单条件表达式的求值程序。 表达式应包括变量(只读),字符串,数字和一些基本运算符。

E.g。这样的表达式:

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

到目前为止,我实现了一个相当“神奇”的解析器,它返回了我可以评估的AST,但我无法相信我是第一个解决该问题的人。

我可以使用哪些现有代码?

7 个答案:

答案 0 :(得分:13)

你看过MVEL了吗?他们提供了getting started guideperformance analysis

这是他们的一个简单例子:

// 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; 

另外(回答我自己的问题)MVEL似乎为bytecode generation提供了一些支持。

其他替代方案,从上述答案和我自己的答案中剔除:

答案 1 :(得分:8)

JEXL之类的声音可能对您有用。查看其syntax reference.

答案 2 :(得分:5)

答案 3 :(得分:3)

为什么不使用 Rhino ?它是JDK中已经存在的JavaScript引擎。

它可以评估你在JS中写的任何内容..看看here

答案 4 :(得分:3)

这个简单的recursive descent parser将常量计算为没有参数的命名函数。

答案 5 :(得分:2)

一个非常简单易用的alternative,其中包含许多用于字符串,日期和数字格式的内置Excel函数。

该库还允许轻松添加自定义功能。 git页面上提供了很多示例。一个使用变量的简单示例

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

答案 6 :(得分:0)

Here是我研究过的一个小库,它支持表达式求值(包括变量,字符串,布尔值等)。

一个小例子:

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