If the grammar allows "ERROR" in a recursive location, error handling
can loop for every.
e.g.
foo -> foo bar
foo -> ERROR
Rather than detect and reject such grammars, detect the infinite loop
as it start, and discard an extra token.
i.e. if error handling doesn't discard any tokens from the input
stream, and another error is triggered before anything is shifted, then
we force the next error handling phase to discard at least one token,
or to abort if that token is EOF.