I agree, it's surprisingly usable given how complicated parsing can be! I think the key to its ease of use, at least for me, is that you can unit test the individual parsers. You can program very iteratively, building it piece by piece and testing as you go.
This is much easier than trying to design the entire parser on a whiteboard/paper and implement it in one big go, I think.
This is much easier than trying to design the entire parser on a whiteboard/paper and implement it in one big go, I think.