Выражения являются комбинациями операторов, операндов и вызовов функций, которые вычисляются для получения некоторого значения.
Синтаксис: | |||
216 | expression = simple_expression [ rel_op_extended simple_expression ] . | ||
283 | rel_op_extended = rel_op | IN | LIKE . | ||
282 | rel_op = ' < ' | ' > ' | ' <= ' | ' >= ' | ' <> ' | ' = ' | ' :<>:' | ' :=: ' . | ||
305 | simple_expression = term { add_like_op term } . | ||
325 | term = factor { multiplication_like_op factor } . | ||
217 | factor = simple_factor [ ' ** ' simple_factor ] . | ||
306 | simple_factor = aggregate_initializer | entity_constructor | | ||
enumeration_reference | interval | query_expression | | |||
331 | unary_op = ' + ' | ' - ' | NOT . | ||
269 | primary = literal | (qualifiable_factor { qualifier } ) . | ||
257 | multiplication_like_op = ' * ' | ' / ' | DIV | MOD | AND | ' | | ' . | ||
168 | add_like_op = ' + ' | ' - ' | OR | XOR . |
Некоторым операторам требуется один операнд, а другим - два операнда. Оператор, которому требуется только один операнд, должен располагаться перед своим операндом. Оператор, которому требуются два операнда, должен располагаться между своими операндами. В данном разделе определены операторы и установлены типы данных операндов, которые могут использоваться каждым оператором.
Существует семь классов операторов:
a) Арифметические операторы принимают числовые операнды и выдают числовые результаты. Тип данных значения результата арифметического оператора зависит от оператора и типов данных операндов (см. 12.1).
b) Операторы отношения принимают в качестве операндов разные типы данных и выдают результаты, имеющие тип данных LOGICAL (TRUE, FALSE или UNKNOWN).
c) Двоичные операторы принимают операнды типа данных BINARY и выдают результаты, имеющие тоже тип данных BINARY.
d) Логические операторы принимают операнды типа данных LOGICAL и выдают результаты, имеющие тоже тип данных LOGICAL.
e) Строковые операторы принимают операнды типа данных STRING и выдают результаты, имеющие тоже тип данных STRING.
f) Агрегированные операторы комбинируют агрегированные значения с другими агрегированными значениями или с отдельными элементами разными способами и выдают результаты агрегированного типа.
g) Ссылочные и индексные операторы извлекают компоненты из экземпляров объектов и агрегированных значений.
Вычисление выражений осуществляется в соответствии с приоритетом входящих в выражение операторов.
Значение выражения, заключенного в круглые скобки, вычисляется до того, как оно будет трактоваться как единый операнд.
Процесс вычисления осуществляется слева направо, при этом операторы с более высоким приоритетом вычисляются первыми. Правила приоритетов для всех операторов языка EXPRESS установлены в таблице 10. Операторы в одной строке имеют одинаковый приоритет, а строки упорядочены по уменьшению приоритета.
Таблица 10 - Приоритет операторов
Приоритет | Описание | Операторы |
1 | Ссылки на элементы | [ ] . \ |
2 | Унарные операторы | + - NOT |
3 | Возведение в степень | ** |
4 | Умножение/деление | * / DIV MOD AND | | |
5 | Сложение/вычитание | - + OR XOR |
6 | Отношение | = <> <= >= < > :=: :<>: IN LIKE |
Примечание - | | является оператором построения сложного объекта. |
Операнд, расположенный между двумя операторами, имеющими разные приоритеты, относится к оператору, имеющему более высокий приоритет. Операнд, расположенный между двумя операторами с одинаковым приоритетом, относится к оператору, расположенному слева.
Пример - Выражение -10**2 вычисляется как (-10)**2, давая в результате значение 100. Выражение 10/20*30 вычисляется как (10/20)*30, давая в результат значение 15.0.