A direct reference to a UML model element. The Alf syntax element that represents the referenced model element. A syntax element synthesized in an abstract syntax tree, along with any additional information determined during static semantic analysis. A direct reference to a UML model element. The referenced model element. A reference to a model element, either directly or via its Alf abstract syntax representation. (NOTE: The definitions of all the helper operations of ElementReference are specific to its subclasses.) A syntax element that has documentation comments associated with it. The documentation text to be associated with a syntax element. Each string is intended to be mapped to the body of a comment element in the target UML model. An assignment of a source element that gives the value of a local name, along with a record of the defined type (if any) and multiplicity of the local name. The local name for which this is the assigned source. The syntax element that is to be the source for the assigned value of the given local name. The multiplicity upper bound for the local name. The multiplicity lower bound for the name. A reference to the element that gives the type for the local name (if any). An expression consisting of an operator acting on a single operand expression. The assignments before the operand of a unary expression are the same as those before the unary expression. The symbol representing the operator. The expression giving the operand. By default, the assignments after a unary expression are the same as those after its operand expression. A specification of the substitution of an argument type name for a template parameter. The name of the template parameter. The name of the argument type. An expression used to filter values by type. The type of a cast expression is the referent of the given type name (if there is one). A cast expression has a multiplicity lower bound of 0. A cast expression has a multiplicity upper bound that is the same as the upper bound of its operand expression. If the cast expression has a type name, then it must resolve to a classifier. The assignments before the operand of a cast expression are the same as those before the cast expression. The operand expression of the cast expression. The named type of the cast expression (if any) The assignments after a cast expression are the same as those after its operand expression. An expression that comprises a primitive literal. The type of a literal expression is given by the type of the literal, as defined for each subclass below. The multiplicity upper bound of a literal expression is always 1. The multiplicity lower bound of a literal expression is always 1. A specification of the elements of a sequence using a list of expressions. The multiplicity lower bound of the elements of a sequence expression list is given by the sum of the lower bounds of each of the expressions in the list. The multiplicity lower bound of the elements of a sequence expression list is given by the sum of the lower bounds of each of the expressions in the list. If any of the expressions in the list have an unbounded upper bound, then the sequence expression list also has an unbounded upper bound. The list of expressions whose values determine the elements of the sequence. A specification of the elements of a sequence as a range of integers. The multiplicity lower bound of a sequence range is 0. The multiplicity uper bound of a sequence range is * (since it is not possible, in general, to statically determine a more constrained upper bound). The expression whose value gives the lower bound for the range. The expression whose value gives the upper bound for the range. An expression consisting of an operator acting on two operand expressions. The operands of a binary expression must both have a multiplicity upper bound of 1. The assignments in the operand expressions of a binary expression must be valid (as determined by the validateAssignments helper operation). The expression giving the first operand. The expression giving the second operand. The symbol representing the operator. In general the assignments before the operand expressions of a binary expression are the same as those before the binary expression and, if an assignment for a name is changed in one operand expression, then the assignment for that name may not change in the other operand expression. (This is overridden for conditional logical expressions.) The assignments after a binary expression include all the assignments before the expression that are not reassigned in either operand expression, plus the new assignments from each of the operand expressions. The left-hand side of an assignment expression. NOTE: The derivations for the derived properties of LeftHandSide are specific to its various subclasses. If a left-hand side has an index, then the index expression must have a multiplicity upper bound no greater than 1. The assignments after the left-hand side. An optional expression that evaluates to an index into the values of an ordered sequence. A model of the common properties derived for any Alf expression. NOTE: The derivations for all properties of Expression except AssignmentsAfter are specific to its various subclasses. The assignments after an expression are given by the result of the updateAssignments helper operation. No name may be assigned more than once before or after an expression. The assigned sources for local names available lexically before this expression. The assigned sources for local names available lexically after this expression. This includes not only any assignments made within the expression, but also any assignments that are unchanged from before the expression. The statically determined upper bound of the multiplicity of this expression. The statically determined lower bound of the multiplicity of this expression. A reference to the element that specifies the statically determined type for this expression (if any). Returns the assignments from before this expression updated for any assignments made in the expression. By default, this is the same set as the assignments before the expression. This operation is redefined only in subclasses of Expression for kinds of expressions that make assignments. A named argument expression for an output parameter. The equivalent left-hand side for an output named expression depends on the kind of expression. If the expression is a name expression with no disambiguation, then the left-hand side is a name left-hand side with the name from the name expression. If the expression is a name expression that disambiguates to a feature reference, then the left-hand side is a feature left-hand side for that feature reference. If the expression is a property access expression, then the left-hand side is a feature left-hand side for the feature reference of the property access expression. If the expression is a sequence access expression, then the left-hand side is a name left-hand side or feature left-hand side, as above, depending on whether the primary expression of the sequence access expression is a name expression or property access expression, and an index given by the index expression of the sequence access expression. Otherwise the left-hand side is empty. The argument for an output parameter must be either be null, a name expression, a property access expression, or a sequence access expression whose primary expression is a name expression or a property access expression. The argument expression considered as an assignment left-hand side. An expression that uses the value of one operand expression to condition the evaluation of one of two other operand expressions. The type of a conditional-test operator expression is the effective common ancestor (if one exists) of the types of its second and third operand expressions. The multiplicity lower bound of a conditional-test operator expression is the minimum of the multiplicity lower bounds of its second and third operand expressions. The multiplicity upper bound of a conditional-test operator expression is the maximum of the multiplicity upper bounds of its second and third operand expressions. The first operand expression of a conditional-test expression must be of type Boolean and have a multiplicity upper bound of 1. The assignments before the first operand expression of a conditional-test expression are the same as those before the conditional-test expression. The assignments before the second and third operand expressions are the same as those after the first operand expression. If a name is unassigned after the first operand expression and has an assigned source after one of the other operand expression, then it must have an assigned source after both of those expressions. The first operand expression, which provides the condition to be tested. The second operand expression, to be evaluated if the condition is true. The third operand expression, to be evaluated if the condition is false. Returns unchanged all assignments for local names that are not reassigned in either the second or third operand expressions. Any local names that have different assignments after the second and third operand expressions are adjusted to have the conditional-test expression as their assigned source. An expression that comprises an unbounded value literal. The type of an unbounded literal expression is UnlimitedNatural. A binary expression with a logical operator. A logical expression has type Boolean. A logical expression has a multiplicity lower bound of 0 if the lower bound if either operand expression is 0 and 1 otherwise. A logical expression has a multiplicity upper bound of 1. The operands of a logical expression must have type Boolean. BitString conversion is required if the first operand expression of a shift expression has type Integer. BitString conversion is required if the second operand expression of a shift expression has type Integer. A logical expression is bit-wise if the type of its first operand is not Boolean. Whether this is a bit-wise logical operation on bit strings. Whether the first operand expression requires BitString conversion. Whether the second operand expression requires BitString conversion. A reference to a structural or behavioral feature of the type of its target expression or a binary association end the opposite end of which is typed by the type of its target expression. The features referenced by a feature reference include the features of the type of the target expression and the association ends of any binary associations whose opposite ends are typed by the type of the target expression. The target expression of the feature reference may not be untyped, nor may it have a primitive or enumeration type. The target expression. The features referenced by this feature reference. The name of the feature. The target of a sequence operation, reduction or expansion expression, which may be either a primary expression or a class name denoting the class extent. The effective expression for the target is the parsed primary expression, if the target is not a qualified name, a name expression, if the target is a qualified name other than a class name, or a class extent expression, if the target is the qualified name of a class. If the target is a qualified name, then that name, before it is disambiguated into either a name expression or a class name. The effective expression for the target. The target primary expression, if it is not a qualified name. A binary expression with a conditional logical expression, for which the evaluation of the second operand expression is conditioned on the result of evaluating the first operand expression. A conditional logical expression has type Boolean. A conditional logical expression has a multiplicity lower bound of 0 if the lower bound if either operand expression is 0 and 1 otherwise. A conditional logical expression has a multiplicity upper bound of 1. The operands of a conditional logical expression must have type Boolean. The assignments before the first operand expression of a conditional logical expression are the same as those before the conditional logical expression. The assignments before the second operand expression are the same as those after the first operand expression. If a name has the same assigned source after the second operand expression as before it, then that is its assigned source after the conditional logical expression. If a name is unassigned before the second operand expression, then it is considered unassigned after the conditional logical expression, even if it has an assigned source after the second operand expression. Otherwise its assigned source after the conditional logical expression is the conditional logical expression itself. An expression used to create or destroy the links of an association. A link operation expression is for link creation if its operation is "createLink". A link operation expression is for clearing an association if the operation is "clearAssoc". The referent for a link operation expression is the named association. There is no feature for a link operation expression. The qualified name of a link operation expression must resolve to a single association. Each argument expression must be assignable to its corresponding expression. The name of the link operation. Whether the operation is for link creation. Whether the operation is clearing the association. The qualified name of the association whose links are being acted on. For a clear association operation, returns a single, typeless parameter. Otherwise, returns the ends of the named association. A specification of the elements of a sequence. The multiplicity upper bound of the elements of the sequence. The derivation for this property is given in the subclasses of SequenceElements. The multiplicity lower bound of the elements of the sequence. The derivation for this property is given in the subclasses of SequenceElements. An invocation expression used to invoke an operation of a superclass. The referent of a super invocation expression is the method behavior of the operation identified using the overloading resolution rules. There is no feature for a super invocation. If the target has a qualification, then this must resolve to one of the superclasses of the current context class. If the target is empty, the referent must be the method for a constructor operation. If the referent is the method of a constructor operation, the super invocation expression must occur in an expression statement at the start of the definition for the method of a constructor operation, such that any statements preceding it are also super constructor invocations. If the referent is the method of a destructor operation, the super invocation expression must occur in an within the method of a destructor operation. It must be possible to identify a single valid operation denoted by the target of a super invocation expression that satisfies the overloading resolution rules. The name of the operation to be invoked, optionally qualified with the name of the appropriate superclass. A shift expression has type BitString. A shift expression has a multiplicity lower bound of 0 if the lower bound if either operand expression is 0 and 1 otherwise. A shift expression has a multiplicity upper bound of 1. The operands of a shift expression must have type BitString or Integer. BitString conversion is required if the first operand expression of a shift expression has type Integer. Whether the first operand expression requires BitString conversion. A tuple in which the arguments are matched to parameters by name. The argument expressions for this tuple paired with the corresponding parameter names. An expression used to evaluate its operand expression in isolation. An isolation expression has the type of its operand expression. An isolation expression has the multiplicity lower bound of its operand expression. An isolation expression has the multiplicity upper bound of its operand expression. An expression used to create a new instance of a class or data type. An instance creation expression is an object creation if its referent is not a data type. An instance creation expression is constructorless if its referent is a class. The referent of an instance creation expression is the constructor operation, class or data type to which the constructor name resolves. There is no feature for an instance creation expression. The constructor name must resolve to a constructor operation (that is compatible with the tuple argument expressions), a class or a data type, but not both a class and a data type. If the expression is constructorless, then its tuple must be empty. If an instance creation expression is a data value creation (not an object creation), then the tuple argument expressions are matched with the attributes of the named type. Whether this is a constructorless object creation expression. Whether this is an object creation expression or a data value creation expression. The name of the class constructor operation to be invoked or the name of a class or data type. Returns the parameters of a constructor operation or the attributes of a data type, or an empty set for a constructorless instance creation. An expression that comprises a Boolean literal. The type of a boolean literal expression is Boolean. The textual image of the literal token for this expression. A left-hand side that is a property reference. The assignments before the expression of the feature reference of a feature left-hand side are the assignments before the feature left-hand side. The assignments after a feature left-hand side are the assignments after the expression of the feature reference or, if there is an index, those after the index expression. The expression of the feature reference of a feature left-hand side must have a multiplicity upper bound of 1. If a feature left-hand side has an index, then the assignments before the index expression are the assignments after the expression of the feature reference. The structural feature being assigned. A pairing of a parameter name and an argument expression in a tuple. Collection conversion is required if the type of the corresponding parameter is a collection class and the type of the argument expression is not. Bit string conversion is required if the type of the type of the corresponding parameter is BitString, or a collection class instantiated with a BitString type, and the type of the argument expression is not BitString. The parameter name. The argument expression. An expression whose value gives an index into an ordered parameter. (This is only used in link operation expressions.) Whether the argument expression requires collection conversion. Whether the argument expression requires bit string conversion. A left-hand side that is a name. The assignments after a name left-hand side are the same as the assignments before. The target of a name left hand side may not already have an assigned source that is a loop variable definition, an annotation, a sequence expansion expression or a parameter that is an in parameter. If a name left-hand side has an index, then the target name must already have an assigned source and the assignments before the index expression are the assignments before the left-hand side. The name that is the target of the assignment. A sequence expansion expression with a select or reject operation. A select or reject expression has the same type as its primary expression. A select or reject expression has a multiplicity lower bound of 0. A select or reject expression has a multiplicity upper bound of *. The argument of a select or reject expression must have type Boolean and a multiplicity upper bound of 1. An expression used to carry out one of a predefined set of operations over each of the elements in a sequence. The assigned source for the expansion variable of a sequence expansion expression is the expression itself. The assignments before the primary expression of a sequence expansion expression are the same as the assignments before the sequence expansion expression. The assignments before the argument expression of a sequence expansion expression include those after the primary expression plus one for the expansion variable. The expansion variable name may not conflict with any name already assigned after the primary expression. The expansion variable may not be assigned within the argument expression. The name of the operation to be carried out. The name of the expansion variable available as a local name within the argument expression. The assigned source for the expansion variable within the argument expression. The source is actually the sequence expansion expression itself. The argument expression. The exact form required for this expression depends on which expansion operation is being carried out. The class name or primary expression that evaluates to the sequence to be acted on. The assignments after a sequence expansion expression are the same as after its primary expression. A unary expression with a Boolean operator. A Boolean unary expression has type Boolean. A Boolean unary expression has the same multiplicity lower bound as its operand expression. A Boolean unary expression has a multiplicity upper bound of 1. The operand expression of a Boolean unary expression must have type Boolean and a multiplicity upper bound of 1. A sequence expansion expression with a isUnique. An isUnique expression has the type Boolean. An isUnique expression has a multiplicity lower bound of 1. An isUnique expression has a multiplicity upper bound of 1. The argument of an isUnique expression must have a multiplicity upper bound of 1. An expression used to invoke a behavior as if it was an operation on a target sequence as a whole. The referent for a sequence operation expression is the behavior named by the operation for the expression. There is no feature for a sequence operation expression. There must be a single behavior that is a resolution of the operation qualified name of a sequence operation expression with a least one parameter, whose first parameter has direction in or inout, has multiplicity [0..*] and to which the target primary expression is assignable. If the first parameter of the referent has direction inout, then the parameter type must have the same type as the primary expression. The type of an input argument expression of a sequence operation parameter must be assignable to its corresponding parameter. The type of an output parameter must be assignable to its corresponding argument expression. (Note that this implies that the type of an argument expression for an inout parameter must be the same as the type of that parameter.) The assignments before the primary expression of a sequence operation expression are the same as the assignments before the sequence operation expression. Collection conversion is required if the type of the primary expression of a sequence operation expression is a collection class. BitString conversion is required if type of the first parameter of the referent of a sequence operation expression is BitString and either the type of its primary expression is Integer or collection conversion is required and the type of its primary expression is a collection class whose argument type is Integer. The expression or class name whose value is gives the sequence to be operated on. The qualified name of the behavior being invoked. Whether the primary expression requires collection conversion. Whether type primary expression requires BitString conversion. The assignments after a sequence operation expression include those made in the primary expression and those made in the tuple and, for an "in place" operation (one whose first parameter is inout), that made by the sequence operation expression itself. A BitString unary expression has type BitString. A BitString unary expression has the same multiplicity lower bound as its operand expression. A BitString unary expression has a multiplicity upper bound of 1. The operand expression of a BitString unary expression must have type BitString or Integer and a multiplicity upper bound of 1. BitString conversion is required if the operand expression of a BitString unary expression has type Integer. Whether BitString conversion is required on the operand expression. A template binding in which the arguments are matched to formal template parameters in order by position. The arguments for this template binding, to be matched by position to the template parameters. A binary expression that tests the equality of its operands. An equality expression is negated if its operator is "!=". An equality expression has type Boolean. An equality expression has a multiplicity lower bound of 1. An equality expression has a multiplicity upper bound of 1. Whether the test is for being not equal. An expression used to construct a sequence of values. The type of a sequence construction expression is the named type. If a sequence construction expression has multiplicity, then its multiplicity upper bound is given by its elements, if this is not empty, and zero otherwise. If a sequence construction expression does not have multiplicity, then its multiplicity upper bound is one. If a sequence construction expression has multiplicity, then its multiplicity lower bound is given by its elements, if this is not empty, and zero otherwise. If a sequence construction expression does not have multiplicity, then its multiplicity lower bound is one. The type name of a sequence construction expression must resolve to a non-template classifier. If the expression does not have multiplicity, then this classifier must be the instantiation of a collection class. The specification of the elements in the sequence. Whether the sequence construction expression has a multiplicity indicator. The name of the type of the elements in the sequence. An expression denoting the invocation of a behavior or operation, or the sending of a signal. An invocation expression is a behavior invocation if its referent is a behavior. An invocation expression is an association end read if its referent is an association end. An invocation expression is an operation call if its referent is an operation. An invocation expression is a destructor call either implicitly or if it is an explicit operation call to a destructor operation. An invocation expression is an implicit object destruction if it has a feature with the name "destroy" and no explicit referents. An invocation expression is a signal send if its referent is a signal. The parameters of an invocation expression are given by the result of the parameterElements helper operation. The type of an invocation expression is determined by the return parameter (if any) of the referent. The multiplicity upper bound of an invocation expression is determined by the return parameter (if any) of the referent. The multiplicity lower bound of an invocation expression is determined by the return parameter (if any) of the referent. The assignments before the target expression of the feature reference of an invocation expression (if any) are the same as the assignments before the invocation expression. Whether this is a behavior invocation or not. Whether this is an association read or not. For an invocation of a feature, the reference to that feature. This property is set for a feature invocation expression or for an expression initially parsed as a behavior invocation expression that disambiguates to a feature invocation expression. The tuple for the invocation expression. Whether this is an operation call or not. If this is an operation call, whether the operation is a destructor. Whether this is an implicit object destruction. The behavior, operation or signal being invoked. The derivation of this property is specific to each kind of invocation expression. Element references to the parameters of the referent, in order. Whether this is a signal send or not. Returns references to the elements that act as the parameters of the referent. For a behavior or operation, these are the owned parameters, in order. Otherwise (by default), they are actually any properties of the referent (e.g., signal attributes), which are treated as if they were in parameters. (This is defined as a helper operation, so that it can be overridden by subclasses of InvocationExpression, if necessary.) The assignments after an invocation expression are the same as those after the tuple of the expression. An expression that comprises a name reference. If the name in a name expression is a local or parameter name, then its assignment is its assigned source before the expression. If the name in a name expression resolves to an enumeration literal name, then that is the enumeration literal for the expression. If the name in a name expression disambiguates to a feature reference, then the equivalent property access expression has the disambiguation of the name as its feature. The assignments before the property access expression are the same as those before the name expression. The type of a name expression is determined by its name. If the name is a local name or parameter with an assignment, then the type of the name expression is the type of that assignment. If the name is an enumeration literal, then the type of the name expression is the corresponding enumeration. If the name disambiguates to a feature reference, then the type of the name expression is the type of the equivalent property access expression. The multiplicity upper bound of a name expression is determined by its name. The multiplicity lower bound of a name expression is determined by its name. If the name referenced by this expression is not a disambiguated feature reference or a local or parameter name, then it must resolve to exactly one enumeration literal. The identified enumeration literal, if the referenced name is for an enumeration literal. The assigned source for the referenced name, if the name is a local or parameter name. The equivalent property access expression, if the referenced name disambiguates to a feature reference. The qualified name referenced in this expression. (For a local name, this will actually have no qualification.) An expression used to obtain the objects in the extent of a class. The type of a class extent expression is the given class. The multiplicity upper bound of a class expression is *. The multiplicity lower bound of a class extent expression is 0. The given type name must resolve to a non-template class. The name of the class whose extent is to be obtained. An expression used to access a specific element of a sequence. The type of a sequence access expression is the same as the type of its primary expression. The multiplicity lower bound of a sequence access expression is 0. The multiplicity upper bound of a sequence access expression is 1. The type of the index of a sequence access expression must be Integer. The multiplicity upper bound of the index of a sequence access expression must be 1. The expression whose value is the sequence being accessed. The expression whose value is the index of the element being accessed in the sequence. An expression that comprises a String literal. The type of a string literal expression is String. The textual image of the literal token for this expression, with quote characters removed and escaped sequences resolved to the denoted special character. A binary expression with an arithmetic operator. An arithmetic expression is a string concatenation expression if its type is String. The type of an arithmetic expression is the same as the type of its operands. An arithmetic expression has a multiplicity lower bound of 0 if the lower bound if either operand expression is 0 and 1 otherwise. An arithmetic expression has a multiplicity upper bound of 1. The operands of an arithmetic expression must both have type Integer, unless the operator is +, in which case they may also both have type String. Whether this is a string concatenation expression. A tuple in which the arguments are matched to parameters in order by position. The argument expressions for this tuple, to be matched by position to the invocation parameters. A list of expressions used to provide the arguments for an invocation. A tuple has the same number of inputs as its invocation has input parameters. For each input parameter, the tuple has a corresponding input with the same name as the parameter and an expression that is the matching argument from the tuple, or an empty sequence construction expression if there is no matching argument. A tuple has the same number of outputs as its invocation has output parameters. For each output parameter, the tuple has a corresponding output with the same name as the parameter and an expression that is the matching argument from the tuple, or an empty sequence construction expression if there is no matching argument. An input parameter may only have a null argument if it has a multiplicity lower bound of 0. An output parameter may only have a null argument if it is an out parameter. The assignments before each expression in a tuple are the same as the assignments before the tuple, except in the case of a name expression that defines a new local name, in which case the assigned source for the new name is included in the assignments before the name expression. (Note that the assigned source for a new name is included before the name expression so that the nameExpressionResolution constraint is not violated.) The assignments before the tuple are the same as the assignments after the feature reference of the invocation of the tuple, if the invocation has one, or otherwise the assignments before the invocation. A name may be assigned in at most one argument expression of a tuple. The argument expressions from this tuple, matched to the input parameters (direction in and inout) of the invocation. An empty sequence construction expression is included for any input parameter that is not explicitly matched in the tuple. The invocation expression of which this tuple is a part. The argument expressions from this tuple, matched to the output parameters (direction inout and out) of the invocation. An empty sequence construction expression is included for any output parameter that is not explicitly matched in the tuple. An expression used to reduce a sequence of values effectively by inserting a binary operation between the values. The referent for a sequence reduction expression is the behavior denoted by the behavior name of the expression. A sequence reduction expression has the same type as its primary expression. A sequence reduction expression has a multiplicity upper bound of 1. A sequence reduction expression has a multiplicity lower bound of 1. The behavior name in a sequence reduction expression must denote a behavior. The referent behavior must have two in parameters, a return parameter and no other parameters. The parameters must all have the same type as the argument expression and multiplicity [1..1]. The assignments before the target expression of a sequence reduction expression are the same as the assignments before the sequence reduction expression. A reference to the behavior to be used as the reducer. Whether this is an ordered reduction or not. The target class name or primary expression for the reduction. The name of the behavior to be used as the reducer. The assignments after a sequence reduction expression are the same as after its primary expression. A unary expression with either an increment or decrement operator. If the operand of an increment or decrement expression is a name, then the assignment for the expression is a new assigned source for the name with the expression as the source. An increment or decrement expression has a feature as its operand if the operand is a kind of FeatureLeftHandSide. An increment or decrement expression is indexed if its operand is indexed. An increment or decrement expression is a data value update if its operand is an attribute of a data value held in a local name or parameter. If the operand of an increment or decrement expression is a feature, then the referent for the operand. The effective expression for the operand of an increment or decrement expression is the operand treated as a name expression, property access expression or sequence access expression, as appropriate for evaluation to obtain the original value to be updated. An increment or decrement expression has type Integer. An increment or decrement expression has the same multiplicity lower bound as its operand expression. An increment or decrement expression has a multiplicity upper bound of 1. The operand expression must have type Integer and a multiplicity upper bound of 1. The assignments before the operand of an increment or decrement expression are the same as those before the increment or decrement expression. Whether the operator is being used as a prefix or a postfix. If the operand is a name, then the new assigned source for that name. The operand, which must have the form of an assignment left-hand side. The effective expression used to obtain the original value of the operand to be updated. If the operand is a feature, then the referent for that feature. Whether the operand is a feature or not. If the operand is a feature, whether it has an index or not. Whether this expression updates an attribute of a data value held in a local name or parameter. The assignments after an increment and decrement expression include all those after its operand expression. Further, if the operand expression, considered as a left hand side, is a local name, then this is reassigned. A sequence expansion expression with a collect or iterate operation. A collect or iterate expression has the same type as its argument expression. A collect or iterate expression has a multiplicity lower bound that is the product of the bounds of its primary and argument expressions. A collect or iterate expression has a multiplicity upper bound that is the product of the bounds of its primary and argument expressions. A sequence expansion expression with a forAll, exists or one operation. A forAll, exists or one expression has the type Boolean. A forAll, exists or one expression has a multiplicity lower bound of 1. A forAll, exists or one expression has a multiplicity upper bound of 1. The argument of a forAll, exists or one expression must have type Boolean and a multiplicity upper bound of 1. A list of type names used to provide arguments for the parameters of a template. An invocation of a feature referenced on a sequence of instances. If a feature invocation expression is an implicit object destruction, it has no referent. Otherwise, its referent is the referent of its feature. If a feature invocation expression has an explicit target, then that is its feature. Otherwise, it is an alternative constructor call with its feature determined implicitly. If a feature invocation expression is not an implicit destructor call, then it must be possible to determine a single valid referent for it according to the overloading resolution rules. An alternative constructor invocation may only occur in an expression statement as the first statement in the definition for the method of a constructor operation. If there is no target feature expression, then the implicit feature with the same name as the target type must be a constructor. A feature reference to the target feature to be invoked. An expression comprising a reference to a structural feature. The feature of a property access expression is the structural feature to which its feature reference resolves. The type of a property access expression is the type of the referenced feature. The multiplicity upper bound of a property access expression is given by the product of the multiplicity upper bounds of the referenced feature and the target expression. The multiplicity upper bound of a property access expression is given by the product of the multiplicity upper bounds of the referenced feature and the target expression. The feature reference for a property access expression must resolve to a single structural feature. The assignments before the expression of the feature reference of a property access expression are the same as before the property access expression. A reference to a structural feature. The referenced structural feature. The assignments after a property access expression are the same as those after the target expression of its feature reference. An unqualified name, optionally with a template binding. The template binding to be used, if the name denotes a template. An unqualified name. For names that appeared as unrestricted names in the input text, the string value here excludes the surrounding single quote characters and has any escape sequences resolved to the denoted special characters. A binary expression with a relational operator. A relational expression is an UnlimitedNatural comparison if either one of its operands has type UnlimitedNatural. The type of a relational expression is Boolean. A relational expression has a multiplicity lower bound of 0 if the lower bound if either operand expression is 0 and 1 otherwise. A relational expression has a multiplicity upper bound of 1. The operand expressions for a comparison operator must have type Integer, UnlimitedNatural or Natural. However, it is not allowed to have one operand expression be Integer and the other be UnlimitedNatural. Whether this is an UnlimitedNatural comparison. A unary expression with a numeric operator. A numeric unary expression must have type Integer. A numeric unary expression has the same multiplicity lower bound as its operand expression. A numeric unary expression has a multiplicity upper bound of 1. The operand expression must have type Integer and a multiplicity upper bound of 1. An expression that comprises a natural literal. The type of a natural literal is the Alf library type Natural. NOTE: If the context of a natural literal expression unambiguously requires either an Integer or an UnlimitedNatural value, then the result of the literal expression is implicitly downcast to the required type. If the context is ambiguous, however, than an explicit cast to Integer or UnlimitedNatural must be used. The textual image of the literal token for this expression. An expression used to test the dynamic type of its operand. A classification expression is direct if its operator is "hastype". The referent of a classification expression is the classifier to which the type name resolves. A classification expression has type Boolean. A classification expression has a multiplicity lower bound that is the same as the lower bound of its operand expression. A classification expression has a multiplicity upper bound of 1. The type name in a classification expression must resolve to a classifier. The operand expression of a classification expression must have a multiplicity upper bound of 1. Whether the test is for the operand to have the given type directly or to only conform to the given type. Whether the test is for the operand to have the given type directly or to only conform to the given type. The name of the type that the operand is to be tested against. A template binding in which the arguments are matched to formal template parameters by name. The substitutions of arguments for template parameters. The representation of a qualified name as a sequence of individual simple names. The unqualified name of a qualified name is the last name binding. The path name for a qualified name consists of the string representation of each of the name bindings, separated by "::" punctuation. The string representation of a name binding is its name followed by the representation of its template binding, if it has one. The string representation of a positional template binding consists of an ordered list of the path names of its argument qualified names separated by commas, all surrounded by the angle brackets "<" and ">". The string representation of a named template binding consists of an ordered list of its template parameter substitutions, each consisting of the formal parameter name followed by "=>" followed by the path name of the argument qualified name, separated by commas, all surrounded by the angle brackets "<" and ">". A qualified name is a feature reference is its disambiguation is not empty. The qualification of a qualified name is a empty if the qualified name has only one name binding. Otherwise it is the qualified name consisting of all the name bindings of the original qualified name except for the last one. The qualification of a qualified name is considered ambiguous if the qualified name is ambiguous and has more than two name bindings. If a qualified name is not ambiguous or it resolves to a namespace, then it is has no disambiguation. Otherwise, its disambiguation is a feature reference with a name given by the unqualified name of the qualified name and a target expression determined by the disambiguation of the qualification of the qualified name. The referents of a qualified name are the elements to which the name may resolve in the current scope, according to the UML rules for namespaces and named elements. If a qualified name is a local name, then the reference must be within the same local scope as the definition of the named element. If a qualified name is an unqualified, non-local name, then it must be visible in the current scope of the use of the name. If a qualified name has a qualification, then its unqualified name must name an element of the namespace named by the qualification, where the first name in the qualification must name an element of the current scope. If the unqualified name of a qualified name has a template binding, then the template name must resolve to a template. The template binding must have an argument name for each of the template parameters and each argument name must resolve to a classifier. If the template parameter has constraining classifiers, then the referent of the corresponding argument name must conform to all those constraining classifiers. If the last name binding in a qualified name has a template binding, then the template name is a qualified name with the same template bindings as the original qualified name, but with the template binding removed on the last name binding. Whether this qualified name is ambiguous. The complete path name for the qualified name, with individual name bindings separated by "::" punctuation. Indicates whether this qualified name has been disambiguated to a feature reference. The qualified name corresponding to the qualification part of this qualified name, if any. The disambiguation into a feature reference of a syntactic element initially parsed as a qualified name. The sequence of individual name bindings in this qualified name. The possible referents to which this qualified name may resolve. (Note that the UML rules for namespaces in general allow a namespace to contain elements of different kinds with the same name.) If the qualified name is for a template instantiation, then the referent is the equivalent bound element. The rightmost individual name binding in the qualified name, without the qualification. An expression used to assign a value to a local name, parameter or property. An assignment expression is a simple assignment if the assignment operator is "=". An assignment expression is an arithmetic assignment if its operator is a compound assignment operator for an arithmetic operation. An assignment expression is a definition if it is a simple assignment and its left hand side is a local name for which there is no assignment before the expression. The left hand side of an assignment expression is a feature if it is a kind of FeatureLeftHandSide. The left hand side of an assignment expression is indexed if it has an index. An assignment expression is a data value update if its left hand side is an attribute of a data value held in a local name or parameter. The new assigned source for an assignment to a local name is the assignment expression. If the assignment is a definition, then the type is given by the right hand side, the multiplicity upper bound is 1 if the upper bound of the right hand side is 1 and otherwise * and the multiplicity lower bound is 0. Otherwise, the type and multiplicity are the same as the left hand side. If the left-hand side of an assignment expression is a feature, then the feature of the assignment is the referent of the left-hand side. For a compound assignment, the effective expression is the left-hand side treated as a name expression, property access expression or sequence access expression, as appropriate for evaluation to obtain the original value to be updated. An assignment expression has the same type as its right-hand side expression. An assignment expression has the same multiplicity upper bound as its right-hand side expression. An assignment expression has the same multiplicity lower bound as its right-hand side expression. If the left-hand side of a simple assignment is not a new local name, and the right-hand side is not null, then the left-hand side must either be untyped or have a type that conforms to the type of the right-hand side expression. If the left-hand side of a simple assignment is not a new local name and the multiplicity upper bound of the left-hand side is less than or equal to 1, then the multiplicity upper bound of the right-hand side cannot be greater than that of the left-hand side. For a compound assignment, both the left-hand side and the right-hand side must have the same type, consistent with the arithmetic or logical operator used in the compound assignment operator. For a compound assignment, both the left-hand and right-hand sides must have a multiplicity upper bound of 1. The assigned source of a name before the right-hand side expression of an assignment expression is the same as the assigned source before the assignment expression. The assigned source of a name before the left-hand side is the assigned source after the right-hand side expression. An assignment requires collection conversion if the type of the right-hand side is a collection class and its multiplicity upper bound is 1, and the type of the left-hand side is not a collection class. An assignment requires BitString conversion if the type of the left-hand side is BitString and either the type of the right-hand side is Integer or collection conversion is required and the type of the right-hand side is a collection class whose argument type is Integer. The image of the assignment operator used in the expression. The left-hand side of the assignment, to which a value is to be assigned. The right-hand side expression of the assignment, which produces the value being assigned. If the left-hand side is a name, then the new assigned source for that name. If the left-hand side is a feature, then the referent for that feature. If the left-hand side is a feature, whether it has an index or not. If this is a compound assignment, whether the compound assignment operator is arithmetic or not. Whether this assignment is the definition of a new local name or not. Whether this is a simple assignment or not. If this is a compound assignment, then the effective expression used to obtain the original value of the left-hand side to be updated. Whether the left-hand side is a feature or not. Whether this assignment updates an attribute of a data value held in a local name or parameter. Whether collection conversion is required for this assignment. Whether BitString conversion is required for this assignment. The assignments after an assignment expression are the assignments after the left-hand side, updated by the assignment from the assignment statement, if any. An invocation of a behavior referenced by name. The referent of a behavior invocation expression is the behavior named by the target or, if the target disambiguates to a feature reference, the operation or signal being invoked. If the target qualified name disambiguates to a feature reference, then the feature of a behavior invocation expression is that feature reference. If the target qualified name does not disambiguate to a feature reference, then it must resolve to a behavior or an association end. Otherwise it must resolve to a single feature referent according to the overloading resolution rules, unless it is an implicit destructor call (in which case it has no referent). An input argument expression must be assignable to its corresponding parameter. An output parameter must be assignable to its corresponding argument expression. (Note that this implies that the type of an argument expression for an inout parameter must be the same as the type of that parameter.) The qualified name of the behavior to be invoked. An expression comprising the keyword “this”. The static type of a this expression is the statically determined context classifier for the context in which the this expression occurs. The multiplicity upper bound of a this expression is always 1. The multiplicity lower bound of a this expression is always 1. A statement that executes code in a language other than Alf. The assignments after an in-line statement are the same as the assignments before the statement. The name of the language in which the code is written. The in-line code to be executed. A statement that has no affect when executed. The assignments after and empty statement are the same as the assignments before the statement. An empty statement may not have any annotations. A statement that executes (at most) one of a set of statement sequences based on matching a switch value to a set of test cases. The assignments before all clauses of a switch statement are the same as the assignments before the switch statement. The same local name may not be assigned in more than one case expression in a switch statement. If a name has an assigned source after any clause of a switch statement that is different than before that clause (including newly defined names), the assigned source after the switch statement is the switch statement. Otherwise, the assigned source of a name after the switch statement is the same as before the switch statement. If a switch statement does not have a final default clause, then any name that is unassigned before the switch statement is unassigned after the switch statement. If a switch statement does have a final default clause, then any name that is unassigned before the switch statement and is assigned after any one clause of the switch statement must also be assigned after every other clause. The type of such names after the switch statement is the effective common ancestor of the types of the name in each clause with a multiplicity lower bound that is the minimum of the lower bound for the name in each clause and a multiplicity upper bound that is the maximum for the name in each clause. An switch statement is determined if it has an @determined annotation. An switch statement is assured if it has an @assured annotation. The set of switch clauses whose cases are to be tested against the switch value. The expression to be evaluated to provide the switch value. A sequence of statements to be executed if no switch clause case matches the switch value. Whether at least one case in the switch statement is assured to match. Whether at most one case in the if statement will ever to match. In addition to an @isolated annotation, a switch statement may have @assured and @determined annotations. They may not have arguments. A model of an Alf statement. All the annotations of a statement must be allowed, as given by the annotationAllowed operation for the statement. No name may be assigned more than once before or after a statement. A statement is isolated if it has an @isolated annotation. The annotations applied to this statement. The assigned sources for local names available lexically before this statement. The assigned sources for local names available lexically after this statement. This includes not only any assignments made within the statement, but also any assignments that are unchanged from before the statement. The statement immediately enclosing this statement, if any. Whether this statement should be executed in isolation. Returns true if the given annotation is allowed for this kind of statement. By default, only an @isolated annotation is allowed, with no arguments. This operation is redefined only in subclasses of Statement for kinds of statements that allow different annotations than this default. A block of an accept statement that accepts one or more signals. The signals of an accept block are the referents of the signal names of the accept block. All signal names in an accept block must resolve to signals. The local name to which an accepted signal instance will be assigned. The body of the accept block, executed if one of the named signals is received. A list of names of the signals accepted by this accept block. The signals denoted by the signal names of the accept block. A conditional statement that executes (at most) one of a set of clauses based on boolean conditions. The assignments before all the non-final clauses of an if statement are the same as the assignments before the if statement. If the statement has a final clause, then the assignments before that clause are also the same as the assignments before the if statement. If an if statement does not have a final else clause, then any name that is unassigned before the if statement is unassigned after the if statement. If an if statement does have a final else clause, then any name that is unassigned before the if statement and is assigned after any one clause of the if statement must also be assigned after every other clause. The type of such names after the if statement is the effective common ancestor of the types of the name in each clause with a multiplicity lower bound that is the minimum of the lower bound for the name in each clause and a multiplicity upper bound that is the maximum for the name in each clause. For a name that has an assigned source after any clause of an if statement that is different than before that clause, then the assigned source after the if statement is the if statement. Otherwise, the assigned source of a name after the if statement is the same as before the if statement. The enclosing statement of all the statements in the bodies of all non-final clauses and in the final clause (if any) of an if statement is the if statement. An if statement is assured if it has an @assured annotation. An if statement is determined if it has an @determined annotation. A list of groupings of concurrent clauses that are to be checked sequentially for a successful condition. A sequence of statements to be executed if no other clause has a successful condition. Whether at least one condition in the if statement is assured to evaluate to true. Whether at most one condition in the if statement will ever to evaluate to true. In addition to an @isolated annotation, an if statement may have @assured and @determined annotations. They may not have arguments. A statement that provides a value for the return parameter of an activity. The behavior containing the return statement must have a return parameter. The expression of the return statement must be assignable to that return parameter. The assignments before the expression of a return statement are the same as the assignments before the statement. The assignments after a return statement are the same as the assignments after the expression of the return statement. The expression to be evaluated to provide the returned value. A reference to the enclosing behavior for this return statement. A clause in a switch statement with a set of cases and a sequence of statements that may be executed if one of the cases matches the switch value. The assignments before any case expression of a switch clause are the same as the assignments before the clause. The assignments before the block of a switch clause are the assignments after all case expressions. If a name is unassigned before a switch clause, then it must be unassigned after all case expressions of the clause (i.e., new local names may not be defined in case expressions). The expressions to be evaluated to provide values to test against the switch value. The sequence of statements that may be executed if one of the cases matches the switch value. The assignments before a switch clause are the assignments before any case expression of the clause. The assignments after a switch clause are the assignments after the block of the switch clause. A looping statement for which the continuation condition is first tested after the first iteration. The assignments before the block of a do statement are the same as the assignments before the do statement. The assignments before the condition expression of a do statement are the same assignments after the block. If the assigned source for a name after the condition expression is different than before the do statement, then the assigned source of the name after the do statement is the do statement. Otherwise it is the same as before the do statement. The condition expression of a do statement must have type Boolean and a multiplicity upper bound of 1. The enclosing statement for all statements in the body of a do statement are the do statement. The expression to be evaluated to determine whether to continue looping. The sequence of statements to be iteratively executed. A statement that causes the termination of execution of an immediately enclosing block. The target of a break statement is the innermost switch, while, do or for statement enclosing the break statement. The target of a break statement may not have a @parallel annotation. The enclosing statement that is terminated by this break statement. A break statement may not have any annotations. A statement that evaluates an expression when executed. The assignments before the expression of an expression statement are the same as the assignments before the statement. The assignments after an expression statement are the same as the assignments after its expression. The expression to be evaluated. A statement used to accept the receipt of instances of one or more signals. An accept statement can only be used within the definition of an active behavior or the classifier behavior of an active class. The containing behavior of an accept statement must have receptions for all signals from all accept blocks of the accept statement. No signal may be referenced in more than one accept block of an accept statement. Any name defined in an accept block of an accept statement must be unassigned before the accept statement. A local name specified in the accept block of a simple accept statement has the accept statement as its assigned source after the accept statement. The type of the local name is the effective common ancestor of the specified signals, if one exists, and it is untyped otherwise. For a compound accept statement, a local name defined in an accept block has the accept block as its assigned source before the block associated with the accept block. The type of the local name is the effective common ancestor of the specified signals for that accept clause, if one exists, and it is untyped otherwise. However, the local name is considered unassigned after the accept statement. The assignments before any block of an accept statement are the assignments before the accept statement. If a name is assigned in any block of an accept statement, then the assigned source of the name after the accept statement is the accept statement itself. If a name is unassigned before an accept statement and assigned in any block of an accept statement, then it must be assigned in every block. An accept statement is simple if it has exactly one accept block and that accept block does not have a block. The enclosing statement for all statements in the blocks of all accept blocks of an accept statement is the accept statement. One or more blocks for accepting alternate groups of signals. The behavior containing the accept statement. Whether the accept statement is simple or not. A statement that changes the classification of an object. The expression in a classify statement must have a class as its type and multiplicity upper bound of 1. All qualified names listed in the from or to lists of a classify statement must resolve to classes. All the from and to classes of a classify statement must be subclasses of the type of the target expression and none of them may have a common superclass that is a subclass of the type of the target expression (that is, they must be disjoint subclasses). The assignments before the expression of a classify statement are the same as the assignments before the statement. The assignments after a classify statement are the same as the assignments after its expression. The from classes of a classify statement are the class referents of the qualified names in the from list for the statement. The to classes of a classify statement are the class referents of the qualified names in the to list for the statement. The expression to be evaluated to obtain the object to be reclassified. A list of names of classes to be removed as types of the object. A list of names of classes to be added as types of the object. The classes denoted by the names in the from list. The classes denoted by the names in the to list. Whether this classify statement reclassifies all types of the target object. The definition of a loop variable in a for statement. The assignments after a loop variable definition include the assignments after the expression (or expressions) of the definition plus a new assigned source for the loop variable itself. The assigned source for the loop variable is the loop variable definition. The multiplicity upper bound for the variable is 1. The multiplicity lower bound is 1 if the loop variable definition is the first in a for statement and 0 otherwise. If collection conversion is not required, then the variable has the inferred or declared type from the definition. If collection conversion is required, then the variable has the argument type of the collection class. The assignments before the expressions of a loop variable definition are the assignments before the loop variable definition. If a loop variable definition has two expressions, then both expressions must have type Integer and a multiplicity upper bound of 1, and no name may be newly assigned or reassigned in more than one of the expressions. If a loop variable definition has a type name, then this name must resolve to a non-template classifier. If the type of a loop variable is not inferred, then the variable has the type denoted by the type name, if it is not empty, and is untyped otherwise. If the type is inferred, them the variable has the same as the type of the expression in its definition. If the type of a loop variable definition is not inferred, then the first expression of the definition must have a type that conforms to the declared type. Collection conversion is required for a loop variable definition if the type for the definition is the instantiation of a collection class and the multiplicity upper bound of the first expression is no greater than 1. The variable name given in a loop variable definition must be unassigned after the expression or expressions in the definition. The name of the loop variable. If there is only one expression, then this expression is evaluated to produce a sequence of values to be assigned to the loop variable on successive iterations. Otherwise it is evaluated to provide the first value of a range of values to be assigned to the loop variable. The expression to be evaluated to give the second value in a range of values to be assigned to the loop variable. The declared type of the loop variable. Whether the type of the variable is inferred or declared explicitly. NOTE: This flag is necessary to because a variable that is explicitly declared to have type "any" will have an empty typeName, just like a variable whose type is to be inferred, but, in the former case, the type is actually intended to be empty, not inferred. Whether collection conversion is required. The declared or inferred type of the loop variable. Whether this definition is the first in the list of definitions in the enclosing for statement. The assigned sources for local names available lexically before this loop variable definition. The assigned sources for local names available lexically after this loop variable definition. This includes not only any assignments made within the statement, but also any assignments that are unchanged from before the statement. A statement that declares the type of a local name and assigns it an initial value. The assignments before the expression of a local name declaration statement are the same as the assignments before the statement. If the type name in a local name declaration statement is not empty, then it must resolve to a non-template classifier and the expression must be assignable to that classifier. The local name in a local name declaration statement must be unassigned before the statement and before the expression in the statement. It must remain unassigned after the expression. The assignments after a local name declaration statement are the assignments before the statement plus a new assignment for the local name defined by the statement. The assigned source for the local name is the local name declaration statement. The local name has the type denoted by the type name if this is not empty and is untyped otherwise. If the statement has multiplicity, then the multiplicity of the local name is [0..*], otherwise it is [0..1]. If a local name declaration statement does not have multiplicity, then the multiplicity of upper bound of the assigned expression must not be greater than 1. The type of a local name declaration statement with a type name is the single classifier referent of the type name. Otherwise it is the type of the expression of the statement. The local name being declared. The expression to be evaluated to provide the initial value to be assigned to the local name. Whether the local name is to have a multiplicity upper bound of * rather than 1. The declared type of the local name. The type declared for the given local name. A group of qualified names. The names in the group. A clause of an if statement with a conditional expression and a sequence of statements that may be executed if the condition is true. The assignments before the body of a non-final clause are the assignments after the condition. If a name is unassigned before the condition expression of a non-final clause, then it must be unassigned after that expression (i.e., new local names may not be defined in the condition). The condition of a non-final clause must have type Boolean and a multiplicity upper bound no greater than 1. The expression that is evaluated to determine whether the clause body may be executed. The sequence of statements that may be executed if the condition evaluates to true. The assignments before a non-final clause are the assignments before the condition of the clause. The assignments after a non-final clause are the assignments after the block of the clause. An identified modification to the behavior of an annotated statement. The name of the annotation. If permitted by the annotation, an optional list of local names relevant to the annotation. A looping statement that gives successive values to one or more loop variables on each iteration. The assignments before a loop variable definition in a for statement are the same as before the for statement. The assignments before the body of the statement include all the assignments before the statement plus any new assignments from the loop variable definitions, except that, if the statement is parallel, the assigned sources of any names given in @parallel annotations are changed to be the for statement itself. The loop variables are unassigned after a for statement. Other than the loop variables, if the assigned source for a name after the body of a for statement is the same as after the for variable definitions, then the assigned source for the name after the for statement is the same as after the for variable definitions. If a name is unassigned after the for variable definitions, then it is unassigned after the for statement (even if it is assigned in the body of the for statement). If, after the loop variable definitions, a name has an assigned source, and it has a different assigned source after the body of the for statement, then the assigned source after the for statement is the for statement itself. A @parallel annotation of a for statement may include a list of names. Each such name must be already assigned after the loop variable definitions of the for statement, with a multiplicity of [0..*]. These names may only be used within the body of the for statement as the first argument to for the CollectionFunctions::add behavior. If, after the loop variable definitions of a parallel for statement, a name has an assigned source, then it must have the same assigned source after the block of the for statement. Other than for names defined in the @parallel annotation of the for statement, the assigned source for such names is the same after the for statement as before it. Any names defined in the @parallel annotation have the for statement itself as their assigned source after the for statement. Other than names given in the @parallel annotation, if a name is unassigned after the loop variable definitions, then it is considered unassigned after the for statement, even if it is assigned in the block of the for statement. The isFirst attribute of the first loop variable definition for a for statement is true while the isFirst attribute if false for any other definitions. The assigned sources for loop variables after the body of a for statement must be the for statement (the same as before the body). A for statement is parallel if it has a @parallel annotation. The enclosing statement for all statements in the body of a for statement are the for statement. The sequence of statements to be iteratively executed. A list of definitions of one or more loop variables. Whether the for statement is parallel. In addition to an @isolated annotation, a for statement may have a @parallel annotation. A grouped sequence of statements. The assignments before each statement in a block other than the first are the same as the assignments after the previous statement. If a block is not empty, then the assignments after the block are the same as the assignments after the last statement of the block. Otherwise they are the same as the assignments before the block. The ordered sequence of statements in the block. The assigned sources for local names available lexically after this block. This includes not only any assignments made within the statement, but also any assignments that are unchanged from before the statement. The assigned sources for local names available lexically before this block. A statement that executes a block. In a parallel block statement, any name assigned in one statement of the block may not be further assigned in any subsequent statement in the same block. The assignments before the block of a block statement are the same as the assignments before the block statement. The assignments after a block statement are the same as the assignments after the block of the block statement. The enclosing statement for all the statements in the block of a block statement is the block statement. A block statement is parallel if it has a @parallel annotation. The block to be executed. Whether the statements in the block of this block statement should be executed concurrently. In addition to an @isolated annotation, a block statement may have a @parallel annotation. It may not have any arguments. A grouping of non-final conditional clauses to be tested concurrently. The assignments before each of the clauses in a set of concurrent clauses are the same as the assignments before the concurrent clauses. The same name may not be assigned in more than one conditional expression within the same concurrent set of clauses. The conditional clauses in the group. A looping statement for which the continuation condition is first tested before the first iteration. The assignments before the condition expression of a while statement are the same as the assignments before the while statement. The assignments before the block of the while statement are the same as the assignments after the condition expression. If a name is assigned before the block, but the assigned source for the name after the block is different than before the block, then the assigned source of the name after the while statement is the while statement. Otherwise it is the same as before the block. If a name is unassigned before the block of a while statement, then it is unassigned after the while statement, even if it is assigned after the block. The condition expression of a while statement must have type Boolean and a multiplicity upper bound of 1. The enclosing statement for all statements in the body of a while statement are the while statement. The sequence of statements to be iteratively executed. The expression to be evaluated to determine whether to continue looping. The definition of a namespace as an Alf unit. If a unit definition has a declared namespace name, then the containing namespace for the unit is the referent for that name. The declared namespace name for a unit definition, if any, must resolve to a UML namespace of an Alf unit definition. If it is an Alf unit definition, then it must have a stub for this unit definition. A unit definition is for a model library if its associated namespace definition has a stereotype annotation for the UML standard stereotype ModelLibrary. Unless the unit definition is a model library, it has private package import references for all the sub-packages of the Alf::Library package. The profiles applied to a unit definition include any profiles applied to the containing namespace of the unit definition. If the unit definition is for a package, then the applied profiles for the unit definition also include the applied profiles for its associated package definition. A declaration of the name of the namespace that contains this unit as a subunit. The definition of the unit as a namespace. The set of references to imported elements or packages. A reference to the namespace denoted by the declared namespace name for the unit, if any. Whether this unit definition is for a model library or not. The profiles applied to this unit. The definition of a classifier template parameter, which acts as a classifier within the definition of the template. Annotations are not allowed on classifier template parameters. Returns false. (Classifier template parameters cannot be stubs.) Return true if the given member is a classifier template parameter. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. The definition of an association, whose members must all be properties. The specialization referents of an association definition must all be associations. Returns true if the given unit definition matches this association definition considered as a classifier definition and the subunit is for an association definition. In addition to the annotations allowed for classifiers in general, an association definition allows an annotation for any stereotype whose metaclass is consistent with Association. Return true if the given member is either an AssociationDefinition or an imported member whose referent is an AssociationDefinition or an Association. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. A typed element definition for a property (attribute or association end). If a property definition has an initializer, then the initializer expression must be assignable to the property definition. A property definition requires collection conversion if its initializer has a collection class as its type and the property definition does not. A property definition requires BitString conversion if its type is BitString and the type of its initializer is Integer or a collection class whose argument type is Integer. A property definition is a feature. Whether the property being defined has composite aggregation. The expression to be evaluated to initialize the property. Whether collection conversion is required for the initialization of this property. Whether BitString conversion is required for the initialization of this property. Returns true if the annotation is for a stereotype that has a metaclass consistent with Property. Return true if the given member is either a PropertyDefinition or an imported member whose referent is a PropertyDefinition or a Property. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. An assignment of a value to an attribute of an applied stereotype. The name of the stereotype attribute to be assigned a value. The string image of a literal value to be assigned to the stereotype attribute. For a numeric value, an optional unary plus or minus operator. A model of the common properties of the definition of a namespace in Alf. The members of a namespace definition include references to all owned members. Also, if the namespace definition has a unit with imports, then the members include imported members with referents to all imported elements. The imported elements and their visibility are determined as given in the UML Superstructure. The name of an imported member is the name of the imported element or its alias, if one has been given for it. Elements that would be indistinguishable from each other or from an owned member (as determined by the Member::isDistinguishableFrom operation) are not imported. The members of a namespace must be distinguishable as determined by the Member::isDistinguishableFrom operation. The definitions of owned members of the namespace. The unit for which this namespace is a definition, if any. The owned and imported members of a namespace definition. Returns true if the annotation is @external. The definition of a data type, whose members must all be properties. If a data type is primitive, then it may not have any owned members. The specialization referents of a data type definition must all be data types. Returns true if the given unit definition matches this data type definition considered as a classifier definition and the subunit is for a data type definition. In addition to the annotations allowed for classifiers in general, a data type definition allows @primitive annotations plus any stereotype whose metaclass is consistent with DataType. Return true if the given member is either a DataTypeDefinition or an imported member whose referent is a DataTypeDefinition or a DataType. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. A reference to an element or package to be imported into a unit. The referent of an import reference is the element denoted by the referent name. The referent name of an import reference must resolve to a single element with public or empty visibility. An indication of the visibility of the import. The name of the element or package to be imported. The unit that is making this import reference. A reference to the imported element denoted by the given qualified name. The definition of an activity, with any formal parameters defined as owned members. An activity definition may not have a specialization list. If an activity definition is primitive, then it must have a body that is empty. The sequence of statements that defines the behavior of the activity (empty for a stub). In addition to the annotations allowed for classifiers in general, an activity definition allows @primitive annotations and any stereotype whose metaclass is consistent with Activity. Returns true if the given unit definition matches this activity definition considered as a classifier definition and the subunit is for an activity definition. In addition, the subunit definition must have formal parameters that match each of the formal parameters of the stub definition, in order. Two formal parameters match if they have the same direction, name, multiplicity bounds, ordering, uniqueness and type reference. The declaration of the ability of an active class to receive a signal. The signal name for a reception definition must have a single referent that is a signal. This referent must not e a template. The signal for a reception definition is the signal referent of the signal name for the reception definition. A reception definition is a feature. The name of the signal to be received. Returns true if the annotation is for a stereotype that has a metaclass consistent with Reception. Return true if the given member is either a ReceptionDefinition, a SignalReceptionDefinition or an imported member whose referent is a ReceptionDefinition, a SignalReceptionDefinition or a Reception. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. An import reference to a single element to be imported into a unit. The alias to be used as the name for the imported element in the importing unit’s namespace. A model of the common properties of the definition of a member of a namespace in Alf. All stereotype annotations for a member must be allowed, as determined using the stereotypeAllowed operation. A member is primitive if it has a @primitive annotation. A member is external if it has an @external derivation. If a member is external then it must be a stub. If a member is a stub and is not external, then there must be a single subunit with the same qualified name as the stub that matches the stub, as determined by the matchForStub operation. If the member is a stub and is not external, then its corresponding subunit is a unit definition with the same fully qualified name as the stub. If a member is a stub, then the it must not have any stereotype annotations that are the same as its subunit. Two stereotype annotations are the same if they are for the same stereotype. If a member is primitive, then it may not be a stub and it may not have any owned members that are template parameters. The name of the member. An indication of the visibility of the member outside of its namespace. Whether this member definition is a stub for a subunit. The namespace definition within which this member definition is nested, if any. (The namespace definitions for units are not physically nested within another Alf namespace definition.) The stereotype annotations on this member definition. Whether this member is a feature of a classifier. Whether this member is a primitive or not. Whether this member is external or not. The subunit corresponding to the member, if the member is a stub. Returns true of the given stereotype annotation is allowed for this kind of element. Returns true of the given unit definition is a legal match for this member as a stub. By default, always returns false. Returns true if this member is distinguishable from the given member. Two members are distinguishable if their names are different or the they are of different kinds (as determined by the isSameKindAs operation). However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. Returns true if this member is of the same kind as the given member. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. The definition of both a signal and a reception of that signal as a feature of the containing active class. A signal reception definition is a feature. The definition of an operation, with any formal parameters defined as owned members. The namespace for an operation definition must be a class definition. If the operation definition is abstract, then the class definition must be abstract. If an operation definition has a redefinition list, its redefined operations are the referent operations of the names in the redefinition list for the operation definition. Otherwise, the redefined operations are any operations that would otherwise be indistinguishable from the operation being defined in this operation definition. Each name in the redefinition list of an operation definition must have a signal referent that is an operation. This operation must be a non-private operation that is a member of a specialization referent of the class definition of the operation definition. The redefined operations of an operation definition must have formal parameters that match each of the formal parameters of this operation definition, in order. Two formal parameters match if they have the same direction, name, multiplicity bounds, ordering, uniqueness and type reference. An operation definition is a feature. An operation definition is a constructor if it has a @Create annotation. An operation definition is a destructor if it has a @Destroy annotation. An operation definition cannot be both a constructor and a destructor. If an operation definition is a constructor, any redefined operation for it must also be a constructor. The body of a constructor may contain an alternative constructor invocation for another constructor in the same class or super constructor invocations for constructors in immediate superclasses. If an operation definition is a destructor, any redefined operation for it must also be a destructor. The names of other operations that are redefined by the operation being defined. Whether the operation being defined is abstract. The sequence of statements that defines the behavior of the operation (empty for a stub). Whether this operation definition is for a constructor. Whether this operation definition is for a destructor. Returns true if the annotation is for a stereotype that has a metaclass consistent with Operation. The namespace definition associated with the given unit definition must be an activity definition with no template parameters. In addition, the subunit definition must have formal parameters that match each of the formal parameters of the stub definition, in order. Two formal parameters match if they have the same direction, name, multiplicity bounds, ordering, uniqueness and type reference. Return true if the given member is either an OperationDefinition or an imported member whose referent is an OperationDefinition or an Operation, and the formal parameters of this operation definition match, in order, the parameters of the other operation definition or operation. In this context, matching means the same name and type (per UML Superstructure, Subclause 7.3.5). Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. A typed element definition for the formal parameter of an activity or operation. An indication of the direction of the parameter being defined. Returns true if the annotation is for a stereotype that has a metaclass consistent with Parameter. Return true if the given member is a FormalParameter. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. An annotation of a member definition indicating the application of a stereotype (or one of a small number of special-case annotations). Unless the stereotype name is "apply", "primitive" or "external" then the stereotype for a stereotype annotation is the stereotype denoted by the stereotype name. The stereotype name of a stereotype annotation must either be one of "apply", "primitive" or "external", or it must denote a single stereotype from a profile applied to an enclosing package. The stereotype name does not need to be qualified if there is only one applied profile with a stereotype of that name or if the there is a standard UML profile with the name. If the stereotype name of a stereotype annotation is "apply", then it must have a name list and all of the names in the list must resolve to profiles. If the stereotype name of a stereotype annotation is "primitive", then it may not have tagged values or names. If the stereotype name of a stereotype annotation is "external", then it may optionally have a single tagged value with the name "file" and no operator. If a stereotype annotation has a stereotype and tagged values, then the each tagged value must have the name of an attribute of the stereotype and a value that is legally interpretable for the type of that attribute. If a stereotype annotation has a stereotype and a list of names, then all the names in the list must resolve to visible model elements and the stereotype must have a single attribute with a (metaclass) type and multiplicity that are consistent with the types and number of the elements denoted by the given names. A set of tagged values for the applied stereotype. A set of references to model elements required for the stereotype being applied. The name of the stereotype being applied. The stereotype denoted by the stereotype name. An imported element is not a stub. An imported element is a feature if its referent is a feature. Returns false. (Imported members do not have annotations.) If the given member is not an imported member, then return the result of checking whether the given member is distinguishable from this member. Else, if the element of the referent for this member is an Alf member, then return the result of checking whether that element is distinguishable from the given member. Else, if the element of the referent for the given member is an Alf member, then return the result of checking whether that element is distinguishable from this member. Else, the referents for both this and the given member are UML elements, so return the result of checking their distinguishability according to the rules of the UML superstructure. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. The definition of an active class. The definition of an activity (which may be a stub) to act as the classifier behavior of the active class. Returns true if the given unit definition matches this active class definition considered as a class definition and the subunit is for an active class definition. A set of tagged values for a stereotype application. The tagged values in the set. The definition of a classifier. Each name listed in the specialization list for a classifier definition must have a single classifier referent. None of these referents may be templates. The specialization referents of a classifier definition are the classifiers denoted by the names in the specialization list for the classifier definition. The members of a classifier definition include non-private members inherited from the classifiers it specializes. The visibility of inherited members is as specified in the UML Superstructure, Subclause 7.3.8. Whether the classifier is abstract or not. The names of classifiers specialized by the classifier being defined. References to the classifiers to which the names in the specialization list resolve. The namespace definition associated with the given unit definition must be a classifier definition. The subunit classifier definition may be abstract if and only if the subunit classifier definition is abstract. The subunit classifier definition must have the same specialization referents as the stub classifier definition. (Note that it is the referents that must match, not the exact names or the ordering of those names in the specialization list.) The subunit classifier definition must also have a matching classifier template parameter for each classifier template parameter of the stub classifier definition. Two template parameters match if they have same names and the same specialization referents. The definition of a signal, whose members must all be properties. The specialization referents of a signal definition must all be signals. Returns true if the given unit definition matches this signal definition considered as a classifier definition and the subunit is for a signal definition. In addition to the annotations allowed for classifiers in general, a signal definition allows an annotation for any stereotype whose metaclass is consistent with Signal. Return true if the given member is either a SignalDefinition or an imported member whose referent is a SignalDefinition or a Reception (where signal reception definitions are considered to be kinds of signal definitions). Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. The common properties of the definitions of typed elements. If the lower bound string image of a typed element definition is not empty, then the integer lower bound is the integer value of the lower bound string. Otherwise the lower bound is equal to the upper bound, unless the upper bound is unbounded, in which case the lower bound is 0. The unlimited natural upper bound value is the unlimited natural value of the uper bound string (with "*" representing the unbounded value). The type of a typed element definition is the single classifier referent of the type name. The type name of a typed element definition must have a single classifier referent. This referent may not be a template. The string image of the literal given to specify the lower bound of the multiplicity of the element being defined. The string image of the literal given to specify the upper bound of the multiplicity of the element being defined. Whether the element being defined is ordered. Whether the element being defined is non-unique. The name of the type of the element being defined. The multiplicity lower bound of the element being defined. The multiplicity upper bound of the element being defined. The definition of a class, whose members may be properties, operations, signals or signal receptions. The specialization referents of a class definition must all be classes. A class definition may not have any referents that are active classes unless this is an active class definition. In addition to the annotations allowed for classifiers in general, a class definition allows an annotation for any stereotype whose metaclass is consistent with Class. Returns true if the given unit definition matches this class definition considered as a classifier definition and the subunit is for a class definition. Return true if the given member is either a ClassDefinition or an imported member whose referent is a ClassDefinition or a Class. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. The definition of an enumeration literal, as a member of an enumeration definition. Returns false. (Enumeration literal name cannot have annotations.) The definition of a package, all of whose members must be packageable elements. The applied profiles of a package definition are the profiles listed in any @apply annotations on the package. The profiles applied (directly) to this package. In addition to the annotations allowed on any namespace definition, a package definition allows @apply annotations plus any stereotype whose metaclass is consistent with Package. Returns true of the namespace definition associated with the given unit definition is a package definition. Return true if the given member is either a PackageDefinition or an imported member whose referent is a PackageDefinition or a Package. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. The definition of an enumeration, whose members must all be enumeration literal names. The specialization referents of a class definition must all be classes. A class definition may not have any referents that are active classes unless this is an active class definition. Returns true if the given unit definition matches this enumeration definition considered as a classifier definition and the subunit is for an enumeration definition. In addition to the annotations allowed for classifiers in general, an enumeration definition allows an annotation for any stereotype whose metaclass is consistent with Enumeration. Return true if the given member is either an EnumerationDefinition or an imported member whose referent is an EnumerationDefinition or an Enumeration. Returns true if the given member is distinguishable from this member. By default, this means that the names of the members are different. However, in any case that the UML Superstructure considers two names to be distinguishable if they are different, an Alf implementation may instead impose the stronger requirement that the names not be conflicting. An import reference to a package all of whose public members are to be imported. The referent of a package import must be a package.