Синтаксемы и спецсимволы
В контексте программирования синтаксема может рассматриваться как минимальная единица синтаксиса, которая определяет структуру и правила написания кода.
Так синтаксемой может быть переменная, оператор, функция, ключевое слово объявления, или специальные символы, с помощью которых мы структурируем код.
Здесь представлены синтаксемы/спецсимволы, не вошедшие в остальные разделы с ключевыми словами и системными переменными.
END
Ключевое слово (оператор), отмечающее окончание многострочной конструкции. Многострочными могут быть действия, конструкции условий, циклов. Примеры:
! открываем условие
if obj "Кувшин":
*pl "У вас есть кувшин."
! закрываем условие
end
! открываем действие
act "Взять яблоко":
яблоко += 1
addobj "Яблоко"
! закрываем действие
end
loop local i = 0 while i < 10 step i += 1:
*pl "Проход <<i+1>>: i=<<i>>"
end
Каждая многострочная конструкция должна завершаться ключевым словом end. Однако здесь работают такие же правила, как для HTML-тегов или скобок: если мы вкладываем одну конструкцию в другую, сначала необходимо закрывать последнюю открытую конструкцию:
! открываем условие
if obj "Пустой кувшин":
! код, который относится к условию
*pl "У вас есть пустой кувшин."
! открываем действие
act "Наполнить кувшин":
! код который относится к действию
delobj "Пустой кувшин"
addobj "Полный кувшин"
! закрываем ДЕЙСТВИЕ
end
*pl "Кувшин можно наполнить из колодца."
! закрываем УСЛОВИЕ
end
Можно использовать не просто end, а end if, end act и end loop:
! открываем действие
act "Купить 10 стрел по 5 рублей":
! открываем условие 1 уровня
if money >= 10 * 5:
arrow += 10
money -= 10 * 5
! открываем условие 2 уровня
if no (obj "Стрелы"):
addobj "Стрелы"
! закрываем условие 2 уровня
end if
else
*pl "Вам не хватает денег."
! закрываем условие 1 уровня
end if
! закрываем действие
end act
Вообще, после ключевого слова end допускается, но не одобряется, запись любого текста. При этом игнорируется весь текст до следующей команды. Если команда записывается в той же строке, что и end, то эта команда должна стоять после амперсанда (&):
! открываем действие
act "Взять яблоко":
яблоко += 1
addobj "Яблоко"
! закрываем действие
end присутствие этого текста после end не одобряется & *pl "Новая команда"
Метки :
Метки — это особые синтаксические конструкции (а вернее меньше, чем конструкции, — синтаксемы), которые отмечают указанную строку кода и служат для быстрого перемещения к таким строкам с помощью оператора JUMP. Общая запись:
:[название метки]
, где [название метки] — теоретически любое сочетание символов, однако на практике желательно использовать лишь буквы, цифры, символы подчёркивания и пробелы. Перед двоеточием могут стоять символы пробелов и табуляции в любом количестве. Так же игнорируются прилегающие к названию метки символы пробелов и табуляций (однако ставить их не рекомендуется для удобства чтения кода).
! рекомендуемый вариант использования метки
jump 'метка'
! ...
:метка
! рабочий вариант с игнорированием прилегающих пробелов в метке
jump "метка с прилегающими пробелами"
! ...
: метка с прилегающими пробелами
! рабочий вариант с игнорированием прилегающих пробелов в jump
jump " метка с прилегающими пробелами "
! ...
:метка с прилегающими пробелами
Непосредственно после метки, в той же строке, через амперсанд (&) могут идти любые другие команды, однако так делать не рекомендуется.
! метка с командами после неё
jump 'markdown'
! ...
:markdown & *pl "вывожу текст" & ! комментарий
Метки не чувствительны к регистру:
jump "FoR"
! ...
:for
Оператор jump "видит" метки только внутри текущего блока кода. Иными словами метки локальны.
Метки с одинаковыми названиями могут располагаться на разных локациях (в разных блоках кода).
Если метки с одинаковыми названиями расположены в одном блоке кода, то все дублирующие метки, кроме самой первой, игнорируются плеером.
Отдельными блоками кода для меток считаются:
- код "Выполнить при посещении" конкретной локации (каждая локация — отдельный блок кода),
- код действия даже если действие добавлено программно,
- код в гиперссылке,
- код, передаваемый
DYNAMIC/DYNEVAL.
Метки внутри циклов относятся к тому же блоку кода, в котором расположен цикл.
Если действие добавлено программно, метки, размещённые в этом действии, становятся доступны из блока кода, в котором это действие было создано. Однако из действия невозможно совершить переход на метку, которая находится вне действия.
Случайные метки, то есть метки, на которые в текущем блоке кода нет перехода с помощью jump, просто игнорируются интерпретатором.
Амперсанд &
& — символ амперсанда служит для перечисления команд в одной строке. Общая запись:
[команда 1] & [команда 2] & ...
Данный символ не следует путать с операцией объединения строк (конкатенация), а использовать нужно с осторожностью.
Примеры:
*pl "Я сорвал с ветки яблоко." & addobj "Яблоко" & яблоко+=1
a = 3 & b = 7 & g = rand(1, 6) & ("26" & "27") & ! в скобках — конкатенация
Запятая ,
Запятая , в QSP используется для перечисления аргументов, передаваемых различным операторам и функциям:
rgb(25, 67, 250)
max(12, 45, 67, 89, 90, 122, 135, 168, 90)
addobj "Отвёртка", "img/screwdriver.png"
gosub "add_object", "Апельсин", 2, "Еда", 37
Так же запятая используется для перечисления значений в кортеже:
%personage = [26, 192, 85, 'Пётр', 'боксёр']
Круглые скобки ()
Круглые скобки () в QSP используются в трёх случаях:
-
В различных выражениях скобки повышают приоритет операций (операции в скобках выполняются в первую очередь):
! повышение приоритета арифметических операций
(256 + 789) * (789 - 256)
! повышение приоритета операций сравнения
if A = (A <> B): ... -
Если нужно передать функции более одного аргумента следует помещать всю группу аргументов в скобки:
rgb(25, 67, 250)
max(12, 45, 67, 89, 90, 122, 135, 168, 90)
rand(1, 1000)Будет хорошим тоном помещать даже один аргумент функции в скобки:
rand(999)Не будет осуждаться, хотя так обычно не делают, если в скобки помещать и группу аргументов к операторам:
showinput(0)
addobj("Отвёртка", "img/screwdriver.png")
gosub("add_object", "Апельсин", 2, "Еда", 37)
gosub("add_object", "Рек", rand(23, 45), "Артефакт", max(36, 67, 90, a)) -
Если нужно организовать кортеж:
%tuple = (123, 234, 'string')
%mass[23] = ('Петров', 'Пётр', 'Петрович')
Для организации кортежей рекомендуется использовать квадратные скобки.
%tuple = [123, 234, 'string']
%mass[23] = ['Петров', 'Пётр', 'Петрович']
Начиная с плееров версии 5.9.4 в скобках допустимы переносы на новую строку, что не будет разрывать выражение:
*pl (
45 +
68 +
73
)/3
Однако использовать комментарии внутри круглых скобок нельзя!