Препроцессор Inno Setup: Синтаксис выражений

ISPP использует C/C++-подобный синтаксис выражений. Он поддерживает простые и составные операторы, условные операторы и операторы следования. И хотя ISPP является всего лишь интерпретатором, но также поддерживает короткие логические операции и никогда не вычисляет выражения (и какие-либо пользовательские функции, упомянутые в этих выражениях), которые по причине особых правил не должны вычисляться (например, при использовании условного оператора будут вычислены только 2 и 3 операнды).

В файле сценария ISPPBuiltins.iss вы найдете множество примеров синтаксических выражений.

Различия между синтаксисом C и ISPP

Типы данных

ISPP содержит три типа данных: void (пустой), integer (целочисленный) и string (строковый). Переменные типа void объявляются директивой define, для которой указывается только имя переменной без каких-либо значений. Такие переменные могут использоваться с директивой ifdef или в функции Defined.

Если для синтаксического анализа строк параметр "Разрешить применение необъявленных идентификаторов" отключен (это состояние по умолчанию, подробности смотрите в pragma), то возникнет ошибка, т.к. компилятор не знает, что это за переменные. В противном случае, они будут обработаны как пустые (тип void), т.е. не имеющие никаких значений.

В выражениях тип void хорошо совместим с целочисленными (int) и строковыми (str) типами данных. Например, вы можете запросто сложить два операнда, один из которых является int, в другой — void. В этом случае пустой операнд будет обработан как ноль (целое число 0). Если же операции выполняются над строками, пустой операнд будет обработан как пустая строка.

Комментарии

Для облегчения чтения и понимания текста сценария, вы можете писать комментарии. Покажем вам основные принципы ввода комментариев и символы, которые при этом можно использовать. Посмотрите на следующий пример, используя косую черту ( / ) и звездочку ( * ) можно внедрить комментарий в выражение:

#emit Var1 /* это комментарий */ + Var2 /* и это тоже комментарий */

Комментарии могут быть размещены в конце выражения с использованием точки с запятой ( ; ) или двойной косой черты ( // ). Например:

#emit Var1 + Var2 ; это комментарий
#emit Var1 + Var2 // это тоже комментарий 

Если текст комментария очень большой, то используя символ разделения строк — обратная косая черта ( \ ) —  его можно разбить на несколько строк. Например:

#emit Var1 + Var2 ; здесь находится текст \
очень длинного комментария :)

Комментарии также можно разместить в любом месте с начала строки, используя двойную косую черту ( // ). Например:

// Это комментарий

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

#emit Var1 + Var2 ; этого комментария на выходе препроцессора НЕ будет
// Этого комментария тоже НЕ будет
; А вот этот комментарий БУДЕТ

Расширенный синтаксис вызова пользовательских функций

В ISPP имеется возможность использования именованных параметров при вызове функций, определённых пользователем. Например, выполним объявление функции MyFunction:

#define MyFunction(int A = 2, int B = 2) A + B

Теперь выполним вызов этой функции и укажем имена параметров:

#emit MyFunction(A = 5, B = 10)
#emit MyFunction(B = 3)
#emit MyFunction(B = 10, A = 5)