我正在寻找简单条件表达式的求值器。 表达式应该包含变量(只读),字符串,数字和一些基本的操作符。寻找一个表达式求值器
E.g.表情是这样的:
${a} == "Peter" && (${b} == null || ${c} > 10)
到目前为止,我实现了一个相当“神奇”解析器返回,我可以评价的AST,但我不能相信,我对解决这个问题的第一个。
我可以使用哪些现有代码?
我正在寻找简单条件表达式的求值器。 表达式应该包含变量(只读),字符串,数字和一些基本的操作符。寻找一个表达式求值器
E.g.表情是这样的:
${a} == "Peter" && (${b} == null || ${c} > 10)
到目前为止,我实现了一个相当“神奇”解析器返回,我可以评价的AST,但我不能相信,我对解决这个问题的第一个。
我可以使用哪些现有代码?
现在已经太晚了,但这看起来非常符合我的要求。它专注于评估,但您有一个getAST方法返回表达式结构。 – Stroboskop 2013-11-07 10:45:42
为什么不使用犀牛?这是一个已经存在于JDK内部的JavaScript引擎。
它可以评估任何你喜欢的JS写..看看here
事实上,我们已经在使用Rhino来制作更大的自定义脚本。但我不想让这些小表达式成为脚本语言的全部力量。 – Stroboskop 2010-10-27 18:02:21
这个简单recursive descent parser评估常量为无参数命名的功能。
当我用科学取代魔术时,我会走那条路。但现在我正在寻找一个现有的解决方案。 – Stroboskop 2010-10-27 17:54:40
听起来像JEXL可能适合你。看看它的syntax reference.
你看过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一些支持。
其他的替代品,从上面的答案,扑杀和我自己:
一个非常简单和易于使用的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));
这对于开箱即用的解决方案看起来非常有前途。但我最终选择了Antlr并建立了自己的表达语言。 – Stroboskop 2016-01-13 12:01:12
什么语言/语法一个简单的例子,你看评价?这是你编造的东西吗? Java与此有什么关系? – 2010-10-24 22:01:28
我猜想OP想要在JVM上运行的东西。 – 2010-10-24 22:09:20
我们在一个项目(http://www.singularsys.com/jep/)上使用了JEP,但我真的很喜欢一个小的,适应性相当的实际上可以产生字符码的字符码。由于这个原因,我们放弃了JEP,最终手动编写了大量的Java类。也许一个有ANTLR和BCEL的创业灵魂可以做到这一点? – andersoj 2010-10-24 23:12:44