ИМЕНА И ВЫРАЖЕНИЯ
В этой главе приведены правила, применяемые к различным формам имен и выражений, а также при их вычислении.
Имена
Имена могут обозначать понятия, описанные явно или неявно (см. 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). В последнем примере СЛЕДУЮЩЕЕ .ОБРАМЛЕНИЕ (Л) - вызов функции, возвращающий ссылочное значение, указывающее двумерный массив.
О т р е з к и
Отрезок обозначает одномерный массив из нескольких последовательных компонентов одномерного массива. Отрезок переменной - переменная, отрезок константы — константа, отрезок значения — значение.
отрезок : : = префикс (дискретный_диапазон)
Префикс отрезка должен соответствовать одномерному индексируемому типу. Тип отрезка — это базовый тип этого индексируемого типа. Границы дискретного диапазона определяют границы отрезка и должны быть того же типа, что и тип индекса; отрезок является пустым, т. е. обозначает пустой массив, если дискретный диапазон является пустым.
Порядок вычисления префикса и дискретного диапазона при вычислении имени отрезка в языке не определяется. Если при вычислении отрезка хотя бы одна из границ дискретного диапазона не принадлежит диапазону индексов, определяемому префиксом отрезка, то (кроме случая пустого отрезка) возбуждается исключение 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)
Примечание. Для одномерного массива А имя А (К. .К) задает отрезок, состоящий из одного компонента; его тип соответствует базовому типу массива А. С другой стороны, А (К) - компонент массива и имеет тип соответствующей компоненты.
И м е н у е м ы е компоненты
Именуемые компоненты используются для обозначения компонентов записей, входов, семейств входов и объектов, указанных ссылочными значениями; они используются также в качестве расширенных имен, как это описано ниже.
именуемый_компонент: : = префикс, постфикс
постфикс : : = простое_имя I символьный_литерал
I знак_операции | all
Для обозначения дискриминанта, компонента записи, входа или объекта, указанного ссылочным значением, используются следующие четыре формы именуемых компонентов.
Дискриминант.
Постфикс должен быть простым именем, обозначающим дискриминант объекта или значения. Префикс должен соответствовать типу этого объекта или значения.
Компонент записи.
Постфикс должен быть простым именем, обозначающим компонент именуемого объекта или значения. Префикс должен соответствовать типу этого объекта или значения.
Для компонентов варианта делается проверка: являются ли значения дискриминантов такими, что запись имеет этот компонент. В противном случае возбуждается исключение CONSTRAINT_ERROR.
' в) Одиночный вход или семейство входов задачи.
Постфикс должен быть простым именем, обозначающим одиночный вход или семейство входов задачи. Префикс должен соответствовать типу этой задачи.
Объект, указанный ссылочным значением.
Постфикс должен быть зарезервированным словом all. Значение префикса должно принадлежать ссылочному типу.
Именуемый компонент одной из двух нижеуказанных форм называется расширенным именем. В каждом случае постфикс должен быть либо простым именем, либо символьным литералом, либо знаком операции. Вызов функции в качестве префикса расширенного имени не допускается. Расширенное имя может обозначать:
Понятие, описанное в видимом разделе описания пакета.
Префикс должен обозначать пакет. Постфикс должен быть простым именем, символьным литералом или знаком операции понятия.
Понятие, описание которого находится непосредственно в поименованной конструкции.
Префикс должен обозначать одну из следующих конструкций: программный модуль, оператор блока, оператор цикла или оператор принятия. Для оператора принятия префикс должен быть либо простым именем входа или семейства входов, либо расширенным именем, заканчивающимся таким простым именем (т. е. не допускается индекс). Постфикс должен быть простым именем, символьным литералом или знаком операции такого понятия, чье описание находится непосредственно в конструкции.
Данная форма расширенного имени допустима только в самой конструкции (включая тело и любые субмодули в случае программного модуля) . Не допускается использование в качестве префикса имен, описанных с помощью описания переименования. Если префикс - это имя подпрограммы или оператора принятия и если существует более одной видимой объемлющей подпрограммы или оператора принятия с таким именем, то расширенное имя неопределенно, независимо от постфикса.
Если в соответствии с правилами видимости возможна по крайней мере одна интерпретация префикса именуемого компонента как имени объемлющей подпрограммы или оператора принятия, то рассматриваются только те интерпретации, которые соответствуют правилу е — т. е. расширенные имена. (Интерпретация префикса как вызова функции не рассматривается).
Вычисление имени, являющегося именуемым компонентом, включает вычисление префикса.
Примеры именуемых компонентов:
ЗАВТРА.МЕСЯЦ - - компонент записи (см. 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).