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

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. Подпрограмма не должна быть неявно объявленной примитивной операцией типа 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