4.1.3 Selected Components

From OC Systems Wiki!
< Guide:95lrm
Revision as of 23:37, 4 May 2019 by imported>WikiVisor (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Selected_components are used to denote components (including discriminants), entries, entry families, and protected subprograms; they are also used as expanded names as described below.

Syntax

selected_component ::= prefix . selector_name

selector_name ::= identifier | character_literal | operator_symbol

Name Resolution Rules

A selected_component is called an expanded name if, according to the visibility rules, at least one possible interpretation of its prefix denotes a package or an enclosing named construct (directly, not through a subprogram_renaming_declaration or generic_renaming_declaration).

A selected_component that is not an expanded name shall resolve to denote one of the following:

  • A component (including a discriminant):

The prefix shall resolve to denote an object or value of some non-array composite type (after any implicit dereference). The selector_name shall resolve to denote a discriminant_specification of the type, or, unless the type is a protected type, a component_declaration of the type. The selected_component denotes the corresponding component of the object or value.
  • A single entry, an entry family, or a protected subprogram:

The prefix shall resolve to denote an object or value of some task or protected type (after any implicit dereference). The selector_name shall resolve to denote an entry_declaration or subprogram_declaration occurring (implicitly or explicitly) within the visible part of that type. The selected_component denotes the corresponding entry, entry family, or protected subprogram.

An expanded name shall resolve to denote a declaration that occurs immediately within a named declarative region, as follows:

  • The prefix shall resolve to denote either a package (including the current instance of a generic package, or a rename of a package), or an enclosing named construct.
  • The selector_name shall resolve to denote a declaration that occurs immediately within the declarative region of the package or enclosing construct (the declaration shall be visible at the place of the expanded name -- see 8.3). The expanded name denotes that declaration.
  • If the prefix does not denote a package, then it shall be a direct_name or an expanded name, and it shall resolve to denote a program unit (other than a package), the current instance of a type, a block_statement, a loop_statement, or an accept_statement (in the case of an accept_statement or entry_body, no family index is allowed); the expanded name shall occur within the declarative region of this construct. Further, if this construct is a callable construct and the prefix denotes more than one such enclosing callable construct, then the expanded name is ambiguous, independently of the selector_name.

Dynamic Semantics

The evaluation of a selected_component includes the evaluation of the prefix.

For a selected_component that denotes a component of a variant, a check is made that the values of the discriminants are such that the value or object denoted by the prefix has this component. The exception Constraint_Error is raised if this check fails.

Examples

Examples of selected components:

  Tomorrow.Month     --  a record component                      (see 3.8) 
  Next_Car.Owner     --  a record component                      (see 3.10.1) 
  Next_Car.Owner.Age --  a record component                      (see 3.10.1) 
                     --  the previous two lines involve implicit dereferences 
  Writer.Unit        --  a record component (a discriminant)     (see 3.8.1) 
  Min_Cell(H).Value  --  a record component of the result        (see 6.1) 
                     --  of the function call Min_Cell(H) 
  Control.Seize      --  an entry of a protected object          (see 9.4) 
  Pool(K).Write      --  an entry of the task Pool(K)            (see 9.4)

Examples of expanded names:

 Key_Manager."<"      --  an operator of the visible part of a package  (see 7.3.1) 
 Dot_Product.Sum      --  a variable declared in a function body      (see 6.1) 
 Buffer.Pool          --  a variable declared in a protected unit     (see 9.11) 
 Buffer.Read          --  an entry of a protected unit                (see 9.11) 
 Swap.Temp            --  a variable declared in a block statement    (see 5.6) 
 Standard.Boolean     --  the name of a predefined type               (see A.1)

Copyright © 1992,1993,1994,1995 Intermetrics, Inc.
Copyright © 2000 The MITRE Corporation, Inc. Ada Reference Manual