Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

4.1.3 Выбранные компоненты

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

Синтаксис

selected_component ::= prefix . selector_name
selector_name ::= identifier | character_literal | operator_symbol

Правила разрешения имён

selected_component называется расширенным именем, если, согласно правилам видимости, по крайней мере одна возможная интерпретация его prefix обозначает пакет или окружающую именованную конструкцию (непосредственно, а не через subprogram_renaming_declaration или generic_renaming_declaration).
selected_component, который не является расширенным именем, должен разрешаться для обозначения одного из следующего:
  • Компонента (включая дискриминант):
    prefix должен разрешаться для обозначения объекта или значения некоторого не массивно-композиционного типа (после любого неявного разыменования). selector_name должен разрешаться для обозначения discriminant_specification типа или, если тип не является защищённым, component_declaration типа. selected_component обозначает соответствующий компонент объекта или значения.
  • Одного входа, семейства входов или защищённой подпрограммы:
    prefix должен разрешаться для обозначения объекта или значения некоторого типа задачи или защищённого типа (после любого неявного разыменования). selector_name должен разрешаться для обозначения entry_declaration или subprogram_declaration, входящих (явным или неявным образом) во видимую часть этого типа. selected_component обозначает соответствующий вход, семейство входов или защищённую подпрограмму.
  • Вид подпрограммы, первый формальный параметр которой имеет тип с меткой или является параметром доступа, тип которого помечен:
    prefix (после любого неявного разыменования) должен разрешаться для обозначения объекта или значения конкретного типа с меткой T или типа класса T'Class. selector_name должен разрешаться для обозначения вида подпрограммы, объявленной непосредственно в области объявления, в которой объявлен предок типа T. Первый формальный параметр подпрограммы должен иметь тип T или тип класса, охватывающий T, или параметр доступа, обозначающий один из этих типов. Обозначение подпрограммы не должно совпадать с обозначением компонента помеченного типа, видимого в месте selected_component. selected_component обозначает вид этой подпрограммы, исключающей первый формальный параметр. Этот вид называется префиксным видом подпрограммы, а prefix selected_component (после любого неявного разыменования) называется префиксом префиксного вида.
Расширенное имя должно разрешаться для обозначения объявления, которое происходит непосредственно в именованной области объявления, следующим образом:
  • prefix должен разрешаться для обозначения либо пакета (включая текущий экземпляр обобщённого пакета или переименование пакета), либо окружающей именованной конструкции.
  • selector_name должен разрешаться для обозначения объявления, которое происходит непосредственно в области объявления пакета или окружающей конструкции (объявление должно быть видно в месте расширенного имени — см. 8.3). Расширенное имя обозначает это объявление.
  • Если prefix не обозначает пакет, то это должно быть direct_name или расширенное имя, и оно должно разрешаться для обозначения программной единицы (кроме пакета), текущего экземпляра типа, block_statement, loop_statement или accept_statement (в случае accept_statement или entry_body, индекс семейства запрещён); расширенное имя должно находиться в области объявления этой конструкции. Кроме того, если эта конструкция является вызываемой конструкцией, и prefix обозначает более одной такой окружающей вызываемой конструкции, то расширенное имя является неоднозначным, независимо от selector_name.

Правила законности

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

Динамическая семантика

Вычисление 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)
Cashier.Append -- префиксный вид процедуры (см. 3.9.4)
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