1 {-# OPTIONS -fno-implicit-prelude #-}
2 -----------------------------------------------------------------------------
4 -- Module : Text.ParserCombinators.ReadPrec
5 -- Copyright : (c) The University of Glasgow 2002
6 -- License : BSD-style (see the file libraries/base/LICENSE)
8 -- Maintainer : libraries@haskell.org
9 -- Stability : provisional
10 -- Portability : portable
12 -----------------------------------------------------------------------------
14 module Text.ParserCombinators.ReadPrec
16 ReadPrec, -- :: * -> *; instance Functor, Monad, MonadPlus
20 minPrec, -- :: Prec; = 0
22 -- * Primitive operations
23 lift, -- :: ReadP a -> ReadPrec a
24 prec, -- :: Prec -> ReadPrec a -> ReadPrec a
25 step, -- :: ReadPrec a -> ReadPrec a
26 reset, -- :: ReadPrec a -> ReadPrec a
29 get, -- :: ReadPrec Char
30 look, -- :: ReadPrec String
31 (+++), -- :: ReadPrec a -> ReadPrec a -> ReadPrec a
32 pfail, -- :: ReadPrec a
33 choice, -- :: [ReadPrec a] -> ReadPrec a
36 readPrec_to_P, -- :: ReadPrec a -> (Int -> ReadP a)
37 readP_to_Prec, -- :: (Int -> ReadP a) -> ReadPrec a
38 readPrec_to_S, -- :: ReadPrec a -> (Int -> ReadS a)
39 readS_to_Prec, -- :: (Int -> ReadS a) -> ReadPrec a
44 import Text.ParserCombinators.ReadP
50 import qualified Text.ParserCombinators.ReadP as ReadP
58 import Control.Monad( MonadPlus(..) )
59 import GHC.Num( Num(..) )
62 -- ---------------------------------------------------------------------------
65 newtype ReadPrec a = P { unP :: Prec -> ReadP a }
67 -- Functor, Monad, MonadPlus
69 instance Functor ReadPrec where
70 fmap h (P f) = P (\n -> fmap h (f n))
72 instance Monad ReadPrec where
73 return x = P (\_ -> return x)
74 fail s = P (\_ -> fail s)
75 P f >>= k = P (\n -> do a <- f n; let P f' = k a in f' n)
77 instance MonadPlus ReadPrec where
88 -- ---------------------------------------------------------------------------
89 -- Operations over ReadPrec
91 lift :: ReadP a -> ReadPrec a
94 step :: ReadPrec a -> ReadPrec a
95 -- Increases the precedence context by one
96 step (P f) = P (\n -> f (n+1))
98 reset :: ReadPrec a -> ReadPrec a
99 -- Resets the precedence context to zero
100 reset (P f) = P (\n -> f minPrec)
102 prec :: Prec -> ReadPrec a -> ReadPrec a
103 -- (prec n p) checks that the precedence context is
104 -- less than or equal to n,
106 -- if so, parses p in context n
107 prec n (P f) = P (\c -> if c <= n then f n else ReadP.pfail)
109 -- ---------------------------------------------------------------------------
110 -- Derived operations
115 look :: ReadPrec String
116 look = lift ReadP.look
118 (+++) :: ReadPrec a -> ReadPrec a -> ReadPrec a
119 P f1 +++ P f2 = P (\n -> f1 n ReadP.+++ f2 n)
122 pfail = lift ReadP.pfail
124 choice :: [ReadPrec a] -> ReadPrec a
125 choice ps = foldr (+++) pfail ps
127 -- ---------------------------------------------------------------------------
128 -- Converting between ReadPrec and Read
130 -- We define a local version of ReadS here,
131 -- because its "real" definition site is in GHC.Read
132 type ReadS a = String -> [(a,String)]
134 readPrec_to_P :: ReadPrec a -> (Int -> ReadP a)
135 readPrec_to_P (P f) = f
137 readP_to_Prec :: (Int -> ReadP a) -> ReadPrec a
138 readP_to_Prec f = P f
140 readPrec_to_S :: ReadPrec a -> (Int -> ReadS a)
141 readPrec_to_S (P f) n = readP_to_S (f n)
143 readS_to_Prec :: (Int -> ReadS a) -> ReadPrec a
144 readS_to_Prec f = P (\n -> readS_to_P (f n))