Generator TODOs:

- Un-full-path programs when using remote compilation and execution
- 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.
  - It might be possible to do this if we deferred creation of the match_#
    rule lists so that there is only one active rule list with its allocated
    rules. That way we could just count how many total terminals have been
    created of a given type. (If more than one match_# has allocated its
    rules, this count will be more than it should be.)

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

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.
- Be smarter about when to make copies of $1, $2, etc in Do_Action and
  Undo_Action. See if we can avoid all the new()s and delete()s.
