Поиск оценщика выражений

Я ищу оценщика для простых выражений условия. Выражения должны включать переменные (только для чтения), строки, числа и некоторые базовые операторы.

например. выражает что-то вроде этого:

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

До сих пор я реализовал довольно "волшебный" парсер, который возвращает AST, который я могу оценить, но я не могу поверить, что я первый, кто решил эту проблему.

Какой существующий код можно использовать вместо этого?

Ответы

Ответ 2

Вы посмотрели MVEL? Они предоставляют руководство по началу работы и анализ производительности.

Вот один из их простых примеров:

// 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, похоже, поддерживает некоторую поддержку генерации байт-кода.

Другие альтернативы, отбраковывая приведенные выше ответы и мои собственные:

Ответ 3

Похоже, JEXL может работать хорошо для вас. Проверьте его ссылку .

Ответ 4

Почему бы вам не использовать Rhino? Это движок JavaScript, уже присутствующий в JDK.

Он может оценить все, что вам нравится писать в JS.. посмотрите здесь

Ответ 6

Очень простая и простая в использовании альтернатива с множеством встроенных функций 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

Вот небольшая библиотека, над которой я работал, которая поддерживает оценку выражения (включая переменные, строки, логические и т.д.).

Маленький пример:

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