Skip to content

Commit a4ea4e7

Browse files
committed
Bunch of combinators and some string stuff.
1 parent a198281 commit a4ea4e7

File tree

4 files changed

+75
-10
lines changed

4 files changed

+75
-10
lines changed

docs/Module.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@
4949

5050
## Module Text.Parsing.Parser.Combinators
5151

52+
### Type Class Instances
53+
54+
instance showParseError :: Show ParseError
55+
56+
5257
### Values
5358

5459
(<?>) :: forall m s a. (Monad m) => ParserT s m a -> String -> ParserT s m a
@@ -77,10 +82,16 @@
7782

7883
fix2 :: forall m s a b. (Tuple (ParserT m s a) (ParserT m s b) -> Tuple (ParserT m s a) (ParserT m s b)) -> Tuple (ParserT m s a) (ParserT m s b)
7984

85+
lookAhead :: forall s a m. (Monad m) => ParserT s m a -> ParserT s m a
86+
8087
many :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m [a]
8188

8289
many1 :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m [a]
8390

91+
many1Till :: forall s a m e. (Monad m) => ParserT s m a -> ParserT s m e -> ParserT s m [a]
92+
93+
manyTill :: forall s a m e. (Monad m) => ParserT s m a -> ParserT s m e -> ParserT s m [a]
94+
8495
option :: forall m s a. (Monad m) => a -> ParserT s m a -> ParserT s m a
8596

8697
optionMaybe :: forall m s a. (Functor m, Monad m) => ParserT s m a -> ParserT s m (Maybe a)
@@ -95,6 +106,10 @@
95106

96107
sepEndBy1 :: forall m s a sep. (Monad m) => ParserT s m a -> ParserT s m sep -> ParserT s m [a]
97108

109+
skipMany :: forall s a m. (Monad m) => ParserT s m a -> ParserT s m { }
110+
111+
skipMany1 :: forall s a m. (Monad m) => ParserT s m a -> ParserT s m { }
112+
98113
try :: forall m s a. (Functor m) => ParserT s m a -> ParserT s m a
99114

100115

@@ -144,8 +159,14 @@
144159

145160
eof :: forall m. (Monad m) => ParserT String m { }
146161

162+
noneOf :: forall s m a. (Monad m) => [String] -> ParserT String m String
163+
164+
oneOf :: forall s m a. (Monad m) => [String] -> ParserT String m String
165+
147166
satisfy :: forall m. (Monad m) => (String -> Boolean) -> ParserT String m String
148167

168+
skipSpaces :: forall m. (Monad m) => ParserT String m { }
169+
149170
string :: forall m. (Monad m) => String -> ParserT String m String
150171

151172
whiteSpace :: forall m. (Monad m) => ParserT String m String

src/Text/Parsing/Parser.purs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,16 @@ runParser :: forall s a. s -> Parser s a -> Either ParseError a
4141
runParser s = runIdentity <<< runParserT s
4242

4343
instance functorParserT :: (Functor m) => Functor (ParserT s m) where
44-
(<$>) f p = ParserT $ \s -> f' <$> unParserT p s
44+
(<$>) f p = ParserT $ \s -> f' <$> unParserT p s
4545
where
4646
f' o = { input: o.input, result: f <$> o.result, consumed: o.consumed }
4747

4848
instance applyParserT :: (Monad m) => Apply (ParserT s m) where
4949
(<*>) = ap
50-
50+
5151
instance applicativeParserT :: (Monad m) => Applicative (ParserT s m) where
5252
pure a = ParserT $ \s -> pure { input: s, result: Right a, consumed: false }
53-
53+
5454
instance alternativeParserT :: (Monad m) => Alternative (ParserT s m) where
5555
empty = fail "No alternative"
5656
(<|>) p1 p2 = ParserT $ \s -> unParserT p1 s >>= \o ->
@@ -72,7 +72,7 @@ instance monadTransParserT :: MonadTrans (ParserT s) where
7272
lift m = ParserT $ \s -> (\a -> { input: s, consumed: false, result: Right a }) <$> m
7373

7474
instance monadStateParserT :: (Monad m) => MonadState s (ParserT s m) where
75-
state f = ParserT $ \s ->
75+
state f = ParserT $ \s ->
7676
return $ case f s of
7777
Tuple a s' -> { input: s', consumed: false, result: Right a }
7878

src/Text/Parsing/Parser/Combinators.purs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ between :: forall m s a open close. (Monad m) => ParserT s m open -> ParserT s m
3939
between open close p = do
4040
open
4141
a <- p
42-
close
42+
close
4343
return a
4444

4545
option :: forall m s a. (Monad m) => a -> ParserT s m a -> ParserT s m a
@@ -54,7 +54,7 @@ optionMaybe p = option Nothing (Just <$> p)
5454

5555
try :: forall m s a. (Functor m) => ParserT s m a -> ParserT s m a
5656
try p = ParserT $ \s -> try' s <$> unParserT p s
57-
where
57+
where
5858
try' s o@{ result = Left _ } = { input: s, result: o.result, consumed: false }
5959
try' _ o = o
6060

@@ -80,7 +80,7 @@ sepEndBy1 p sep = do
8080
return (a : as)) <|> return [a]
8181

8282
endBy1 :: forall m s a sep. (Monad m) => ParserT s m a -> ParserT s m sep -> ParserT s m [a]
83-
endBy1 p sep = many1 $ do
83+
endBy1 p sep = many1 $ do
8484
a <- p
8585
sep
8686
return a
@@ -122,3 +122,37 @@ choice [] = fail "Nothing to parse"
122122
choice [x] = x
123123
choice (x:xs) = x <|> choice xs
124124

125+
skipMany :: forall s a m. (Monad m) => ParserT s m a -> ParserT s m {}
126+
skipMany p = skipMany1 p <|> return {}
127+
128+
skipMany1 :: forall s a m. (Monad m) => ParserT s m a -> ParserT s m {}
129+
skipMany1 p = do
130+
x <- p
131+
xs <- skipMany p
132+
return {}
133+
134+
lookAhead :: forall s a m. (Monad m) => ParserT s m a -> ParserT s m a
135+
lookAhead (ParserT p) = ParserT \s -> do
136+
state <- p s
137+
return state{input = s, consumed = false}
138+
139+
instance showParseError :: Show ParseError where
140+
show (ParseError msg) = msg.message
141+
142+
manyTill :: forall s a m e. (Monad m) => ParserT s m a -> ParserT s m e -> ParserT s m [a]
143+
manyTill p end = scan
144+
where
145+
scan = (do
146+
end
147+
return [])
148+
<|> (do
149+
x <- p
150+
xs <- scan
151+
return (x:xs))
152+
153+
many1Till :: forall s a m e. (Monad m) => ParserT s m a -> ParserT s m e -> ParserT s m [a]
154+
many1Till p end = do
155+
x <- p
156+
xs <- manyTill p end
157+
return (x:xs)
158+

src/Text/Parsing/Parser/String.purs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@ import Text.Parsing.Parser
1616
import Text.Parsing.Parser.Combinators
1717

1818
eof :: forall m. (Monad m) => ParserT String m {}
19-
eof = ParserT $ \s ->
19+
eof = ParserT $ \s ->
2020
return $ case s of
2121
"" -> { consumed: false, input: s, result: Right {} }
2222
_ -> { consumed: false, input: s, result: Left (strMsg "Expected EOF") }
2323

2424
string :: forall m. (Monad m) => String -> ParserT String m String
25-
string s = ParserT $ \s' ->
25+
string s = ParserT $ \s' ->
2626
return $ case indexOf s s' of
2727
0 -> { consumed: true, input: drop (length s) s', result: Right s }
2828
_ -> { consumed: false, input: s', result: Left (strMsg ("Expected " ++ show s)) }
2929

3030
char :: forall m. (Monad m) => ParserT String m String
31-
char = ParserT $ \s' ->
31+
char = ParserT $ \s' ->
3232
return $ case s' of
3333
"" -> { consumed: false, input: s', result: Left (strMsg "Unexpected EOF") }
3434
_ -> { consumed: true, input: drop 1 s', result: Right (charAt 0 s') }
@@ -44,3 +44,13 @@ whiteSpace = do
4444
list <- many $ string "\n" <|> string "\r" <|> string " " <|> string "\t"
4545
return $ foldMap id list
4646

47+
skipSpaces :: forall m. (Monad m) => ParserT String m {}
48+
skipSpaces = do
49+
whiteSpace
50+
return {}
51+
52+
oneOf :: forall s m a. (Monad m) => [String] -> ParserT String m String
53+
oneOf ss = satisfy (flip elem ss)
54+
55+
noneOf :: forall s m a. (Monad m) => [String] -> ParserT String m String
56+
noneOf ss = satisfy (flip notElem ss)

0 commit comments

Comments
 (0)