add exercise 2.2: recursive-descent parser combinators