Ответ 1
Как насчет SPEL (Spring Expression Lang); http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html
Я ищу оценщика для простых выражений условия. Выражения должны включать переменные (только для чтения), строки, числа и некоторые базовые операторы.
например. выражает что-то вроде этого:
${a} == "Peter" && ( ${b} == null || ${c} > 10 )
До сих пор я реализовал довольно "волшебный" парсер, который возвращает AST, который я могу оценить, но я не могу поверить, что я первый, кто решил эту проблему.
Какой существующий код можно использовать вместо этого?
Как насчет SPEL (Spring Expression Lang); http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html
Вы посмотрели 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, похоже, поддерживает некоторую поддержку генерации байт-кода.
Другие альтернативы, отбраковывая приведенные выше ответы и мои собственные:
Похоже, JEXL может работать хорошо для вас. Проверьте его ссылку .
Почему бы вам не использовать Rhino? Это движок JavaScript, уже присутствующий в JDK.
Он может оценить все, что вам нравится писать в JS.. посмотрите здесь
Этот простой рекурсивный анализатор спуска оценивает константы как именованные функции, не имеющие параметров.
Очень простая и простая в использовании альтернатива с множеством встроенных функций 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));
Вот небольшая библиотека, над которой я работал, которая поддерживает оценку выражения (включая переменные, строки, логические и т.д.).
Маленький пример:
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());