2010-10-24 72 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