Глава 4. ИМЕНА И ВЫРАЖЕНИЯ

Содержание

4.1. ИМЕНА
4.2. ЛИТЕРАЛЫ
4.3. АГРЕГАТЫ
4.4. ВЫРАЖЕНИЯ
4.5. ОПЕРАЦИИ И ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ
4.6. ПРЕОБРАЗОВАНИЕ ТИПА
4.7. КВАЛИФИЦИРОВАННЫЕ ВЫРАЖЕНИЯ
4.8. ГЕНЕРАТОРЫ
4.9. СТАТИЧЕСКИЕ ВЫРАЖЕНИЯ И СТАТИЧЕСКИЕ ПОДТИПЫ
4.10. УНИВЕРСАЛЬНЫЕ ВЫРАЖЕНИЯ

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

4.1. ИМЕНА

Имена могут обозначать понятия, описанные явно или неявно (см. 3.1). Имена могут обозначать также объекты, указанные ссылочными значениями, подкомпоненты и отрезки объектов и значений, одиночные входы, семейства входов и входы семейства входов. Наконец, имена могут обозначать атрибуты этих понятий и объектов.

имя ::= простое-имя     | символьный-литерал       | знак-операции     | индексируемая-компонента | отрезок     | именуемая-компонента     | атрибутпростое-имя ::= идентификаторпрефикс ::= имя | вызов-функции

Простое имя понятия — это либо идентификатор, связанный с понятием описанием, либо другой идентификатор, связанный с понятием описанием переименования.

Определенные формы имени (индексируемые и именуемые компоненты, отрезки и атрибуты) включают в себя префикс, который может быть именем или вызовом функции. Если тип префикса — ссылочный тип, то префикс не должен быть именем, которое обозначает формальный параметр вида out или его подкомпоненту.

Если префикс имени — вызов функции, то имя обозначает компоненту, отрезок, вход или семейство входов результата вызова функции либо (если результат — ссылочное значение) объект, указанный результатом.

Говорят, что префикс соответствует некоторому типу в одном из следующих случаев:

• Тип префикса — это рассматриваемый тип.

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

Вычисление имени, имеющего префикс, включает в себя вычисление префикса, т. е. соответствующего имени или вызова функции. Если тип префикса — ссылочный тип, то вычисление префикса включает в себя определение объекта, указанного соответствующим ссылочным значением; если значение префикса является пустым ссылочным значением, исключая случай префикса атрибута представления (см. 13.7.2), то возбуждается исключение CONSTRAINED-ERROR (см. 13.7.2).

Примеры простых имен:

Pl

- - простое имя числа

(см. 3.2.1)

LIMIT

- - простое имя константы

(см. 3.2.1)

COUNT

- - простое имя скалярной переменной

(см. 3.2.1)

BOARD

- - простое имя массива

(см. 3.6.1)

MATRIX

- - простое имя типа

(см. 3.6)

RANDOM

- - простое имя функции

(см. 6.1)

ERROR

- - простое имя исключения

(см. 11.1)

Ссыпки: атрибут 4.1.4, вид 6.1, возбуждение исключения 11, .вход 9.5, вызов функции o.t, вычисление 4.5, знак операции 6.1, идентификатор 2.3, именуемая компонента 4.1.3, индексируемая компонента 4.1.1, исключение CONSTRAINT-ERROR 11.1, компонента 3.3, объект 3.2.1,описание 3.1, описание переименования 8.5, отрезок 4.1.2, подкомпонента 3.3, понятие 3.1, принадлежит типу 3.3, ссылочное значение null 3.8, семейство входов 9.5, символьный литерал 2.5, ссылочное значение 3.8, ссылочный тип 3.8, тип 3.3, формальный параметр 6.1, указанный тип 3.8, указывать 3.8.

4.1.1. ИНДЕКСИРУЕМЫЕ КОМПОНЕНТЫ

Индексируемая компонента обозначает компоненту массива или вход семейства входов.

индексируемая-компонента ::= префикс(выражение (, выражение))

Для компонент массива тип префикса должен соответствовать индексируемому типу. Значения индексов компоненты задаются выражениями, каждой позиции индекса должно соответствовать одно такое выражение. Для входа семейства входов префикс должен быть именем, которое обозначает семейство входов задачного объекта, а выражение (оно должно, быть только одно) задает значение индекса конкретного входа.

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

Примеры индексируемых компонент:

MY-SCHEDULEtSAT)

- - компонента одномерного массива

(см. 3.6.1)

РАПЕ(10)

- - компонента одномерного массива

(см. 3.6)

BOARD(M, J + 1)

- - компонента двумерного массива

(см. 3.6.1)

PAGE(10) (20)

- - компонента компоненты

(см. 3.6)

REQUESTfMEDIUM)

-- вход семейства входов

(см. 9.5)

NEXT_FRAME(L) (M, N)

- - компонента вызова функции

(CM. 6.1)

Примечание к примеру. Для компонент многомерных массивов (таких, как BOARD) и массива массивов (таких, как PAGE) используются различные обозначения. Компонентами массива массивов являются массивы, и они могут быть индексированы. Так, РАGЕ(10) (20) задает двадцатую компоненту массива РАGЕ(10). В последнем примере NEXT_FRAME(L) — вызов функции, возвращающей ссылочное значение, указывающее двумерный массив.

Ссылки: возбуждение исключения 11, возвращаемое значение 5.8, 6.5, вход 9.5, вызов функции 6.4, выражение 4.4, вычисление 4.5, имя 4.1, индекс 3.6, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента 3.3, компонента массива 3.6, объект задачного типа 9.2, префикс 4.1, размерность 3.6, семейство входов 9.5, соответствует типу 4.1.

4.1.2. ОТРЕЗКИ

Отрезок обозначает одномерный массив нескольких последовательных компонент одномерного массива. Отрезок переменной — переменная, отрезок константы — константа, отрезок значения — значение.

отрезок ::= префикс(дискретный-диапазон)

Префикс отрезка должен соответствовать одномерному индексируемому типу. Тип отрезка — это базовый тип этого индексируемого типа. Границы дискретного диапазона определяют границы отрезка и должны быть того же типа, что и тип индекса; отрезок является пустым, т. е. обозначает пустой массив, если дискретный диапазон является пустым.

Порядок вычисления префикса и дискретного диапазона при вычислении имени отрезка в языке не определяется. Если при вычислении отрезка хотя бы одна из границ дискретного диапазона не принадлежит диапазону индексов, определяемому префиксом отрезка, то (кроме случая пустого отрезка) возбуждается исключение CONSTRAINT_ERROR. (Границы пустого отрезка могут не принадлежать подтипу индекса.)

Примеры отрезков:

SТАRS(1..15)

- - отрезок из 15 символов

(см. 3.6.3)

РАGЕ(10..10 + SIZE)

- - отрезок из (1 + SIZE) компонент

(см. 3.6 и 3.2.1)

РАGЕ(L) (А..В)

- - отрезок массива РАОЕ(1)

(см. 3.6)

SТАRS(1..0)

- - пустой отрезок

(см. 3.6.3)

MY_SCHEDULE(WEEKDAY)

- - границы задаются подтипом

(см. 3.6 и 3.5.1)

SТАRS(5..15) (К)

- - аналогично SТАRS(К), если К

- - в диапазоне 5..15

(см. 3.6)

Примечание. Для одномерного массива А имя A(N..N) задает отрезок, состоящий из одной компоненты; его тип соответствует базовому типу массива А. С другой стороны, A(N) — компонента массива и имеет соответствующий тип.

Ссылки: базовый тип 3.3, возбуждение исключения 11, вычисление 4.5, граница дискретного диапазона 3.6.1, диапазон индекса 3.6, дискретный диапазон 3.6, значение массива 3.8, имя 4.1, индекс 3.6, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента 3.3, константа 3.2.1, массив 3.5, ограничение 3.3, переменная 3.2.1, префикс 4.1, принадлежит подтипу 3.3, пустой диапазон 3.5, пустой массив 3.6.1, размерность 3.6, соответствует типу 4.1, тип 3.3, тип компоненты 3.3.

4.1.3. ИМЕНУЕМЫЕ КОМПОНЕНТЫ

Именуемые компоненты используются для обозначения компонент записей, входов, семейств входов и объектов, указанных ссылочными значениями; они используются также в качестве расширенных имен, как это описано ниже.

именуемая-компонента ::= префикс.постфикспостфикс ::= простое-имя | символьный-литерал         | знак-операции | all

Для обозначения дискриминанта, компоненты записи, входа или объекта, указанного ссылочным значением, используются следующие четыре формы именуемых компонент:

а. Дискриминант.

Постфикс должен быть простым именем, обозначающим дискриминант объекта или значения. Префикс должен соответствовать типу этого объекта или значения.

б. Компонента записи.

Постфикс должен быть простым именем, обозначающим компоненту именуемого объекта или значения. Префикс должен соответствовать типу этого объекта или значения. Для компонент варианта делается проверка: являются ли значения дискриминантов такими, что запись имеет эту компоненту. В противном случае возбуждается исключение CONSTRAINT_ERROR.

в. Одиночный вход или семейство входов задачи.

Постфикс должен быть простым именем, обозначающим одиночный вход или семейство входов задачи. Префикс должен соответствовать типу этой задачи.

г. Объект, указанный ссылочным значением.

Постфикс должен быть зарезервированным словом аll. Значение префикса должно принадлежать ссылочному типу.

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

д. Понятие, описанное в видимом разделе описания пакета.

Префикс должен обозначать пакет. Постфикс должен быть простым именем, символьным литералом или знаком операции понятия.

е. Понятие, описание которого находится непосредственно в поименованной конструкции.

Префикс должен обозначать конструкцию, т. е. программный модуль, оператор блока, оператор цикла или оператор принятия. Для оператора принятия префикс должен быть либо простым именем входа или семейства входов, либо расширенным именем, заканчивающимся таким простым именем (т. е. не допускается индекс). Постфикс должен быть простым именем, символьным литералом или знаком операции такого понятия, чье описание находится непосредственно в конструкции.

Данная форма расширенного имени допустима только в самой конструкции (включая тело и любые субмодули в случае программного модуля). Не допускается использование в качестве префикса имен, описанных с помощью описания переименования. Если префикс — это имя подпрограммы или оператора принятия и если существует более одной видимой объемлющей подпрограммы или оператора принятия с таким именем, то расширенное имя не определено, независимо от постфикса.

Если в соответствии с правилами видимости возможна по крайней мере одна интерпретация префикса именуемой компоненты как имени объемлющей подпрограммы или оператора принятия, то рассматриваются только те интерпретации, которые соответствуют правилу е, т. е. расширенные имена. (Интерпретация префикса как вызова функции не рассматривается).

Вычисление имени, являющегося именуемой компонентой, включает вычисление префикса.

Примеры именованных компонент:

TOMORROW.MONTH       -- компонента записи (см. 3.7)NEXT_CAR.OWNER       -- компонента записи (см. 3.8.1)NEXT_CAR.OWNER.AGE   -- компонента записи (см. 3.8.1)WRITER.UNIT          -- компонента записи (дискриминант) (см. 3.7.3)MIN_CELL(H).VALUE    -- компонента записи результата                     -- вызова функции (см. 6.1 и 3.8.1)CONTROL.SEISE        -- вход задачи CONTROL (см. 9.1 и 9.2)РOOL(К).WRIТЕ        -- вход задачи РООЦК) (см. 9.1 и 9.2)NEXT_CAR.all         -- объект, указанный ссылочной пере-                     -- менной NEXT-CAR (см. 3.8.1)

Примеры расширенных имен:

TABLE_MANAGER.INSERT -- процедура видимого раздела пакета (см. 7.5)КЕY_МАNАGЕR."<"      -- операция видимого раздела пакета (см. 7.4.2)DOT_PRODUCT.SUM      -- переменная, описанная в теле процедуры (см. 6.5)BUFFER.POOL          -- переменная, описанная в задачном модуле (см. 9.12)BUFFER.READ          -- вход задачного модуля (см. 9.12)SWAP.TEMP            -- переменная оператора блока (см. 5.6)STANDARD.BOOLEAN     -- имя предопределенного типа (см. 8.6 и приложение С)

Примечание. Для записей, компонентами которых являются другие записи, перечисленные правила означают, что простое имя должно быть дано для каждого уровня имени подкомпоненты. Например, имя NEXT_CAR.OWNER.BIRTH.MONTH не может быть укорочено (имя NEXT_CAR.OWNER.MONTH недопустимо).

Ссылки: вариант 3.7.3, видимость 8.3, видимый раздел 3.7.3, возбуждение исключений 11, вход 9.5, вызов функции 6.4, дискриминант 3.3, задача 9, задачный модуль 9, запись 3.7, зарезервированное слово 2.9, знак операции 6.1, именуемая компонента 3.7, индекс 3.6, исключениеCONSTRAINT_ERROR 11.1, компонента записи 3.7, непосредственно входит в 8.1, объект 3.2.1, объект задачного типа 9.2, оператор блока 5.6, оператор принятия 9.5, оператор цикла 5.5, операция 4.5, описание 3.1, описание переименования 8.5, пакет 7, переменная 3.7.3, подпрограмма 6, понятие 3.1, предопределенный тип С, префикс 4.1, программный модуль 6, простое имя 4.1, семейство входов 9.5, символьный литерал 2.5, совмещение 8.3, соответствует типу 4.1, субмодуль 10.2, ссылочное значение 3.8, ссылочный тип 3.8, тело программного модуля 3.9, тело процедуры 6.3, указывать 3.8.

4.1.4. АТРИБУТЫ

Атрибут обозначает базовую операцию над понятием, задаваемым префиксом.

атрибут ::= префикс'обозначение-атрибутаобозначение-атрибута :: =          простое-имя [(универсальное_статическое_выражение)]

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

Определенные в языке атрибуты приведены в приложении А. Конкретная реализация может ввести дополнительные атрибуты, описание которых должно быть дано в приложении F. Обозначения таких атрибутов должны отличаться от обозначений атрибутов, определенных в языке.

Вычисление имени, являющегося атрибутом, состоит из вычисления префикса.

Примечание. Обозначения атрибутов DIGITS, DELTA и RANGE им&ют идентификаторы, совпадающие с зарезервированными словами. Однако неоднозначность устранится, если перед обозначением атрибута будет стоять апостроф. Единственными предопределенными обозначениями атрибутов, содержащими универсальное выражение, являются те, которые соответствуют некоторым определенным операциям типа над индексируемыми типами (см. 3.6.2).

Примеры атрибутов:

COLOR'FIRST         -- минимальное значение перечислимого типа                     -- COLOR                                    (см. 3.3.1 и 3.5)   RAINBOW'BASE'FIRST  -- то же, что и атрибут COLOR'FIRST         (см. 3.3.2 и 3.3.3) REAL'DIGITS         -- точность типа REAL                       (см. 3.5.7 и 3.5.8) BOARD'LAST(2)       -- верхняя граница диапазона 2-го индекса                                           -- для BOARD                                (см. 3.6.1 и 3.6.2) BOARD'RANGE(1)      -- диапазон первого индекса для BOARD       (см. 3.6.1 и 3.6.2) POOL(K).TERMINATED  -- TRUE, если задача РООL(К) завершена      (см. 9.2 и 9.9)     DATA'SIZE           -- количество битов под записи типа DATA    (см. 3.7 и 13.7.2)  MESSAGE'ADDRESS     -- адрес переменной MESSAGE именуемого типа (см. 3.7.2 и 13.7.2)

Ссылки: базовая операция 3.3.3, зарезервированное слово 2.9, имя 4.1, описанное понятие 3.1, префикс 4.1, простое имя 4.1, соответствует типу 4.1, статическое выражение 4.9, тип 3.3, универсальное выражение 4.10.