[Haskell-cafe] parsec and multiple simultaneous token types

Stephen Tetley stephen.tetley at gmail.com
Mon Mar 29 06:07:12 EDT 2010


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


More information about the Haskell-Cafe mailing list