It didn't surprise me, but some people might wonder how I could have a bunch of bugs left in the parsing code, when I had pretty complete test coverage.
It wasn't because the bugs were in the few lines that weren't executed by the tests.
The problem is that just executing every line doesn't means you've tested all the possible "paths" through the code. And it certainly doesn't mean you've tested every possible input.
For something like the parser with many branches (if's and loop's) and deeply recursive, it's pretty much impossible to test every possible "path".
I still think it's worthwhile aiming for good test coverage. If you don't have good coverage that means there are parts of your code that haven't ever been run by your tests. And we all hate the bugs that seem so blatant that people say "didn't you run this?".
So just don't let good test coverage give you a false sense of security. There can still be lots of bugs hiding in those untested execution paths.