Generator TODOs:

- Update the language grammar so that it supports equivalences, so that the
  terminal input file is not necessary in this case either.
- Change the directory mirroring so that it removes additonal files from
  output/src, but not others. Need to update the GNUmakefile to remove .o and
  .d files if the corresponding source file is missing. This will make -f
  largely unnecessary, and will allow reuse of already compiled generator
  files.
- Add support for non-rsync copying solutions.
- Actually parse the C/C++ in the HEAD and TAIL, moving implementation stuff
  out of the head and replacing it with extern declarations. Right now we have
  a Perl hack.
  - I could try Inline::C::ParseRegExp or Inline::C::ParseRecDescent for C,
    and Inline::CPP::grammar for C++.
  - Parse::RecDescent has a pretty functional demo_Cgrammar.pl, but the
    demo_cpp.pl seems a bit limited.
  - PERCEPS (http://starship.python.net/crew/tbryan/PERCEPS/) is a Perl header
    file parser. Not sure how well it would work for the head section of a
    YACC or LEX input file.
- Test it on more grammars
- Once Parse::Yapp progresses past 1.05, see if we can update our code to
  remove any workarounds and such.
- Add a simple non-equivalence "FOO_#" which just generates strings.  (OOPS!
  This is hard because we don't know how many to generate! We would need to
  know the total number of terminals of the given type that are in the string,
  but all we have is a pointer to the previous rule.)

-----------------------------------------------------------------------------

Fault tree TODOs:

- Check/fix type order vs. system event order. Maybe some FTs are not being
  generated...
- All Ensure_* functions should return a bool

-----------------------------------------------------------------------------

Generated code TODOs:

- Is there some way to implement Clone() in the Rule base class using RTTI?
- make dist fails for generated code (todo.txt, etc). Need to update the
  makefile
- See if we can prevent so many copies for Get_Value() and Do/Undo_Action.
- Speed up the generation, hopefully by reducing the amount of recursion. (1)
  I've noticed that the generator calls reset a lot, then calls reset again
  while checking for strings. Sometimes this is necessary, but always? (2) Can
  we modify the code so that you don't have to call reset before calling check
  for strings?
- Copy const for pointer return values
- Improve the length computation for the grammar productions as an
  optimization on when rules are active. Right now we just use the minimum,
  but we could compute the modulus for recursive grammars. NOTE: It's not
  clear that this will actually save us a lot of work, given that I've
  implemented an optimization to cache previously generated allocations.
