寻找表达式评估器

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

例如这样的表达式:

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

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

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

你看过MVEL了吗? 它们提供入门指南和性能分析 。

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

 // 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似乎为字节码生成提供了一些支持。

其他选择,从上面的答案和我自己的剔除:

  • Java Expression Parser(JEP) – 并注意有一个旧版本免费提供
  • Apache Commons JEXL
  • 关于Rhino, 这是一个在这种情况下进行一些算术评估的家伙 (看起来很乱)

听起来像JEXL可能适合你。 查看其语法参考。

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

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

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

一个非常简单易用的替代品 ,具有许多内置的excel函数,用于字符串,日期和数字格式。

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

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

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

一个小例子:

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