Remove the value field in the iterator: most iterators are only dereferenced once, and so we don't gain much, but we do make every AST node two words bigger.
Begin removing systems Hungarian notation from public fields.
Use std::shared_ptr to control buffer ownership.
Don't use dynamic_cast<> if compiling without RTTI.
It's only used for error checking in these cases.
Exceptions are still needed for left-recursion stuff - they also should be removed.
Factor out some horrible copy-and-paste coding.
Don't use exceptions to unwind for left recursion detection.