Turns out writing recursive descent parsers by hand is annoying or I don't understand it well enough so I wrote some combinators.