There are 4 predefined types: int, bool, clock, and chan. Array and record types can be defined over these are and other types.
Type ::= Prefix TypeId [ Range ]
Prefix ::= 'urgent' | 'broadcast' | 'meta' | 'const'
TypeId ::= 'int' | 'clock' | 'chan' | 'bool'
| 'struct' '{' FieldDecl (FieldDecl)* '}'
FieldDecl ::= Type ID ArrayDecl* (',' ID ArrayDecl*)* ';'
Range ::= '[' Expression ',' Expression ']'
ArrayDecl ::= '[' Expression ']'
The default range of an integer is [-32768, 32767]. Any assignment out of range will cause the successor state to be invalid, see also the sections on expressions and the semantics.
Variables of type bool can have the values false and true, which are equivalent to the the integer values 0 and 1. Like in C, any non-zero integer value evalutes to true and 0 evaluates to false.
Channels can be declared as urgent and/or broadcast channels. See the section on synchronisations for information on urgent and broadcast channels.
Integers, booleans and arrays and records over integers and booleans can be marked constant by prefixing the type with the keyword const.
Integers, booleans and arrays and records over integers and booleans can be marked as meta variables by prefixing the type with the keyword meta.
Meta variables are stored in the state vector, but are sematically not considered part of the state. I.e. two states which only differ in meta variables are considered to be equal.
Record types following C notation using the struct keyword. The UPPAAL type checker uses name equivalence for record types, i.e. the following is not allowed:
struct
{
int a;
int b;
} s;
struct
{
int a;
int b;
} t;
s = t; // ERROR: Different types!