Выражения
Выражение - это комбинация операторов-свойств и параметров. При вычислении выражения последовательно в порядке приоритетов выполняются все операторы.
Значением выражения будем называть возвращаемое значение свойства, получившегося в результате выполнения операторов, либо значение параметра, если выражение являлось одиночным параметром.
Выражение можно описать набором следующих рекурсивных правил:
| Правило | Описание |
|---|---|
expression := parameter | constant | prefixOperator | Одиночный параметр, константа или префиксный неарифметический оператор |
expression := prefixArithmOp expression | Унарный префиксный арифметический оператор, с переданным ему в качестве операнда выражением |
expression := expression postfixOp | Унарный постфиксный оператор, с переданным ему в качестве операнда выражением |
expression := expression binaryOp expression | Бинарный оператор с переданными ему в качестве операндов выражениями |
expression := ( expression ) | Выражение в круглых скобках |
В состав выражения не могут входить контекстно-независимые операторы-свойства.
Использование действий внутри выражений
Внутри тела действия в выражении в качестве свойства может также выступать вызов действия, возвращающего результат. В этом случае в скобках сначала указываются значения входных параметров действия, а затем — новые локальные параметры, которые становятся именами параметров результата и могут использоваться дальше в выражении.
Такой вызов эквивалентен последовательному выполнению:
- создание локального свойства с сигнатурой результата действия;
- вызов действия с записью результата в это локальное свойство;
- подстановка этого локального свойства в выражение.
Использование вызовов действий в выражениях допустимо только внутри тела действия.
Примеры
CLASS Team;
wins(team) = DATA INTEGER(Team);
ties(team) = DATA INTEGER(Team);
// Количество очков, полученное командой за сыгранные матчи
points(Team team) = wins(team) * 3 + ties(team);
// В данном случае выражение записано справа от знака равенства. Оно определяет новое свойство points.
// При вычислении выражения сначала выполнятся два оператора JOIN: wins(team) и ties(team), подставив
// параметр team в свойства wins и ties. Затем выполнится оператор умножения, который построит свойство,
// возвращающее число, равное произведению возвращаемого значения wins(team) и числа 3. Затем выполнится
// оператор сложения, который создаст свойство, суммирующее возвращаемые значения (wins(team) * 3) и ties(team).
// Получившееся свойство и будет являться результатом выполнения выражения.
CLASS Game;
CLASS BonusGame : Game;
// Количество очков за игру. Если игра бонусная, то 3, иначе 2.
gamePoints(Game game) = 2 (+) (1 IF game IS BonusGame);
// В данном примере порядок выполнения операторов будет такой: IS, IF, (+)
CLASS Item;
price(Item i) = DATA INTEGER (Item);
label(Item i) = DATA STRING[100] (Item);
priceBucket (INTEGER p) {
IF p > 1000 THEN RETURN 'high';
IF p > 100 THEN RETURN 'mid';
RETURN 'low';
}
// вызов действия priceBucket внутри выражения в теле другого действия
labelItem (Item i) {
label(i) <- 'Bucket: ' + priceBucket(price(i));
}