aggregate ::= [ expression_specification ] '\{' named_expressions '\}' .
expression_specification::= identifier '@' .
named_expressions ::= [ designator ':=' ] general_expression
( ',' [ designator ':=' ] general_expression )\stern .
Example:
{
{ void, 3, bottom @{void, 4, void},
1,
{bottom,2,void}
}
An aggregate defines the values of the attributes of the type constructor to which it belongs. An aggregate yields as its result a value of the type constructor preceding it. In creating this value other objects to which elements of the aggregate refer may be created. Aggregates without a preceding type constructor may only occur as substructures of a larger aggregate; their type is given by the type of the attribute to which it is assigned; this type must not be polymorphic.
The expressions of an aggregate are evaluated simultaneously. The resulting values are assigned to the non-shared non-private variable attributes of a new object of the type of the aggregate in the order of the attribute declarations, thus overriding all existing initializiations of those attributes. This includes the attribute declarations which are inherited from other classes. In case assignments are given instead of expressions the designators of those assignments must be attribute names of the object; only the specified attributes are assigned to. Such named expressions must follow any unnamed expressions in the aggregate.
Within an aggregate the aggregate itself or any substructure can be prefixed by an identifier which, during evaluation of the aggregate will designate the reference of the object being created. This identifier may be used within the aggregate and its potential substructures instead of an expression and then evaluates to the object reference it designates.
Thus, for reference types not only tree-like object graphs but also DAGs and circular graphs can be constructed.