我正在尋找簡單條件表達式的求值器。 表達式應該包含變量(只讀),字符串,數字和一些基本的操作符。尋找一個表達式求值器
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