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
Другие вопросы по тегам