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

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

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

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

Типы данных

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

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

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

Операторы сравнения строк нечувствительны к регистру.

Комментарии

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

#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)