2121
2222module Text.Parsing.Parser.Combinators where
2323
24- import Prelude
24+ import Prelude ( class Functor , class Monad , Unit , ($), (*>), (<>), (<$>), bind , flip , pure , unit )
2525
26- import Data.Maybe
27- import Data.Either
26+ import Control.Plus (empty , (<|>))
27+ import Data.Either (Either (..))
28+ import Data.Foldable (class Foldable , foldl )
2829import Data.List (List (..), (:), many , some , singleton )
29- import Data.Foldable (Foldable , foldl )
30-
31- import Control.Alt
32- import Control.Plus
33- import Control.Apply
34-
35- import Text.Parsing.Parser
30+ import Data.Maybe (Maybe (..))
31+ import Text.Parsing.Parser (PState (..), ParserT (..), fail , unParserT )
3632
3733-- | Provide an error message in the case of failure.
38- (<?>) :: forall m s a . (Monad m ) => ParserT s m a -> String -> ParserT s m a
39- (<?>) p msg = p <|> fail (" Expected " ++ msg)
34+ withErrorMessage :: forall m s a . Monad m => ParserT s m a -> String -> ParserT s m a
35+ withErrorMessage p msg = p <|> fail (" Expected " <> msg)
36+
37+ infix 3 withErrorMessage as <?>
4038
4139-- | Flipped `(<?>)`.
42- (<??>) :: forall m s a . (Monad m ) => String -> ParserT s m a -> ParserT s m a
43- (<??>) = flip (<?>)
40+ asErrorMessage :: forall m s a . Monad m => String -> ParserT s m a -> ParserT s m a
41+ asErrorMessage = flip (<?>)
42+
43+ infix 3 asErrorMessage as <??>
4444
4545-- | Wrap a parser with opening and closing markers.
4646-- |
@@ -49,31 +49,31 @@ import Text.Parsing.Parser
4949-- | ```purescript
5050-- | parens = between (string "(") (string ")")
5151-- | ```
52- between :: forall m s a open close . ( Monad m ) => ParserT s m open -> ParserT s m close -> ParserT s m a -> ParserT s m a
52+ between :: forall m s a open close . Monad m => ParserT s m open -> ParserT s m close -> ParserT s m a -> ParserT s m a
5353between open close p = do
5454 open
5555 a <- p
5656 close
57- return a
57+ pure a
5858
5959-- | Provide a default result in the case where a parser fails without consuming input.
60- option :: forall m s a . ( Monad m ) => a -> ParserT s m a -> ParserT s m a
61- option a p = p <|> return a
60+ option :: forall m s a . Monad m => a -> ParserT s m a -> ParserT s m a
61+ option a p = p <|> pure a
6262
6363-- | Optionally parse something, failing quietly.
64- optional :: forall m s a . ( Monad m ) => ParserT s m a -> ParserT s m Unit
64+ optional :: forall m s a . Monad m => ParserT s m a -> ParserT s m Unit
6565optional p = (do p
66- return unit) <|> return unit
66+ pure unit) <|> pure unit
6767
68- -- | Return `Nothing` in the case where a parser fails without consuming input.
69- optionMaybe :: forall m s a . ( Monad m ) => ParserT s m a -> ParserT s m (Maybe a )
68+ -- | pure `Nothing` in the case where a parser fails without consuming input.
69+ optionMaybe :: forall m s a . Monad m => ParserT s m a -> ParserT s m (Maybe a )
7070optionMaybe p = option Nothing (Just <$> p)
7171
7272-- | In case of failure, reset the stream to the unconsumed state.
7373try :: forall m s a . (Functor m ) => ParserT s m a -> ParserT s m a
7474try p = ParserT $ \(PState { input: s, position: pos }) -> try' s pos <$> unParserT p (PState { input: s, position: pos })
7575 where
76- try' s pos o@{ result = Left _ } = { input: s, result: o.result, consumed: false , position: pos }
76+ try' s pos o@{ result: Left _ } = { input: s, result: o.result, consumed: false , position: pos }
7777 try' _ _ o = o
7878
7979-- | Parse phrases delimited by a separator.
@@ -83,43 +83,43 @@ try p = ParserT $ \(PState { input: s, position: pos }) -> try' s pos <$> unPars
8383-- | ```purescript
8484-- | digit `sepBy` string ","
8585-- | ```
86- sepBy :: forall m s a sep . ( Monad m ) => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
87- sepBy p sep = sepBy1 p sep <|> return Nil
86+ sepBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
87+ sepBy p sep = sepBy1 p sep <|> pure Nil
8888
8989-- | Parse phrases delimited by a separator, requiring at least one match.
90- sepBy1 :: forall m s a sep . ( Monad m ) => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
90+ sepBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
9191sepBy1 p sep = do
9292 a <- p
9393 as <- many $ do
9494 sep
9595 p
96- return (a : as)
96+ pure (a : as)
9797
9898-- | Parse phrases delimited and optionally terminated by a separator.
99- sepEndBy :: forall m s a sep . ( Monad m ) => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
100- sepEndBy p sep = sepEndBy1 p sep <|> return Nil
99+ sepEndBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
100+ sepEndBy p sep = sepEndBy1 p sep <|> pure Nil
101101
102102-- | Parse phrases delimited and optionally terminated by a separator, requiring at least one match.
103- sepEndBy1 :: forall m s a sep . ( Monad m ) => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
103+ sepEndBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
104104sepEndBy1 p sep = do
105105 a <- p
106106 (do sep
107107 as <- sepEndBy p sep
108- return (a : as)) <|> return (singleton a)
108+ pure (a : as)) <|> pure (singleton a)
109109
110110-- | Parse phrases delimited and terminated by a separator, requiring at least one match.
111- endBy1 :: forall m s a sep . ( Monad m ) => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
111+ endBy1 :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
112112endBy1 p sep = some $ do
113113 a <- p
114114 sep
115- return a
115+ pure a
116116
117117-- | Parse phrases delimited and terminated by a separator.
118- endBy :: forall m s a sep . ( Monad m ) => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
118+ endBy :: forall m s a sep . Monad m => ParserT s m a -> ParserT s m sep -> ParserT s m (List a )
119119endBy p sep = many $ do
120120 a <- p
121121 sep
122- return a
122+ pure a
123123
124124-- | Parse phrases delimited by a right-associative operator.
125125-- |
@@ -128,75 +128,75 @@ endBy p sep = many $ do
128128-- | ```purescript
129129-- | chainr digit (string "+" *> add) 0
130130-- | ```
131- chainr :: forall m s a . ( Monad m ) => ParserT s m a -> ParserT s m (a -> a -> a ) -> a -> ParserT s m a
132- chainr p f a = chainr1 p f <|> return a
131+ chainr :: forall m s a . Monad m => ParserT s m a -> ParserT s m (a -> a -> a ) -> a -> ParserT s m a
132+ chainr p f a = chainr1 p f <|> pure a
133133
134134-- | Parse phrases delimited by a left-associative operator.
135- chainl :: forall m s a . ( Monad m ) => ParserT s m a -> ParserT s m (a -> a -> a ) -> a -> ParserT s m a
136- chainl p f a = chainl1 p f <|> return a
135+ chainl :: forall m s a . Monad m => ParserT s m a -> ParserT s m (a -> a -> a ) -> a -> ParserT s m a
136+ chainl p f a = chainl1 p f <|> pure a
137137
138138-- | Parse phrases delimited by a left-associative operator, requiring at least one match.
139- chainl1 :: forall m s a . ( Monad m ) => ParserT s m a -> ParserT s m (a -> a -> a ) -> ParserT s m a
139+ chainl1 :: forall m s a . Monad m => ParserT s m a -> ParserT s m (a -> a -> a ) -> ParserT s m a
140140chainl1 p f = do
141141 a <- p
142142 chainl1' p f a
143143
144- chainl1' :: forall m s a . ( Monad m ) => ParserT s m a -> ParserT s m (a -> a -> a ) -> a -> ParserT s m a
144+ chainl1' :: forall m s a . Monad m => ParserT s m a -> ParserT s m (a -> a -> a ) -> a -> ParserT s m a
145145chainl1' p f a = (do f' <- f
146146 a' <- p
147- chainl1' p f (f' a a')) <|> return a
147+ chainl1' p f (f' a a')) <|> pure a
148148
149149-- | Parse phrases delimited by a right-associative operator, requiring at least one match.
150- chainr1 :: forall m s a . ( Monad m ) => ParserT s m a -> ParserT s m (a -> a -> a ) -> ParserT s m a
150+ chainr1 :: forall m s a . Monad m => ParserT s m a -> ParserT s m (a -> a -> a ) -> ParserT s m a
151151chainr1 p f = do
152152 a <- p
153153 chainr1' p f a
154154
155- chainr1' :: forall m s a . ( Monad m ) => ParserT s m a -> ParserT s m (a -> a -> a ) -> a -> ParserT s m a
155+ chainr1' :: forall m s a . Monad m => ParserT s m a -> ParserT s m (a -> a -> a ) -> a -> ParserT s m a
156156chainr1' p f a = (do f' <- f
157157 a' <- chainr1 p f
158- return $ f' a a') <|> return a
158+ pure $ f' a a') <|> pure a
159159
160160-- | Parse one of a set of alternatives.
161161choice :: forall f m s a . (Foldable f , Monad m ) => f (ParserT s m a ) -> ParserT s m a
162162choice = foldl (<|>) empty
163163
164164-- | Skip many instances of a phrase.
165- skipMany :: forall s a m . ( Monad m ) => ParserT s m a -> ParserT s m Unit
166- skipMany p = skipMany1 p <|> return unit
165+ skipMany :: forall s a m . Monad m => ParserT s m a -> ParserT s m Unit
166+ skipMany p = skipMany1 p <|> pure unit
167167
168168-- | Skip at least one instance of a phrase.
169- skipMany1 :: forall s a m . ( Monad m ) => ParserT s m a -> ParserT s m Unit
169+ skipMany1 :: forall s a m . Monad m => ParserT s m a -> ParserT s m Unit
170170skipMany1 p = do
171171 x <- p
172172 xs <- skipMany p
173- return unit
173+ pure unit
174174
175175-- | Parse a phrase, without modifying the consumed state or stream position.
176- lookAhead :: forall s a m . ( Monad m ) => ParserT s m a -> ParserT s m a
176+ lookAhead :: forall s a m . Monad m => ParserT s m a -> ParserT s m a
177177lookAhead (ParserT p) = ParserT \(PState { input: s, position: pos }) -> do
178178 state <- p (PState { input: s, position: pos })
179- return state{input = s, consumed = false , position = pos}
179+ pure state{input = s, consumed = false , position = pos}
180180
181181-- | Fail if the specified parser matches.
182- notFollowedBy :: forall s a m . ( Monad m ) => ParserT s m a -> ParserT s m Unit
183- notFollowedBy p = try $ (try p *> fail " Negated parser succeeded" ) <|> return unit
182+ notFollowedBy :: forall s a m . Monad m => ParserT s m a -> ParserT s m Unit
183+ notFollowedBy p = try $ (try p *> fail " Negated parser succeeded" ) <|> pure unit
184184
185185-- | Parse several phrases until the specified terminator matches.
186- manyTill :: forall s a m e . ( Monad m ) => ParserT s m a -> ParserT s m e -> ParserT s m (List a )
186+ manyTill :: forall s a m e . Monad m => ParserT s m a -> ParserT s m e -> ParserT s m (List a )
187187manyTill p end = scan
188188 where
189189 scan = (do
190190 end
191- return Nil )
191+ pure Nil )
192192 <|> (do
193193 x <- p
194194 xs <- scan
195- return (x:xs))
195+ pure (x:xs))
196196
197197-- | Parse several phrases until the specified terminator matches, requiring at least one match.
198- many1Till :: forall s a m e . ( Monad m ) => ParserT s m a -> ParserT s m e -> ParserT s m (List a )
198+ many1Till :: forall s a m e . Monad m => ParserT s m a -> ParserT s m e -> ParserT s m (List a )
199199many1Till p end = do
200200 x <- p
201201 xs <- manyTill p end
202- return (x:xs)
202+ pure (x:xs)
0 commit comments