Введение

Понятие о приоритете операторов

В языках программирования, научных калькуляторах и аналогичных системах обозначения операторов или грамматике операторов – это способ определения и анализа математических и других формальных выражений. В этой модели линейная последовательность токенов разделяется на два класса: операторы и операнды. Операнды – это объекты, над которыми выполняются операции. К ним относятся литеральные числа и другие константы, а также идентификаторы (имена), которые могут представлять всё, от простых скалярных переменных до сложных агрегированных структур и объектов, в зависимости от сложности и возможностей языка, а также контекста использования. Особым типом операнда является группа в скобках. Выражение, заключенное в скобки, обычно рекурсивно вычисляется, чтобы рассматриваться как единый операнд на следующем уровне вычисления. Каждому оператору присваивается позиция, приоритет и ассоциативность. Приоритет оператора – это число (от высокого к низкому или наоборот), которое определяет, какой оператор принимает операнд, окруженный двумя операторами с разным приоритетом. Умножение обычно имеет более высокий приоритет, чем сложение, например, 3 + 4 × 5 = 3 + (4 × 5) ≠ (3 + 4) × 5. С точки зрения позиции оператора, он может быть префиксным, постфиксным или инфиксным. Префиксный оператор непосредственно предшествует своему операнду, как в −x. Постфиксный оператор непосредственно следует за своим операндом, как, например, x!. Инфиксный оператор расположен между левым и правым операндами, как в x + y. Некоторые языки, особенно семейство синтаксиса C, расширяют эту общепринятую терминологию и говорят также о троичных инфиксных операторах (a ? b : c). Теоретически даже возможно (но не обязательно практически целесообразно) определить скобки как унарную бификсную операцию.

Обобщения обозначения общего оператора

Использование классов приоритета операторов и ассоциативности – это лишь один из подходов. Однако это не самый общий подход: данная модель не позволяет присвоить оператору более высокий приоритет при сравнении с «−», чем при сравнении с «+», сохраняя при этом эквивалентные приоритеты и ассоциативность для «+» и «−». Обобщённая версия этой модели, в которой каждому оператору можно задать независимые левый и правый приоритеты, доступна по адресу .