Bug fix: writing the token caching functionality introduced a bug in which tokens were not being shifted from the token stream properly. This has been fixed. I also reversed the order in which parse table elements are inserted into the array, so elements that occur earlier in the initializing list will take precedence over (and not be replaced by parsers of the same token type) occurring later in the initialization list. I think this is more intuitive as it behaves similarly to how a list of parsers would behave if they were evaluated using ordinary 'Control.Monad.msum' instead of the 'Dao.NewParser.evalParseTable' function.
Bug fix: writing the token caching functionality introduced a bug in which tokens were not being shifted from the token stream properly. This has been fixed. I also reversed the order in which parse table elements are inserted into the array, so elements that occur earlier in the initializing list will take precedence over (and not be replaced by parsers of the same token type) occurring later in the initialization list. I think this is more intuitive as it behaves similarly to how a list of parsers would behave if they were evaluated using ordinary 'Control.Monad.msum' instead of the 'Dao.NewParser.evalParseTable' function.

printedheart/Dao