ReadP and choice
Edward Kmett
ekmett at gmail.com
Sun Feb 26 18:15:16 CET 2012
On Sat, Feb 25, 2012 at 5:21 PM, Ian Lynagh <igloo at earth.li> wrote:
>
> Hi all,
>
> The code below defines a ReadP parser which can parse either a keyword
> "wrapper" or an arbitrary identifier. I was hoping that it would give
> the output
> (CWrapper1,"")
> (CWrapper2,"")
> (CFunction "wrapper","")
> but it actually gives
> (CWrapper2,"")
> (CFunction "wrapper","")
> (CWrapper1,"")
> i.e. completed parses are returned before the parse that needs to "look"
> at the remaining input.
>
I can see the logic behind the current behaviour, but in this case at
> least it's quite inconvenient.
>
> What do you think?
> Did I miss a better way to solve the problem?
> Should the behaviour be changed?
> If so, is changing it easy?
This is because ReadP is breadth first and the results are returned as they
are determined.
Can you get away with switching to (<++) , which will let you more or less
pretend you are using a biased parser like parsec and will only give you
the single result you want?
Any change to ReadP that sorts the current breadth-first search state is
going to incur an asymptotic increase in overhead when you have multiple
parses and I don't think it would be a good idea.
-Edward
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/libraries/attachments/20120226/6c1eb06c/attachment.htm>
More information about the Libraries
mailing list