[Haskell-beginners] parse block comments

mike h mike_k_houghton at yahoo.co.uk
Sat Mar 18 22:49:11 UTC 2017


Monadic and applicative.

blockCmnt :: Parser ()
blockCmnt = do
  string "{-"
  manyTill item (string "-}")
  return ()

manyTill p endp = scan where
  scan = do 
           endp
           return []
           <|>
           do
            x <- p
            xs <- scan
            return (x:xs)


blockCmnt' :: Parser () 
blockCmnt' = string "{-" >> manyTill item (string "-}") >> return ()

manyTill' p endp = scan' where
  scan' = endp *> return [] <|> pure (:) <*> p <*> scan’

Thanks.
M

> On 18 Mar 2017, at 21:47, Francesco Ariis <fa-ml at ariis.it> wrote:
> 
> On Sat, Mar 18, 2017 at 09:11:20PM +0000, mike h wrote:
>> Hi,
>> 
>> Below is code I’m building up  for simple monadic and applicative parsers
>> from first principles.
> 
> Hello Mike,
>    You might want to check `manyTill` from Parsec to get an idea:
> 
>    manyTill :: (Stream s m t) => ParsecT s u m a -> ParsecT s u m end -> ParsecT s u m [a]
>    manyTill p end      = scan
>        where
>              scan  = do { end; return [] } <|>
>                      do { x <- p; xs <- scan; return (x:xs) }
> 
> 
> The 'trick' lies in <|> (alternative). Does that help?
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners



More information about the Beginners mailing list