Amending some of Dwight's comments on the first commit:
    - reverted the double comma from Ambiguity. Printing ambiguities into the backend needs to be handled a different way.
    - created getters for special production types.
    - created a getTerminatorKLabel in UserList to generalize the generation of the KLabel form of ListTerminators
    - split the regular expression for whitespace into 3 parts to make it more readable
    - various documentation improvements
Added javadoc to Parser.ParseError.
Use KExceptionGroup.PARSER for parse error.
Change Grammar.startNonTerminals to a BiMap instead of a Map.
Javadoc PrimitiveState.sort.
Move comment to proper place.
Make non-terminal ordering info be package-private.
Remove unnessisary constructor from NonTerminal.
Make constructors for EntryState and ExitState package private.
Remove unused method.
Updated the whitespace generation pass.
Eliminated StateId in favor of using strings.
(They were only used for debugging and error reporting anyway.)
Eliminate NonTerminalId in favor of Strings.
Fix to error message.
Various code improvements for the Parser.
Moved benchmarking code to ParserTest.
Better handling of assertions.
Collapse common cases.
Make Rule.MetaData explicit.
Fixing the pattern used in the regular expression for terminals to accept anything.