{-# LANGUAGE Trustworthy #-}{-# LANGUAGE NoImplicitPrelude #-}------------------------------------------------------------------------------- |-- Module : GHC.Internal.Text.ParserCombinators.ReadPrec-- Copyright : (c) The University of Glasgow 2002-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : provisional-- Portability : non-portable (uses Text.ParserCombinators.ReadP)---- This library defines parser combinators for precedence parsing.-----------------------------------------------------------------------------moduleGHC.Internal.Text.ParserCombinators.ReadPrec (ReadPrec ,-- * PrecedencesPrec ,minPrec ,-- * Precedence operationslift ,prec ,step ,reset ,-- * Other operations-- | All are based directly on their similarly-named 'ReadP' counterparts.get ,look ,(+++) ,(<++) ,pfail ,choice ,-- * ConvertersreadPrec_to_P ,readP_to_Prec ,readPrec_to_S ,readS_to_Prec ,)whereimportGHC.Internal.Text.ParserCombinators.ReadP (ReadP ,ReadS ,readP_to_S ,readS_to_P )importqualifiedGHC.Internal.Text.ParserCombinators.ReadP asReadP(get ,look ,(+++) ,(<++) ,pfail )importGHC.Internal.Num (Num (..))importGHC.Internal.Base importGHC.Internal.Control.Monad.Fail -- ----------------------------------------------------------------------------- The readPrec typenewtypeReadPrec a =P (Prec ->ReadP a )-- Functor, Monad, MonadPlus-- | @since base-2.01instanceFunctor ReadPrec wherefmap :: forall a b. (a -> b) -> ReadPrec a -> ReadPrec b fmap a -> b h (P Prec -> ReadP a f )=(Prec -> ReadP b) -> ReadPrec b forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec n ->(a -> b) -> ReadP a -> ReadP b forall a b. (a -> b) -> ReadP a -> ReadP b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap a -> b h (Prec -> ReadP a f Prec n ))-- | @since base-4.6.0.0instanceApplicative ReadPrec wherepure :: forall a. a -> ReadPrec a pure a x =(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec _->a -> ReadP a forall a. a -> ReadP a forall (f :: * -> *) a. Applicative f => a -> f a pure a x )<*> :: forall a b. ReadPrec (a -> b) -> ReadPrec a -> ReadPrec b (<*>) =ReadPrec (a -> b) -> ReadPrec a -> ReadPrec b forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b ap liftA2 :: forall a b c. (a -> b -> c) -> ReadPrec a -> ReadPrec b -> ReadPrec c liftA2 =(a -> b -> c) -> ReadPrec a -> ReadPrec b -> ReadPrec c forall (m :: * -> *) a1 a2 r. Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2 -- | @since base-2.01instanceMonad ReadPrec whereP Prec -> ReadP a f >>= :: forall a b. ReadPrec a -> (a -> ReadPrec b) -> ReadPrec b >>= a -> ReadPrec b k =(Prec -> ReadP b) -> ReadPrec b forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec n ->doa <-Prec -> ReadP a f Prec n ;letP f' =k a inf' n )-- | @since base-4.9.0.0instanceMonadFail ReadPrec wherefail :: forall a. String -> ReadPrec a fail String s =(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec _->String -> ReadP a forall a. String -> ReadP a forall (m :: * -> *) a. MonadFail m => String -> m a fail String s )-- | @since base-2.01instanceMonadPlus ReadPrec -- | @since base-4.6.0.0instanceAlternative ReadPrec whereempty :: forall a. ReadPrec a empty =ReadPrec a forall a. ReadPrec a pfail <|> :: forall a. ReadPrec a -> ReadPrec a -> ReadPrec a (<|>) =ReadPrec a -> ReadPrec a -> ReadPrec a forall a. ReadPrec a -> ReadPrec a -> ReadPrec a (+++) -- precedencestypePrec =Int minPrec ::Prec minPrec :: Prec minPrec =Prec 0-- ----------------------------------------------------------------------------- Operations over ReadPreclift ::ReadP a ->ReadPrec a -- ^ Lift a precedence-insensitive 'ReadP' to a 'ReadPrec'.lift :: forall a. ReadP a -> ReadPrec a lift ReadP a m =(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec _->ReadP a m )step ::ReadPrec a ->ReadPrec a -- ^ Increases the precedence context by one.step :: forall a. ReadPrec a -> ReadPrec a step (P Prec -> ReadP a f )=(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec n ->Prec -> ReadP a f (Prec n Prec -> Prec -> Prec forall a. Num a => a -> a -> a + Prec 1))reset ::ReadPrec a ->ReadPrec a -- ^ Resets the precedence context to zero.reset :: forall a. ReadPrec a -> ReadPrec a reset (P Prec -> ReadP a f )=(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec _->Prec -> ReadP a f Prec minPrec )prec ::Prec ->ReadPrec a ->ReadPrec a -- ^ @(prec n p)@ checks whether the precedence context is-- less than or equal to @n@, and---- * if not, fails---- * if so, parses @p@ in context @n@.prec :: forall a. Prec -> ReadPrec a -> ReadPrec a prec Prec n (P Prec -> ReadP a f )=(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec c ->ifPrec c Prec -> Prec -> Bool forall a. Ord a => a -> a -> Bool <= Prec n thenPrec -> ReadP a f Prec n elseReadP a forall a. ReadP a ReadP.pfail )-- ----------------------------------------------------------------------------- Derived operationsget ::ReadPrec Char -- ^ Consumes and returns the next character.-- Fails if there is no input left.get :: ReadPrec Char get =ReadP Char -> ReadPrec Char forall a. ReadP a -> ReadPrec a lift ReadP Char ReadP.get look ::ReadPrec String -- ^ Look-ahead: returns the part of the input that is left, without-- consuming it.look :: ReadPrec String look =ReadP String -> ReadPrec String forall a. ReadP a -> ReadPrec a lift ReadP String ReadP.look (+++) ::ReadPrec a ->ReadPrec a ->ReadPrec a -- ^ Symmetric choice.P Prec -> ReadP a f1 +++ :: forall a. ReadPrec a -> ReadPrec a -> ReadPrec a +++ P Prec -> ReadP a f2 =(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec n ->Prec -> ReadP a f1 Prec n ReadP a -> ReadP a -> ReadP a forall a. ReadP a -> ReadP a -> ReadP a ReadP.+++ Prec -> ReadP a f2 Prec n )(<++) ::ReadPrec a ->ReadPrec a ->ReadPrec a -- ^ Local, exclusive, left-biased choice: If left parser-- locally produces any result at all, then right parser is-- not used.P Prec -> ReadP a f1 <++ :: forall a. ReadPrec a -> ReadPrec a -> ReadPrec a <++ P Prec -> ReadP a f2 =(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec n ->Prec -> ReadP a f1 Prec n ReadP a -> ReadP a -> ReadP a forall a. ReadP a -> ReadP a -> ReadP a ReadP.<++ Prec -> ReadP a f2 Prec n )pfail ::ReadPrec a -- ^ Always fails.pfail :: forall a. ReadPrec a pfail =ReadP a -> ReadPrec a forall a. ReadP a -> ReadPrec a lift ReadP a forall a. ReadP a ReadP.pfail choice ::[ReadPrec a ]->ReadPrec a -- ^ Combines all parsers in the specified list.choice :: forall a. [ReadPrec a] -> ReadPrec a choice [ReadPrec a] ps =(ReadPrec a -> ReadPrec a -> ReadPrec a) -> ReadPrec a -> [ReadPrec a] -> ReadPrec a forall a b. (a -> b -> b) -> b -> [a] -> b foldr ReadPrec a -> ReadPrec a -> ReadPrec a forall a. ReadPrec a -> ReadPrec a -> ReadPrec a (+++) ReadPrec a forall a. ReadPrec a pfail [ReadPrec a] ps -- ----------------------------------------------------------------------------- Converting between ReadPrec and ReadreadPrec_to_P ::ReadPrec a ->(Int ->ReadP a )readPrec_to_P :: forall a. ReadPrec a -> Prec -> ReadP a readPrec_to_P (P Prec -> ReadP a f )=Prec -> ReadP a f readP_to_Prec ::(Int ->ReadP a )->ReadPrec a readP_to_Prec :: forall a. (Prec -> ReadP a) -> ReadPrec a readP_to_Prec Prec -> ReadP a f =(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P Prec -> ReadP a f readPrec_to_S ::ReadPrec a ->(Int ->ReadS a )readPrec_to_S :: forall a. ReadPrec a -> Prec -> ReadS a readPrec_to_S (P Prec -> ReadP a f )Prec n =ReadP a -> ReadS a forall a. ReadP a -> ReadS a readP_to_S (Prec -> ReadP a f Prec n )readS_to_Prec ::(Int ->ReadS a )->ReadPrec a readS_to_Prec :: forall a. (Prec -> ReadS a) -> ReadPrec a readS_to_Prec Prec -> ReadS a f =(Prec -> ReadP a) -> ReadPrec a forall a. (Prec -> ReadP a) -> ReadPrec a P (\Prec n ->ReadS a -> ReadP a forall a. ReadS a -> ReadP a readS_to_P (Prec -> ReadS a f Prec n ))