I've built a somewhat easy to read internal DSL for combining parsers. For example:
ParcoaParser *yes = [Parcoa string:@"yes"];
ParcoaParser *no = [Parcoa string:@"no"];
ParcoaParser *answer = [yes or: no];
https://github.com/brotchie/Parcoa