This is a library of parser combinators, originally written by Koen Claessen. It parses all alternatives in parallel, so it never keeps hold of the beginning of the input string, a common source of space leaks with other parsers. The '(+++)' choice combinator is genuinely commutative; it makes no difference which branch is "shorter".
See also Koen's paper Parallel Parsing Processes (http://www.cs.chalmers.se/~koen/publications.html).
This version of ReadP has been locally hacked to make it H98, by Martin Sjögren firstname.lastname@example.org
|The ReadP type|
|type ReadP r a = Parser r Char a|
|Running a parser|
The following are QuickCheck specifications of what the combinators do. These can be seen as formal specifications of the behavior of the combinators.
We use bags to give semantics to the combinators.
type Bag a = [a]
Equality on bags does not care about the order of elements.
(=~) :: Ord a => Bag a -> Bag a -> Bool xs =~ ys = sort xs == sort ys
A special equality operator to avoid unresolved overloading when testing the properties.
(=~.) :: Bag (Int,String) -> Bag (Int,String) -> Bool (=~.) = (=~)
Here follow the properties:
prop_Get_Nil = readP_to_S get  =~  prop_Get_Cons c s = readP_to_S get (c:s) =~ [(c,s)] prop_Look s = readP_to_S look s =~ [(s,s)] prop_Fail s = readP_to_S pfail s =~.  prop_Return x s = readP_to_S (return x) s =~. [(x,s)] prop_Bind p k s = readP_to_S (p >>= k) s =~. [ ys'' | (x,s') <- readP_to_S p s , ys'' <- readP_to_S (k (x::Int)) s' ] prop_Plus p q s = readP_to_S (p +++ q) s =~. (readP_to_S p s ++ readP_to_S q s) prop_LeftPlus p q s = readP_to_S (p <++ q) s =~. (readP_to_S p s +<+ readP_to_S q s) where  +<+ ys = ys xs +<+ _ = xs prop_Gather s = forAll readPWithoutReadS $ \p -> readP_to_S (gather p) s =~ [ ((pre,x::Int),s') | (x,s') <- readP_to_S p s , let pre = take (length s - length s') s ] prop_String_Yes this s = readP_to_S (string this) (this ++ s) =~ [(this,s)] prop_String_Maybe this s = readP_to_S (string this) s =~ [(this, drop (length this) s) | this `isPrefixOf` s] prop_Munch p s = readP_to_S (munch p) s =~ [(takeWhile p s, dropWhile p s)] prop_Munch1 p s = readP_to_S (munch1 p) s =~ [(res,s') | let (res,s') = (takeWhile p s, dropWhile p s), not (null res)] prop_Choice ps s = readP_to_S (choice ps) s =~. readP_to_S (foldr (+++) pfail ps) s prop_ReadS r s = readP_to_S (readS_to_P r) s =~. r s
|Produced by Haddock version 0.6|