- •0. Оглавление
- •1.2. Соглашения об обозначениях
- •2) Описания
- •1.5. Выражения
- •5) Аддитивные операторы
- •1) Оператор-выражение
- •2) Составной оператор
- •3) Условный оператор
- •Атрибутная грамматика
- •Семантические процедуры
- •2.2. Подграмматика описаний
- •Атрибутная грамматика
- •Семантические процедуры
- •2.3. Основная грамматика
- •Атрибутная грамматика
- •Семантические процедуры
- •Приложение 1. Таблицы лексем
- •Приложение 2. Описания триад
2) Описания
Описаниями специфицируется то, каким образом интерпретируется каждый идентификатор.
описание: [const] спецификатор_типа иниц_описатель { , иниц_описатель}
иниц_описатель: описатель описатель = инициализатор
спецификатор_типа: int double vector [ выражение ] limited-спецификатор typedef-имя
Выражение в квадратных скобках после ключевого слова vector задаёт размерность. Максимальная размерность вектора – 8100.
Ограниченный тип – целый тип, значения которого лежат в заданном интервале.
limited-спецификатор: limited { левая_граница .. правая_граница }
Например, если переменная y2k объявлена как limited {1990..2000} y2k, она сможет принимать целые значения от 1990 до 2000 включительно.
описатель: идентификатор описатель [ без_знака ]
Беззнаковое число в квадратных скобках обозначает количество элементов массива. Допускаются многомерные массивы; максимальная размерность массива – 16.
Инициализаторы позволяют давать начальные значения переменным.
инициализатор: выражение { инициализатор { , инициализатор } }
Собственные типы можно определять при помощи описания typedef.
typedef-описание: typedef спецификатор_типа typedef-имя
typedef-имя: идентификатор
1.5. Выражения
выражение: выражение_присваивания
Приоритеты описываемых операторов имеют тот же порядок, что и подразделы данного параграфа. Например, для оператора +, описанного в 5), термин "операнды" означает "выражения, определённые в 1)-5)". В каждом разделе описываются операторы одного приоритета и указывается их ассоциативность.
1) Первичные выражения
первичное_выражение: идентификатор константа ( выражение )
2) Постфиксные выражения
В постфиксных выражениях операторы выполняются слева направо.
постфиксное_выражение: первичное_выражение постфиксное_выражение [ выражение ]
Постфиксное выражение, за которым следует выражение в квадратных скобках – ссылка на элемент массива или вектора. Тип результата соответствует типу элемента массива или вектора.
3) Унарные операторы
Выражения с унарными операторами выполняются справа налево.
унарное_выражение: постфиксное_выражение len ( идентификатор_вектора ) унарный_оператор унарное_выражение
унарный_оператор: + - !
Оператор len возвращает евклидову норму вектора – квадратный корень суммы квадратов вектора.
4) Мультипликативные операторы
Мультипликативные операторы *, / и % выполняются слева направо.
мультипликативное_выражение: унарное_выражение мультипликативное_выражение * унарное_выражение мультипликативное_выражение / унарное_выражение
Бинарный оператор * означает умножение, / - деление. Если оба операнда оператора * - векторы, результатом является их скалярное произведение (тип – double). Если один операнд оператора * - вектор, а другой – число, результатом является вектор, полученный из исходного умножением каждого элемента на число. Вектора не могут участвовать в качестве операндов оператора /.
5) Аддитивные операторы
Аддитивные операторы + и – выполняются слева направо.
аддитивное_выражение: мультипликативное_выражение аддитивное_выражение + мультипликативное_выражение аддитивное_выражение - мультипликативное_выражение
Результат выполнения оператора + есть сумма его операндов. Число можно складывать с числом, вектор с вектором, другие комбинации недопустимы. Аналогичное правило распространяется на оператор -.
6) Операторы отношения
Операторы отношения выполняются слева направо.
выражение_отношения: выражение_отношения < аддитивное_выражение выражение_отношения > аддитивное_выражение выражение_отношения <= аддитивное_выражение выражение_отношения >= аддитивное_выражение выражение_отношения == аддитивное_выражение выражение_отношения != аддитивное_выражение
Операторы отношения возвращают 0, если специфицируемое выражение ложно, и 1, если оно истинно. Тип результата – int.
7) Оператор логического И
Операторы && выполняются слева направо. Если оба операнда не равны нулю, возвращается 1, в противном случае – 0.
И-выражение: выражение_отношения И-выражение && выражение_отношения
8) Оператор логического ИЛИ
Операторы || выполняются слева направо. Если хотя бы один операнд не равен нулю, возвращается 1, в противном случае – 0.
ИЛИ-выражение: И-выражение ИЛИ-выражение || И-выражение
9) Выражение присваивания
Операторы присваивания выполняются справа налево.
выражение_присваивания: ИЛИ-выражение постфиксное_выражение = выражение_присваивания
Операторы присваивания в качестве левого операнда требуют l-value, при чём модифицируемого, то есть оно не может быть массивом. Типы левого и правого операндов должны совпадать. Результат выражения присваивания – значение его левого операнда после завершения присваивания.
1.6. Операторы
За исключением особо оговоренных случаев, операторы выполняются в том порядке, в котором они описаны. Операторы не имеют значений и выполняются, чтобы произвести определённые действия.
оператор: метка: { метка: } оператор_без_метки
оператор_без_метки: оператор-выражение составной_оператор условный_оператор оператор_цикла оператор_перехода оператор_ввода оператор_вывода
Метка состоит из идентификатора и одновременно является объявлением этого идентификатора. У меток своё пространство имён и они не конфликтуют с другими идентификаторами.