First pass at a parser combinator