This is a compiler for the Asterix language.  It consists of a front-end
compiler and a run time system (RTS).

Both the compiler and the generated code are ANSI-C.  The lexical analyzer
is written in Flex, the parser in Bison.  Use gmake to compile.  The use of
gcc is highly encouraged, because gcc is able to automatically generate .d
files with file dependencies.

The structure of the compiler is simple: there are declarations, expressions,
statements, and types.  Each of these types has a field "subtype" which
states the exact nature of the object.

There is also a generic list type.  It is implemented as an infinitely
growable array of void *.  C lacks generic types, so it is not possible to
specify the exact type of an element.  All elements of a list are pointers
to the same type; for example a list of formal parameters contains
Declaration *, while a list of actual arguments contains Expression *.

Be careful using pointers.  Whenever something goes wrong due to bad input,
null pointers are used for missing expressions, unresolved types, and so on.
During semantic analyses do not expect a pointer to be non-null.  The only
exception is a pointer to a token, and to token->name, which always points
to something valid.  If there are no lexical, parse, and semantic errors,
the compiler starts generating code; in this phase one can safely assume
no null-pointers.

Finally, be sure to read the comments in the header files!
