
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
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