Datadec takes inductive (or recursive) data types modelled on those found in
functional languages (Hope, Miranda, Haskell etc) and generates ANSI C code
to implement them.

			Duncan C. White, dcw@doc.ic.ac.uk
			19th March 2002

New!  experimental free functions (run datadec with new -f option)

			Duncan C. White, d.white@imperial.ac.uk
			28th May 2014

An Example of Datadec in Action
-------------------------------

To give you a feel for what datadec can do, you could write:

intlist = nil
        | cons( int first, intlist next )
        ;

illist  = nil
        | cons( intlist first, illist next )
        ;

idtree  = leaf( string id, illist l )
        | node( idtree left, idtree right )
        ;
</pre>

What does this mean?  
The first rule declares that an intlist can take two basic "shapes" -
it is either empty, aka nil, or of the form cons(int,intlist).
nil() and cons() are called constructors, and define different
"shapes" that objects of the type can take.
However, because the second argument of a cons() constructor is itself
an intlist, this type is said to be recursively or inductively defined.
Functional programmers will recognise nil or cons() as the standard
way of defining a list, so more intuitively, intlist is simply
a list of integers!

Reading on, an illist is declared as a list of intlists,
and an idtree is declared as a binary tree where each leaf node
contains a (string, illist) pair.

Given this input, datadec can automatically construct an ANSI C
module which implements all the data types, a constructor function for
each constructor, deconstructor functions to help you to take objects
apart again and printing functions to help you with debugging.

(Plus, new May 2014: a tree-walking free function if you invoke datadec
with the new -f option).

Building and Packaging datadec
------------------------------

See the INSTALL file for building and packaging instructions.

Testing
-------

Having built datadec in the source directory, you can also compile and
run a test harness in the test directory.  test/cdata.in is the datadec
input file which declares some recursive data types (lists and trees),
and ctest.c is the test harness that uses them.  cd into test and run make
to turn cdata.in into cx.h and cx.c, and to compile cx.c and ctest.c and
link them..
