A type can be declared in a record descriptor by using the
%typedef
special field. The syntax is:
%typedef: type_name type_description
Where type_name is the name of the new type, and
type_description a description which varies depending of the
kind of type. For example, this is how a type Age_t
could
be defined as numbers in the range 0..120
:
%typedef: Age_t range 0 120
Type names are identifiers having the following syntax:
[a-zA-Z][a-zA-Z0-9_-]*
Even though any identifier with that syntax could be used for types,
it is a good idea to consistently follow some convention to help
distinguishing type names from field names. For example, the
_t
suffix could be used for types.
A type can be declared to be a synonym of another type. The syntax is:
%typedef: type_name other_type_name
Where type_name is declared to be a synonym of other_type_name. This is useful to avoid duplicated type descriptions. For example, consider the following example:
%typedef: Id_t int %typedef: Item_t Id_t %typedef: Transaction_t Id_t
Both Item_t
and Transaction_t
are synonyms for the type
Id_t
. They are both numeric identifiers.
The order of the %typedef
fields is not relevant. In
particular, a type definition can reference other type that is defined
below. The previous example could have been written as:
%typedef: Item_t Id_t %typedef: Transaction_t Id_t %typedef: Id_t int
Integrity checks will complain if undefined types are referenced, and if there are loops (direct or indirect) in type declarations. For example, the following set of declarations contains a loop and are thus invalid:
%typedef: A_t B_t %typedef: B_t C_t %typedef: C_t A_t
The scope of a type is the record descriptor where it is defined.