21
21
22
22
module Text.Parsing.Parser.Combinators where
23
23
24
- import Prelude
24
+ import Prelude ( class Functor , class Monad , Unit , ($), (*>), (<>), (<$>), bind , flip , pure , unit )
25
25
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 )
28
29
import 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 )
36
32
37
33
-- | 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 <?>
40
38
41
39
-- | 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 <??>
44
44
45
45
-- | Wrap a parser with opening and closing markers.
46
46
-- |
@@ -49,31 +49,31 @@ import Text.Parsing.Parser
49
49
-- | ```purescript
50
50
-- | parens = between (string "(") (string ")")
51
51
-- | ```
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
53
53
between open close p = do
54
54
open
55
55
a <- p
56
56
close
57
- return a
57
+ pure a
58
58
59
59
-- | 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
62
62
63
63
-- | 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
65
65
optional p = (do p
66
- return unit) <|> return unit
66
+ pure unit) <|> pure unit
67
67
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 )
70
70
optionMaybe p = option Nothing (Just <$> p)
71
71
72
72
-- | In case of failure, reset the stream to the unconsumed state.
73
73
try :: forall m s a . (Functor m ) => ParserT s m a -> ParserT s m a
74
74
try p = ParserT $ \(PState { input: s, position: pos }) -> try' s pos <$> unParserT p (PState { input: s, position: pos })
75
75
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 }
77
77
try' _ _ o = o
78
78
79
79
-- | Parse phrases delimited by a separator.
@@ -83,43 +83,43 @@ try p = ParserT $ \(PState { input: s, position: pos }) -> try' s pos <$> unPars
83
83
-- | ```purescript
84
84
-- | digit `sepBy` string ","
85
85
-- | ```
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
88
88
89
89
-- | 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 )
91
91
sepBy1 p sep = do
92
92
a <- p
93
93
as <- many $ do
94
94
sep
95
95
p
96
- return (a : as)
96
+ pure (a : as)
97
97
98
98
-- | 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
101
101
102
102
-- | 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 )
104
104
sepEndBy1 p sep = do
105
105
a <- p
106
106
(do sep
107
107
as <- sepEndBy p sep
108
- return (a : as)) <|> return (singleton a)
108
+ pure (a : as)) <|> pure (singleton a)
109
109
110
110
-- | 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 )
112
112
endBy1 p sep = some $ do
113
113
a <- p
114
114
sep
115
- return a
115
+ pure a
116
116
117
117
-- | 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 )
119
119
endBy p sep = many $ do
120
120
a <- p
121
121
sep
122
- return a
122
+ pure a
123
123
124
124
-- | Parse phrases delimited by a right-associative operator.
125
125
-- |
@@ -128,75 +128,75 @@ endBy p sep = many $ do
128
128
-- | ```purescript
129
129
-- | chainr digit (string "+" *> add) 0
130
130
-- | ```
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
133
133
134
134
-- | 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
137
137
138
138
-- | 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
140
140
chainl1 p f = do
141
141
a <- p
142
142
chainl1' p f a
143
143
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
145
145
chainl1' p f a = (do f' <- f
146
146
a' <- p
147
- chainl1' p f (f' a a')) <|> return a
147
+ chainl1' p f (f' a a')) <|> pure a
148
148
149
149
-- | 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
151
151
chainr1 p f = do
152
152
a <- p
153
153
chainr1' p f a
154
154
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
156
156
chainr1' p f a = (do f' <- f
157
157
a' <- chainr1 p f
158
- return $ f' a a') <|> return a
158
+ pure $ f' a a') <|> pure a
159
159
160
160
-- | Parse one of a set of alternatives.
161
161
choice :: forall f m s a . (Foldable f , Monad m ) => f (ParserT s m a ) -> ParserT s m a
162
162
choice = foldl (<|>) empty
163
163
164
164
-- | 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
167
167
168
168
-- | 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
170
170
skipMany1 p = do
171
171
x <- p
172
172
xs <- skipMany p
173
- return unit
173
+ pure unit
174
174
175
175
-- | 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
177
177
lookAhead (ParserT p) = ParserT \(PState { input: s, position: pos }) -> do
178
178
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}
180
180
181
181
-- | 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
184
184
185
185
-- | 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 )
187
187
manyTill p end = scan
188
188
where
189
189
scan = (do
190
190
end
191
- return Nil )
191
+ pure Nil )
192
192
<|> (do
193
193
x <- p
194
194
xs <- scan
195
- return (x:xs))
195
+ pure (x:xs))
196
196
197
197
-- | 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 )
199
199
many1Till p end = do
200
200
x <- p
201
201
xs <- manyTill p end
202
- return (x:xs)
202
+ pure (x:xs)
0 commit comments