2010-10-24 38 views
15

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

E.g.表情是这样的:

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

到目前为止,我实现了一个相当“神奇”解析器返回,我可以评价的AST,但我不能相信,我对解决这个问题的第一个。

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

+0

什么语言/语法一个简单的例子,你看评价?这是你编造的东西吗? Java与此有什么关系? – 2010-10-24 22:01:28

+2

我猜想OP想要在JVM上运行的东西。 – 2010-10-24 22:09:20

+0

我们在一个项目(http://www.singularsys.com/jep/)上使用了JEP,但我真的很喜欢一个小的,适应性相当的实际上可以产生字符码的字符码。由于这个原因,我们放弃了JEP,最终手动编写了大量的Java类。也许一个有ANTLR和BCEL的创业灵魂可以做到这一点? – andersoj 2010-10-24 23:12:44

回答

3

为什么不使用犀牛?这是一个已经存在于JDK内部的JavaScript引擎。

它可以评估任何你喜欢的JS写..看看here

+0

事实上,我们已经在使用Rhino来制作更大的自定义脚本。但我不想让这些小表达式成为脚本语言的全部力量。 – Stroboskop 2010-10-27 18:02:21

3

这个简单recursive descent parser评估常量为无参数命名的功能。

+3

当我用科学取代魔术时,我会走那条路。但现在我正在寻找一个现有的解决方案。 – Stroboskop 2010-10-27 17:54:40

11

你看过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一些支持。

其他的替代品,从上面的答案,扑杀和我自己:

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

这对于开箱即用的解决方案看起来非常有前途。但我最终选择了Antlr并建立了自己的表达语言。 – Stroboskop 2016-01-13 12:01:12