[Haskell-cafe] Re: Re: A parsec question

Ben Franksen ben.franksen at online.de
Wed Sep 29 16:43:59 EDT 2010


Daniel Fischer wrote:
> On Wednesday 29 September 2010 19:10:22, Ben Franksen wrote:
>> >
>> > Note the last line mentions only '}'. I would rather like to see
>> >
>> >   expecting "}" or digit
>> >
>> > since the parser could very well accept another digit here.
> 
> parsec2 did that, I don't know whether that change is intentional or
> accidental.

This looks more like a bug than a feature to me. I checked parsec-3.0.1 and
it behaves like parsec-2, i.e. behaves as I expected.

>> > (1) What is the reason for this behaviour?
>> > (2) Is there another combinator that behaves as I would like?
>> > (3) Otherwise, how do I write one myself?
>>
>> I just saw that Christian Maeder answered a similar question recently. I
>>
>> tried his suggestion of using manyTill and bingo:
>> > {-# LANGUAGE NoMonomorphismRestriction #-}
>> > import Control.Applicative ((*>),(<*))
>> > import Text.Parsec
>> > block p = char '{' *> p <* char '}'
>> > parser = block (manyTill digit (char '}'))
>> > main = parseTest parser "{123a}"
> You would need
> 
> block (manyTill digit (lookAhead (char '}'))
> 
> to replicate the behaviour of block (many digit).

Right, so it gets even more complicated.

>> Is there a non-greedy variant of 'many' so
>> that modularity gets restored and efficiency is not lost?

So many questions...

Cheers
Ben



More information about the Haskell-Cafe mailing list