Udo Stenzel wrote:
Chris Kuklewicz wrote:
Again, Parsec requires you to put "try" where you need it

I'm pretty sure it does, although this

Udo Stenzel wrote:
countBetween 0 n p = p <:> countBetween   0   (n-1) p <|> return []

is a place where it's not needed in general.  You should know what
you're doing, though.  And I like ReadP better in general, exactly
because 'try' is a bit trippy.


Udo.

I just tried to mimic regular expression matching with ReadP and got what seems like a non-terminating program. Is there another way to use ReadP to do this?

import Control.Monad
import Text.ParserCombinators.ReadP

type R = ReadP Int

-- Consume a specific character, return length 1
c :: Char -> R
c x = char x >> return 1

-- Consume like x? x+ x* and return the length
quest,plus,star :: R -> R
quest x = option 0 x
plus x = liftM sum (many1 x)
star x = liftM sum (many x)

-- Concatenate two with sum of lengths
infixr 5 +>
(+>) :: R -> R -> R
(+>) x y = liftM2 (+) x y

-- Concatenate list with running total of length
match xs = match' xs 0
  where match' [] t = return t
        match' (x:xs) t = do v <- x
                             match' xs $! t+v

-- Simulate "(a?|b+|c*)*d" regular expression
test = star (choice [quest (c 'a')
                    ,plus (c 'b')
                    ,star (c 'c')]) +> c 'd'

go foo = readP_to_S test foo

'go' works if I remove the leading 'star' operation from 'test'

But 'go' seems to not terminate with the leading 'star'

My regex-dfa package has a failure which seems similar, and I have been adding the ability to internally rewrite the pattern to avoid the problem.

--
Chris
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to