1. ИМЕНА И ВЫРАЖЕНИЯ

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

  1. Имена

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

имя : : = простое_имя

I символьный-литерал | знак_операции

I индексируемый_компонент I отрезок

I именуемый_компонент I атрибут

простое_имя : : = идентификатор

префикс : : = имя | вызов_функции

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

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

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

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

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

  • Тип префикса - ссылочный тип, который указывает на рассматривае­мый тип.

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

.


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

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

  • -

    ПИ

    ПРЕДЕЛ СЧЕТ ПУЛЬТ МАТРИЦА СЛУЧАЙНОЕ ОШИБКА

    простое имя числа (см. 3.2.2)
  • - простое имя константы (см. 3.2.1)

  • -простое имя скалярной переменной (см. 3.2.1)

  • - простое имя массива (см. 3.6.1)

  • - простое имя типа (см. 3.6)

  • - простое имя функции (см. 6.1)

  • - протое имя исключения (см. 11.1)

4.1.1.Индексируемые компоненты

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

индексируемый компонент : : = префикс (выражение ■£, выражение})

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

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

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

-

МОЕ_РАСПИСАНИЕ (СБ)

СТРАНИЦА (10)

ПУЛЬТ (М, К+1)

СТРАНИЦА (10) (20)

- компонент одномерного массива (см. 3.6.1)
  • - компонент одномерного массива (см. 3.6)

  • - компонент двумерного массива (см. 3.6.1)

  • - компонент компонента (см. 3.6)

ЗАПРОС (СРЕДА) - - вход семейства входов (см. 9.5)

СЛЕДУЮЩЕЕ_ОБРАМЛЕНИЕ (Л), (М,Н) --компонент вызова функции (см. 6.1)

Примечание к примеру. Для компонентов многомерных массивов (таких как ПУЛЬТ) и массива массивов (таких как СТРАНИЦА) используются различные обо­значения. Компонентами массива массивов являются массивы, и они могут быть ин­дексированы. Так, СТРАНИЦА (10) (20) обозначает двадцатый компонент массива СТРАНИЦ (10). В последнем примере СЛЕДУЮЩЕЕ .ОБРАМЛЕНИЕ (Л) - вызов функции, возвращающий ссылочное значение, указывающее двумерный массив.

  1. О т р е з к и

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

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

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

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

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

ЗВЕЗДОЧКИ (1. .15) - - отрезок из 15 символов (см. 3.6.3)

СТРАНИЦА (10. .1О+РАЗМЕР)

  • - отрезок из 1+РАЗМЕР компонентов (см. 3.6 и 3.2.1)

СТРАНИЦА (Л) (А. .В) - - отрезок массива СТРАНИЦА (Л) (см. 3.6)

ЗВЕЗДОЧКИ (1. .0) --пустой отрезок (см. 3.6.3)

МОЕ_РАСПИСАНИЕ (ДЕНЬ НЕДЕЛИ)

  • - границы задаются подтипом (см. 3.6 и 3.5.1)

ЗВЕЗДОЧКИ (5. .15) (К)

  • - то же, что ЗВЕЗДОЧКИ (К), если К в диапазоне 5. .15 (см. 3.6)

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

  1. И м е н у е м ы е компоненты

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

именуемый_компонент: : = префикс, постфикс

постфикс : : = простое_имя I символьный_литерал

I знак_операции | all

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ЗАВТРА.МЕСЯЦ - - компонент записи (см. 3.7)

СЛЕДУЮЩИЙ_АВТО.ВЛАДЕЛЕЦ -- компонент записи (см. 3.8.1)

СЛЕДУЮЩИЙ-АВТО.ВЛАДЕЛЕЦ.ВОЗРАСТ - - компонент записи (см. 3.8.1)

ПИШУЩЕЕ УСТРОЙСТВО.МОДУЛЬ - - компонент записи (дискриминант) (см.

--компонент записи (дискриминант) (см. 3.7.3)

МИН_ЯЧЕЙКА (Н) .ЗНАЧЕНИЕ - - компонент записи результата

- - вызова функции (см. 6.1 и 3.8.1)

УПРАВЛЕНИЕ.ЗАХВАТИТЬ - - вход задачи УПРАВЛЕНИЕ (см. 9.1 и 9.2)

ПУЛ (К) . ПИСАТЬ--вход задачи ПУЛ (К) (см. 9.1 и 9.2)

СЛЕДУЮЩИЙ_АВТО. all - - объект, указанный ссылочной перемен-

- - ной СЛЕДУЮЩИЙ-АВТО (см. 3.8.1)

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

УПРАВЛЕНИЕ-ТАБЛИЦЕЙ. ВНЕСТИ

  • - процедура видимого раздела пакета (см. 7.5)

УПРАВЛЕНИЕ_ПО_КЛЮЧУ. ”<”- - операция видимого раздела пакета (см. 7.4.2)

СК АЛ ^ПРОИЗВЕДЕНИЕ. СУ ММ А

  • - переменная, описанная в теле процедуры (см. 6.5)

БУФЕР.ПУЛ -- переменная, описанная в заданном модуле (см. 9.12)

БУФЕР.ЧИТАТЬ - - вход заданного модуля (см. 9.12)

ОБМЕН.РАБОЧАЯ_ЯЧЕЙКА -- переменная оператора блока (см. 5.6)

STANDARD.BOOLEAN - - имя предопределенного типа (см. 8.6 - - и обязательное приложение 3)

Примечание. Для записей, компонентами которых являются другие записи, пере­численные правила означают, что простое имя должно быть дано для каждого уровня имени подкомпонента. Например, имя СЛЕДУЮЩИЙ_АВТО.ВЛАДЕЛЕЦ.ВОЗРАСТ. МЕСЯЦ не может быть укорочено (СЛЕДУЮЩИЙ_АВТО.ВЛАДЕЛЕЦ.МЕСЯЦ недо­пустимо) .

4.1.4. А т р и б у т ы

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

атрибут : : — префикс'обозначение_атрибута

обозначение_атрибута : : =

простое_имя [ (универсальное ^статическое ]

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

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

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

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

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

UBET'FIRST - - минимальное значение перечислимого типа ЦВЕТ (см. 3.3.1 и 3.5)


РАДУГА'BASE'FIRST - - то же, что и атрибут IJBET'FIRST (см. 3.3.2 и 3.3.3) BEIUECTB'DIGITS - - точность типа ВЕЩЕСТВ (см. 3.5.7 и 3.5.8) ПУЛЬТ'ЕА8Т(2)

  • - верхняя граница диапазона 2-го индекса для ПУЛЬТ (см. 3.6.1 и 3.6.2) nynbT’RANGE (1) - - диапазон первого индекса для ПУЛЬТ (см. 3.6.1 и 3.6.2) ПУЛ (К) 'TERMINATED - - TRUE, если задача ПУЛ (К) завершена (см. 9.2 и 9.9) HATA'SIZE - - количество битов для записи типа ДАТА (см. 3.7 и 13.7.2) СООБ ЩЕНИЕ'ADDRESS

  • - адрес переменной СООБЩЕНИЕ именуемого типа (см. 3.7.2 и 13.7.2)

4.2. Литералы

Литерал — это либо числовой литерал, либо литерал перечисления, либо литерал null, либо строковый литерал, либо символьный литерал. Вычисле­ние литерала вырабатывает соответствующее значение.

Числовые литералы — это литералы типов универсальный _целый к уни­версальный ^вещественный. Литералы перечисления включают символьные литералы и вырабатывают значения соответствующих перечислимых типов. Литерал null вырабатывает пустое ссылочное значение, которое не указыва­ет ни на какой объект вообще.

Строковый литерал — это базовая операция, которая преобразует по­следовательность символов в значение одномерного массива с компонента­ми символьного типа; границы этого массцва определяются в соответствии с правилами для позиционных агрегатов массива (см. 4.3.2). Для пустого строкового литерала верхняя граница массива является предшественником нижней границы, выдаваемой атрибутом PRED. Вычисление пустого строко­вого литерала возбуждает исключение CONSTRAINT-ERROR, если нижняя граница не имеет предшественника (см. 3.5.5).