Spec-Zone.ru › Ada 95
Справочник 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)
Примеры расширенных имён:
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)


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API