代码之家  ›  专栏  ›  技术社区  ›  Stroboskop

寻找表达式求值器

  •  16
  • Stroboskop  · 技术社区  · 14 年前

    我在找一个简单条件表达式的求值器。

    E、 g.类似这样的表达:

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

    到目前为止,我实现了一个相当“神奇”的解析器,它返回一个我可以计算的AST,但我不敢相信我是第一个解决这个问题的人。

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

    7 回复  |  直到 14 年前
        1
  •  5
  •   NightWolf    11 年前
        2
  •  14
  •   andersoj    14 年前

    你看过吗 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 .

    其他选择,从上面的答案和我自己的答案中挑选出来:

        3
  •  8
  •   Mike Daniels    14 年前

    听起来像 JEXL 可能对你有好处。看看它 syntax reference.

        4
  •  5
  •   Jack    14 年前

    你为什么不用 犀牛

    它可以评估你喜欢用JS写的任何东西。。看一看 here

        5
  •  3
  •   trashgod    14 年前
        6
  •  2
  •   Scorpion    10 年前

    非常简单易用 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));
    
        7
  •  0
  •   Skyost    6 年前

    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());