AngelScript Help

Выражения

https://www.angelcode.com/angelscript/sdk/docs/manual/doc_expressions.html

Выражение это комбинация из одной или нескольких переменных, функций и операторов, результатом интерпретации которого становится некоторое значение.

Интерпретация

С точки зрения интерпретатора любое выражение представляется как функция. Возьмём простейшее объявление и переменной с начальным значением:

int A = 1;

Опустив тип, для краткости повествования, интерпретатор выполнит две операции:

DECLARE(A); // Объявление переменной ASSIGN(A, 1); // Установка значения

Немного усложним пример:

int A = 1 + 3;

Операции будут выглядеть таким образом:

DECLARE(A); // Объявление переменной ASSIGN(A, ADD(1, 3)); // Установка значения

Как видите, набор операторов превращается в функции, аргументы которых зовутся операндами.

Приоритет

Возьмём предыдущий пример и уберём объявление:

A = 1 + 3;

Как видите, есть две операции:

  • A = 1

  • 1 + 3

Чтоб интерпретатору понять, как правильно подобрать функции существует приоритет, узнать который можно в соответствующей таблице. Оператор + имеет более высокий приоритет, посему он первым и превратится в функцию:

A = ADD(1, 3);

Вторым и заключительным действием для этого выражения будет обработка оператора =:

ASSIGN(A, ADD(1, 3));

Оператор скобки

Скобки просто возвращают содержащееся в них выражение:

A = (1); // 1
ASSIGN(A, PAREN(1)); // Parenthesis - круглые скобки

Это свойство скобок зачастую используется для смены порядка операторов:

A = 1 + 2 * 3; // 7 B = (1 + 2) * 3; // 9
ASSIGN(A, ADD(1, MUL(2, 3))); // Addition - сложение ASSIGN(B, MUL(ADD(1, 2), 3)); // Multiplication - умножение

Ассоциативность

Возьмём простой пример:

1 - 3 + 5;

У нас снова есть две операции:

  • 1 - 3

  • 3 + 5

Руководствоваться приоритетом в данном случае не получится, у операторов - и + он одинаков. В таком случае на помощь приходит ассоциативность, которая указана в соответствующей таблице. Для операторов в нашем примере она левая, то бишь они будут разобраны слева на право. Сначала вычитание:

DIV(1, 3) + 5; // Division - вычитание

Затем сложение:

ADD(DIV(1, 3), 5);

Рассмотрим так же правую ассоциативность на примере оператора =:

A = B = 5;

По традиции у нас есть две операции:

  • A = B

  • B = 5

Так как присваивание B правее, оно и будет первым:

ASSIGN(B, 5); ASSIGN(A, B);
Last modified: 24 May 2024