Skip to content

Commit a06e466

Browse files
committed
Add Alt, Plus, MonadPlus, update Alternative
1 parent fdae3b1 commit a06e466

File tree

8 files changed

+48
-44
lines changed

8 files changed

+48
-44
lines changed

bower.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
"package.json"
1919
],
2020
"dependencies": {
21-
"purescript-transformers": "*",
21+
"purescript-transformers": "~0.1.0",
2222
"purescript-either": "*",
23-
"purescript-maybe": "*",
24-
"purescript-arrays": "*",
23+
"purescript-maybe": "~0.2.0",
24+
"purescript-arrays": "~0.2.0",
2525
"purescript-strings": "*",
2626
"purescript-foldable-traversable": "*"
2727
}

docs/Module.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
### Type Class Instances
1717

18+
instance altParserT :: (Monad m) => Alt (ParserT s m)
19+
1820
instance alternativeParserT :: (Monad m) => Alternative (ParserT s m)
1921

2022
instance applicativeParserT :: (Monad m) => Applicative (ParserT s m)
@@ -33,6 +35,8 @@
3335

3436
instance monadTransParserT :: MonadTrans (ParserT s)
3537

38+
instance plusParserT :: (Monad m) => Plus (ParserT s m)
39+
3640

3741
### Values
3842

examples/Test.purs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
module Main where
22

3-
import Prelude
43
import Data.Array
54
import Data.Either
65
import Data.Maybe
6+
77
import Control.Monad.Eff
88
import Control.Monad.Identity
9+
910
import Debug.Trace
11+
1012
import Text.Parsing.Parser
1113
import Text.Parsing.Parser.Combinators
1214
import Text.Parsing.Parser.Expr
@@ -16,7 +18,7 @@ parens :: forall m a. (Monad m) => ParserT String m a -> ParserT String m a
1618
parens = between (string "(") (string ")")
1719

1820
nested :: forall m. (Functor m, Monad m) => ParserT String m Number
19-
nested = fix $ \p -> (do
21+
nested = fix $ \p -> (do
2022
string "a"
2123
return 0) <|> ((+) 1) <$> parens p
2224

@@ -30,23 +32,23 @@ opTest = chainl char (do string "+"
3032
return (++)) ""
3133

3234
digit :: Parser String Number
33-
digit = (string "0" >>= \_ -> return 0)
34-
<|> (string "1" >>= \_ -> return 1)
35-
<|> (string "2" >>= \_ -> return 2)
36-
<|> (string "3" >>= \_ -> return 3)
37-
<|> (string "4" >>= \_ -> return 4)
38-
<|> (string "5" >>= \_ -> return 5)
39-
<|> (string "6" >>= \_ -> return 6)
40-
<|> (string "7" >>= \_ -> return 7)
41-
<|> (string "8" >>= \_ -> return 8)
42-
<|> (string "9" >>= \_ -> return 9)
35+
digit = (string "0" >>= \_ -> return 0)
36+
<|> (string "1" >>= \_ -> return 1)
37+
<|> (string "2" >>= \_ -> return 2)
38+
<|> (string "3" >>= \_ -> return 3)
39+
<|> (string "4" >>= \_ -> return 4)
40+
<|> (string "5" >>= \_ -> return 5)
41+
<|> (string "6" >>= \_ -> return 6)
42+
<|> (string "7" >>= \_ -> return 7)
43+
<|> (string "8" >>= \_ -> return 8)
44+
<|> (string "9" >>= \_ -> return 9)
4345

4446
exprTest :: Parser String Number
4547
exprTest = buildExprParser [[Infix (string "/" >>= \_ -> return (/)) AssocRight]
4648
,[Infix (string "*" >>= \_ -> return (*)) AssocRight]
4749
,[Infix (string "-" >>= \_ -> return (-)) AssocRight]
4850
,[Infix (string "+" >>= \_ -> return (+)) AssocRight]] digit
49-
51+
5052
main = do
5153
parseTest nested "(((a)))"
5254
parseTest (many (string "a")) "aaa"
@@ -57,6 +59,6 @@ main = do
5759
parseTest (do
5860
as <- string "a" `endBy1` string ","
5961
eof
60-
return as) "a,a,a,"
62+
return as) "a,a,a,"
6163
parseTest opTest "a+b+c"
6264
parseTest exprTest "1*2+3/4-5"

src/Text/Parsing/Parser.purs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
module Text.Parsing.Parser where
22

3-
import Prelude
4-
53
import Data.Either
64
import Data.Maybe
75
import Data.Monoid
86
import Data.Tuple
97

8+
import Control.Alt
9+
import Control.Alternative
10+
import Control.Plus
1011
import Control.Monad
1112
import Control.Monad.Identity
12-
1313
import Control.Monad.Trans
1414
import Control.Monad.State.Class
1515
import Control.Monad.State.Trans
@@ -41,23 +41,27 @@ 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-
54-
instance alternativeParserT :: (Monad m) => Alternative (ParserT s m) where
55-
empty = fail "No alternative"
53+
54+
instance altParserT :: (Monad m) => Alt (ParserT s m) where
5655
(<|>) p1 p2 = ParserT $ \s -> unParserT p1 s >>= \o ->
5756
case o.result of
5857
Left _ | not o.consumed -> unParserT p2 s
5958
_ -> return o
6059

60+
instance plusParserT :: (Monad m) => Plus (ParserT s m) where
61+
empty = fail "No alternative"
62+
63+
instance alternativeParserT :: (Monad m) => Alternative (ParserT s m)
64+
6165
instance bindParserT :: (Monad m) => Bind (ParserT s m) where
6266
(>>=) p f = ParserT $ \s -> unParserT p s >>= \o ->
6367
case o.result of
@@ -72,7 +76,7 @@ instance monadTransParserT :: MonadTrans (ParserT s) where
7276
lift m = ParserT $ \s -> (\a -> { input: s, consumed: false, result: Right a }) <$> m
7377

7478
instance monadStateParserT :: (Monad m) => MonadState s (ParserT s m) where
75-
state f = ParserT $ \s ->
79+
state f = ParserT $ \s ->
7680
return $ case f s of
7781
Tuple a s' -> { input: s', consumed: false, result: Right a }
7882

src/Text/Parsing/Parser/Combinators.purs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
module Text.Parsing.Parser.Combinators where
22

3-
import Prelude
4-
53
import Data.Maybe
64
import Data.Array
75
import Data.Tuple
86
import Data.Either
97

8+
import Control.Alt
109
import Control.Monad
11-
1210
import Control.Monad.Error.Trans
1311
import Control.Monad.Error.Class
1412
import Control.Monad.State.Trans
@@ -39,7 +37,7 @@ between :: forall m s a open close. (Monad m) => ParserT s m open -> ParserT s m
3937
between open close p = do
4038
open
4139
a <- p
42-
close
40+
close
4341
return a
4442

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

5553
try :: forall m s a. (Functor m) => ParserT s m a -> ParserT s m a
5654
try p = ParserT $ \s -> try' s <$> unParserT p s
57-
where
55+
where
5856
try' s o@{ result = Left _ } = { input: s, result: o.result, consumed: false }
5957
try' _ o = o
6058

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

8280
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
81+
endBy1 p sep = many1 $ do
8482
a <- p
8583
sep
8684
return a

src/Text/Parsing/Parser/Expr.purs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
module Text.Parsing.Parser.Expr where
22

3-
import Prelude
4-
53
import Data.Either
64
import Data.Foldable
75

6+
import Control.Alt
7+
88
import Text.Parsing.Parser
99
import Text.Parsing.Parser.Combinators
1010

src/Text/Parsing/Parser/String.purs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,32 @@
11
module Text.Parsing.Parser.String where
22

3-
import Prelude
4-
53
import Data.String
64
import Data.Either
5+
import Data.Foldable
6+
import Data.Monoid
77

8+
import Control.Alt
89
import Control.Monad.Error
910
import Control.Monad.Error.Class
1011
import Control.Monad.State.Class
1112

12-
import Data.Foldable
13-
import Data.Monoid
14-
1513
import Text.Parsing.Parser
1614
import Text.Parsing.Parser.Combinators
1715

1816
eof :: forall m. (Monad m) => ParserT String m {}
19-
eof = ParserT $ \s ->
17+
eof = ParserT $ \s ->
2018
return $ case s of
2119
"" -> { consumed: false, input: s, result: Right {} }
2220
_ -> { consumed: false, input: s, result: Left (strMsg "Expected EOF") }
2321

2422
string :: forall m. (Monad m) => String -> ParserT String m String
25-
string s = ParserT $ \s' ->
23+
string s = ParserT $ \s' ->
2624
return $ case indexOf s s' of
2725
0 -> { consumed: true, input: drop (length s) s', result: Right s }
2826
_ -> { consumed: false, input: s', result: Left (strMsg ("Expected " ++ show s)) }
2927

3028
char :: forall m. (Monad m) => ParserT String m String
31-
char = ParserT $ \s' ->
29+
char = ParserT $ \s' ->
3230
return $ case s' of
3331
"" -> { consumed: false, input: s', result: Left (strMsg "Unexpected EOF") }
3432
_ -> { consumed: true, input: drop 1 s', result: Right (charAt 0 s') }

src/Text/Parsing/Parser/Token.purs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
module Text.Parsing.Parser.Token where
22

3-
import Prelude
4-
53
import Data.String
64

75
import Control.Monad.State.Class

0 commit comments

Comments
 (0)