Справочник Ada 95
4.1.3 Выбранные компоненты
Выбранные компоненты используются для обозначения компонентов (включая дискриминанты), записей, семейств записей и защищенных подпрограмм; они также используются в качестве расширенных имен, как описано ниже.
Синтаксис
selected_component ::= prefix . selector_name
selector_name ::= идентификатор | символьная_литераль | символ_оператора
Правила разрешения имен
Выбранный компонент называется расширенным именем, если, согласно правилам видимости, по крайней мере одно возможное толкование его prefix обозначает пакет или содержащую его именованную конструкцию (непосредственно, а не через subprogram_renaming_declaration или generic_renaming_declaration).
Выбранный компонент, который не является расширенным именем, должен разрешаться, обозначая один из следующих элементов:
- Компонент (включая дискриминант):
- prefix должен разрешаться, обозначая объект или значение некоторого не массивно-композиционного типа (после любого неявного разыменования). selector_name должен разрешаться, обозначая discriminant_specification типа или, если тип не защищённый, component_declaration типа. Выбранный компонент обозначает соответствующий компонент объекта или значения.
- Одна запись, семейство записей или защищённая подпрограмма:
- prefix должен разрешаться, обозначая объект или значение некоторого типа задачи или защищённого типа (после любого неявного разыменования). selector_name должен разрешаться, обозначая entry_declaration или subprogram_declaration, встречающиеся (явным или неявным образом) в видимой части этого типа. Выбранный компонент обозначает соответствующую запись, семейство записей или защищённую подпрограмму.
Расширенное имя должно разрешаться, обозначая объявление, которое встречается непосредственно в именованной декларативной области, следующим образом:
- prefix должен разрешаться, обозначая либо пакет (включая текущий экземпляр обобщённого пакета или переименование пакета), либо содержащую его именованную конструкцию.
- selector_name должен разрешаться, обозначая объявление, которое встречается непосредственно в декларативной области пакета или содержащей конструкции (объявление должно быть видно в месте расширенного имени — см. 8.3). Расширенное имя обозначает это объявление.
- Если prefix не обозначает пакет, то это должен быть direct_name или расширенное имя, и оно должно разрешаться, обозначая блок программы (кроме пакета), текущий экземпляр типа, block_statement, loop_statement или accept_statement (в случае accept_statement или entry_body индекс семейства не допускается); расширенное имя должно находиться в декларативной области этой конструкции. Кроме того, если эта конструкция является вызываемой конструкцией и prefix обозначает более одной такой содержащей вызываемой конструкции, то расширенное имя является неоднозначным, независимо от selector_name.
Динамическая семантика
Оценка selected_component включает оценку prefix.
Для selected_component, обозначающего компонент variant, производится проверка того, что значения дискриминантов таковы, что значение или объект, обозначаемый prefix, имеет этот компонент. Исключение Constraint_Error генерируется, если эта проверка не пройдена.
Примеры
Примеры выбранных компонентов:
Tomorrow.Month -- компонент записи (см. 3.8)
Next_Car.Owner -- компонент записи (см. 3.10.1)
Next_Car.Owner.Age -- компонент записи (см. 3.10.1)
-- предыдущие две строки включают неявные разыменования
Writer.Unit -- компонент записи (дискриминант) (см. 3.8.1)
Min_Cell(H).Value -- компонент записи результата (см. 6.1)
-- вызова функции Min_Cell(H)
Control.Seize -- запись защищённого объекта (см. 9.4)
Pool(K).Write -- запись задачи Pool(K) (см. 9.4)
Next_Car.Owner -- компонент записи (см. 3.10.1)
Next_Car.Owner.Age -- компонент записи (см. 3.10.1)
-- предыдущие две строки включают неявные разыменования
Writer.Unit -- компонент записи (дискриминант) (см. 3.8.1)
Min_Cell(H).Value -- компонент записи результата (см. 6.1)
-- вызова функции Min_Cell(H)
Control.Seize -- запись защищённого объекта (см. 9.4)
Pool(K).Write -- запись задачи Pool(K) (см. 9.4)
Примеры расширенных имён:
Key_Manager."<" -- оператор видимой части пакета (см. 7.3.1)
Dot_Product.Sum -- переменная, объявленная в теле функции (см. 6.1)
Buffer.Pool -- переменная, объявленная в защищённом блоке (см. 9.11)
Buffer.Read -- запись защищённого блока (см. 9.11)
Swap.Temp -- переменная, объявленная в блоке (см. 5.6)
Standard.Boolean -- имя предопределённого типа (см. A.1)
Dot_Product.Sum -- переменная, объявленная в теле функции (см. 6.1)
Buffer.Pool -- переменная, объявленная в защищённом блоке (см. 9.11)
Buffer.Read -- запись защищённого блока (см. 9.11)
Swap.Temp -- переменная, объявленная в блоке (см. 5.6)
Standard.Boolean -- имя предопределённого типа (см. A.1)