X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Text%2FParserCombinators%2FReadPrec.hs;h=1fbada4c3b8eab8ec874246e33663ff7bc9c066f;hb=fcf4aa473708347cb25241cd6aa6547a05c51920;hp=bfb4fc2ee26c5e7541dcac924db4bd5b16eae42d;hpb=83022ae61d9138aa6c96f770bd374084481de954;p=ghc-base.git diff --git a/Text/ParserCombinators/ReadPrec.hs b/Text/ParserCombinators/ReadPrec.hs index bfb4fc2..1fbada4 100644 --- a/Text/ParserCombinators/ReadPrec.hs +++ b/Text/ParserCombinators/ReadPrec.hs @@ -7,41 +7,47 @@ -- -- Maintainer : libraries@haskell.org -- Stability : provisional --- Portability : portable +-- Portability : non-portable (uses Text.ParserCombinators.ReadP) -- +-- This library defines parser combinators for precedence parsing. + ----------------------------------------------------------------------------- module Text.ParserCombinators.ReadPrec - ( ReadPrec -- :: * -> *; instance Functor, Monad, MonadPlus + ( + ReadPrec, -- :: * -> *; instance Functor, Monad, MonadPlus -- * Precedences - , Prec -- :: *; = Int - , minPrec -- :: Prec; = 0 + Prec, -- :: *; = Int + minPrec, -- :: Prec; = 0 - -- * Primitive operations - , lift -- :: ReadP a -> ReadPrec a - , prec -- :: Prec -> ReadPrec a -> ReadPrec a - , step -- :: ReadPrec a -> ReadPrec a - , reset -- :: ReadPrec a -> ReadPrec a + -- * Precedence operations + lift, -- :: ReadP a -> ReadPrec a + prec, -- :: Prec -> ReadPrec a -> ReadPrec a + step, -- :: ReadPrec a -> ReadPrec a + reset, -- :: ReadPrec a -> ReadPrec a -- * Other operations - , get -- :: ReadPrec Char - , look -- :: ReadPrec String - , (+++) -- :: ReadPrec a -> ReadPrec a -> ReadPrec a - , pfail -- :: ReadPrec a - , choice -- :: [ReadPrec a] -> ReadPrec a - - -- converters - , readPrec_to_P -- :: ReadPrec a -> (Int -> ReadP a) - , readP_to_Prec -- :: (Int -> ReadP a) -> ReadPrec a - , readPrec_to_S -- :: ReadPrec a -> (Int -> ReadS a) - , readS_to_Prec -- :: (Int -> ReadS a) -> ReadPrec a + -- All are based directly on their similarly-naned 'ReadP' counterparts. + get, -- :: ReadPrec Char + look, -- :: ReadPrec String + (+++), -- :: ReadPrec a -> ReadPrec a -> ReadPrec a + (<++), -- :: ReadPrec a -> ReadPrec a -> ReadPrec a + pfail, -- :: ReadPrec a + choice, -- :: [ReadPrec a] -> ReadPrec a + + -- * Converters + readPrec_to_P, -- :: ReadPrec a -> (Int -> ReadP a) + readP_to_Prec, -- :: (Int -> ReadP a) -> ReadPrec a + readPrec_to_S, -- :: ReadPrec a -> (Int -> ReadS a) + readS_to_Prec, -- :: (Int -> ReadS a) -> ReadPrec a ) where import Text.ParserCombinators.ReadP ( ReadP + , ReadS , readP_to_S , readS_to_P ) @@ -49,14 +55,15 @@ import Text.ParserCombinators.ReadP import qualified Text.ParserCombinators.ReadP as ReadP ( get , look - , (+++) + , (+++), (<++) , pfail - , choice ) import Control.Monad( MonadPlus(..) ) +#ifdef __GLASGOW_HASKELL__ import GHC.Num( Num(..) ) import GHC.Base +#endif -- --------------------------------------------------------------------------- -- The readPrec type @@ -88,21 +95,22 @@ minPrec = 0 -- Operations over ReadPrec lift :: ReadP a -> ReadPrec a +-- ^ Lift a predence-insensitive 'ReadP' to a 'ReadPrec' lift m = P (\_ -> m) step :: ReadPrec a -> ReadPrec a --- Increases the precedence context by one +-- ^ Increases the precedence context by one step (P f) = P (\n -> f (n+1)) reset :: ReadPrec a -> ReadPrec a --- Resets the precedence context to zero +-- ^ Resets the precedence context to zero reset (P f) = P (\n -> f minPrec) prec :: Prec -> ReadPrec a -> ReadPrec a --- (prec n p) checks that the precedence context is +-- ^ @(prec n p)@ checks that the precedence context is -- less than or equal to n, --- if not, fails --- if so, parses p in context n +-- * if not, fails +-- * if so, parses p in context n prec n (P f) = P (\c -> if c <= n then f n else ReadP.pfail) -- --------------------------------------------------------------------------- @@ -117,6 +125,9 @@ look = lift ReadP.look (+++) :: ReadPrec a -> ReadPrec a -> ReadPrec a P f1 +++ P f2 = P (\n -> f1 n ReadP.+++ f2 n) +(<++) :: ReadPrec a -> ReadPrec a -> ReadPrec a +P f1 <++ P f2 = P (\n -> f1 n ReadP.<++ f2 n) + pfail :: ReadPrec a pfail = lift ReadP.pfail @@ -126,10 +137,6 @@ choice ps = foldr (+++) pfail ps -- --------------------------------------------------------------------------- -- Converting between ReadPrec and Read --- We define a local version of ReadS here, --- because its "real" definition site is in GHC.Read -type ReadS a = String -> [(a,String)] - readPrec_to_P :: ReadPrec a -> (Int -> ReadP a) readPrec_to_P (P f) = f