[Haskell-cafe] Re: Parsec is being weird at me

Chris Casinghino chris.casinghino at gmail.com
Sat Aug 25 17:37:28 EDT 2007


The following two messages didn't make it to the list the first time
because I sent from the wrong address.  oops!  Hopefully these answer
the question.


Message 1:

On 8/25/07, Andrew Coppin <andrewcoppin at btinternet.com> wrote:
> Stefan O'Rear wrote:
> > There is one other little bit of documented behavior.  Parsec's normal
> > combinators only parse LL(1) grammars.  Consult any work on formal
> > languages for the exact meaning and all the consequences, however for
> > this example it serves to note that after seeing abc, the single
> > character of lookahead '#' is not sufficient to determine the correct
> > parse.
> >
>
> I thought the whole *purpose* of the endBy combinator was to keep
> applying one parser until the other one succeeds?


I don't think this is a lookahead problem, but rather just a
misreading of the spec of endBy.  Here it is:

(endBy p sep) parses zero or more occurrences of p, seperated and
ended by sep. Returns a list of values returned by p.

The key text is "seperated and ended by sep".  Not just ended by.

Of course, the lookahead restriction is real, so just writing

do {s <- many anyToken; char '#'; return s}

won't work either.

I'm not sure there is a built in combinator for what you want, but
you could perhaps write:

do {s <- many (satisfy (/= '#')); char '#'; return s}

perhaps there is a more efficient way.

--Chris

------
Message 2:

>
> I'm not sure there is a built in combinator for what you want,
>

I guess I should have looked harder.  What you want is manyTill:

"manyTill  :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a]

(manyTill p end) applies parser p zero or more times until parser end
succeeds. Returns the list of values returned by p."

--Chris


More information about the Haskell-Cafe mailing list