
Hi Jeremy Have you considered rolling your own parser? If you don't want say the expression parser or the language defs, quite a bit of Parsec's machinery is now standard-ish. For instance, most of the combinators in Text.ParserCombinators.Parsec.Combinator are general control operators and can be made on top of an applicative functor with Alternative. I posted a set of them to haskell-cafe a few months ago, though later I found a bug in one of them. Ross Paterson has put versions of the permutation combinators that need only Applicative / Alternative on Hackage: http://hackage.haskell.org/package/action-permutations If you don't want to go so far, you might still want to make the nextSegment parser higher order - at the moment it looks like you are calling nextSegment to pull a lexeme into some context and using the sequencing of the do-notation to run the next parser on the context. It might be preferable if nextSegment operated more like this: h_then_o <- nextSegment (char 'h' >> char 'o') I'm guessing an implementation something like nextSegment :: GenParser String a -> GenParser String a nextSegment p = do xs <- token let ans = runParserSomehow p xs return ans Best wishes Stephen