我正在寻找一个简单条件表达式的求值器。
这些表达式应包含变量(只读),字符串,数字和一些基本运算符。
例如,表达式可能如下所示:
${a} == "Peter" && ( ${b} == null || ${c} > 10 )
到目前为止,我实现了一个相当“神奇”的解析器,它返回了一个可以评估的AST,但我不相信我是第一个解决这个问题的人。
有哪些现有的代码可以代替我的解析器呢?
${a} == "Peter" && ( ${b} == null || ${c} > 10 )
到目前为止,我实现了一个相当“神奇”的解析器,它返回了一个可以评估的AST,但我不相信我是第一个解决这个问题的人。
有哪些现有的代码可以代替我的解析器呢?
这是他们简单示例之一:
// 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似乎提供了一些支持字节码生成的功能。
其他可选方案,从上面的答案和我的经验中总结:
SPEL (Spring Expression Language)是什么?点击查看详细介绍。
为什么不使用Rhino?它是JDK内置的JavaScript引擎。
它可以评估你想用JS编写的任何内容..在这里看看
这是一个非常简单易用的替代方案,内置了许多用于字符串、日期和数字格式化的 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));
这里是我开发的一个小型库,支持表达式求值(包括变量、字符串、布尔等)。
这是一个小例子:
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());