我正在寻找简单条件表达式的求值程序。 表达式应包括变量(只读),字符串,数字和一些基本运算符。
E.g。这样的表达式:
${a} == "Peter" && ( ${b} == null || ${c} > 10 )
到目前为止,我实现了一个相当“神奇”的解析器,它返回了我可以评估的AST,但我无法相信我是第一个解决该问题的人。
我可以使用哪些现有代码?
答案 0 :(得分:13)
你看过MVEL了吗?他们提供了getting started guide和performance 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)
SPEL(Spring Expression Lang)怎么样; http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html
答案 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());