JEXL: Как разобрать рекурсивное выражение
Имея выражение JEXL, как я могу его проанализировать, чтобы динамически добавить в контекст JEXL все задействованные переменные?
Пример: начальное выражение:
Initial Expression = $VAR1 + $VAR2
VAR1 и VAR2 - другие выражения
$VAR1 = 123 + 45
$VAR2 = 67 + 89
Еще больше VAR1 может иметь другой уровень глубины:
$VAR1 = 123 + 45 + $VAR3
Итак, прежде чем оценивать начальное выражение, мне нужно добавить в контекст VAR1 и VAR2 и VAR3, как я могу сделать это динамически?
Можно ли использовать JEXL парсер? Или поймав исключение JEXL? Можете ли вы привести пример?
С уважением
1 ответ
Вам не нужно беспокоиться об этом вообще. JEXL справляется с этим.
Но, прежде всего, вы должны использовать оценщик скриптов, а не выражение выражений. Оценщики сценариев хорошо обрабатывают несколько операторов, а также поддерживают сложный синтаксис циклов.
Смотрите здесь
JexlScript
Это позволяет вам использовать несколько операторов, а также присваивать переменные, циклы, вычисления и т. Д. Более или менее то, что может быть достигнуто в Shell или JavaScript на базовом уровне. Результат последней команды возвращается из сценария.
JxltEngine.Expression
Они идеально подходят для создания однострочного текста, такого как toString() на стероидах. Чтобы получить расчет, вы используете EL-подобный синтаксис, как в ${someVariable}. Выражение, заключенное в квадратные скобки, ведет себя как JexlScript, а не как выражение. Вы можете использовать точки с запятой для выполнения нескольких команд, а результат последней команды возвращается из сценария. У вас также есть возможность использовать двухэтапную оценку с использованием синтаксиса #{someScript}.
Теперь попробуйте ниже:
String script =
"var var1 = 123 + 45;"
+ "var var2 = 67 + 89;"
+ "var var = var1 + var2;"
+ "return var;";
JexlContext jexlContext = new MapContext();
JexlEngine jexlEngine=new JexlBuilder().create();
System.out.println(jexlEngine.createScript(script).execute(jexlContext); // 134