|
1 | 1 | module Text.Parsing.Parser.Combinators where
|
2 | 2 |
|
3 | 3 | import Prelude
|
| 4 | + |
4 | 5 | import Data.Maybe
|
5 | 6 | import Data.Array
|
6 | 7 | import Data.Either
|
| 8 | + |
| 9 | +import Control.Monad |
| 10 | + |
| 11 | +import Control.Monad.Error.Trans |
| 12 | +import Control.Monad.Error.Class |
| 13 | +import Control.Monad.State.Trans |
| 14 | +import Control.Monad.State.Class |
| 15 | + |
7 | 16 | import Text.Parsing.Parser
|
8 | 17 |
|
9 |
| -many :: forall s a. Parser s a -> Parser s [a] |
| 18 | +many :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m [a] |
10 | 19 | many p = many1 p <|> return []
|
11 | 20 |
|
12 |
| -many1 :: forall s a. Parser s a -> Parser s [a] |
| 21 | +many1 :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m [a] |
13 | 22 | many1 p = do a <- p
|
14 | 23 | as <- many p
|
15 | 24 | return (a : as)
|
16 | 25 |
|
17 |
| -(<?>) :: forall s a. Parser s a -> String -> Parser s a |
| 26 | +(<?>) :: forall m s a. (Monad m) => ParserT s m a -> String -> ParserT s m a |
18 | 27 | (<?>) p msg = p <|> fail msg
|
19 | 28 |
|
20 |
| -between :: forall s a open close. Parser s open -> Parser s close -> ({} -> Parser s a) -> Parser s a |
| 29 | +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 |
21 | 30 | between open close p = do
|
22 | 31 | open
|
23 | 32 | a <- p {}
|
24 | 33 | close
|
25 | 34 | return a
|
26 | 35 |
|
27 |
| -option :: forall s a. a -> Parser s a -> Parser s a |
| 36 | +option :: forall m s a. (Monad m) => a -> ParserT s m a -> ParserT s m a |
28 | 37 | option a p = p <|> return a
|
29 | 38 |
|
30 |
| -optional :: forall s a. Parser s a -> Parser s {} |
| 39 | +optional :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m {} |
31 | 40 | optional p = (do p
|
32 | 41 | return {}) <|> return {}
|
33 | 42 |
|
34 |
| -optionMaybe :: forall s a. Parser s a -> Parser s (Maybe a) |
| 43 | +optionMaybe :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m (Maybe a) |
35 | 44 | optionMaybe p = option Nothing (Just <$> p)
|
36 | 45 |
|
37 |
| -try :: forall s a. Parser s a -> Parser s a |
38 |
| -try p = Parser $ \s -> case runParser p s of |
39 |
| - ParseResult ({ consumed = true, result = Left err }) -> failureResult s false err |
40 |
| - res -> res |
| 46 | +try :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m a |
| 47 | +try p = catchError p $ \e -> do |
| 48 | + Consumed consumed <- get |
| 49 | + when consumed $ put (Consumed false) |
| 50 | + throwError (e :: ParseError) |
41 | 51 |
|
42 |
| -sepBy :: forall s a sep. Parser s a -> Parser s sep -> Parser s [a] |
| 52 | +sepBy :: forall m s a sep. (Monad m) => ParserT s m a -> ParserT s m sep -> ParserT s m [a] |
43 | 53 | sepBy p sep = sepBy1 p sep <|> return []
|
44 | 54 |
|
45 |
| -sepBy1 :: forall s a sep. Parser s a -> Parser s sep -> Parser s [a] |
| 55 | +sepBy1 :: forall m s a sep. (Monad m) => ParserT s m a -> ParserT s m sep -> ParserT s m [a] |
46 | 56 | sepBy1 p sep = do
|
47 | 57 | a <- p
|
48 | 58 | as <- many $ do
|
49 | 59 | sep
|
50 | 60 | p
|
51 | 61 | return (a : as)
|
52 | 62 |
|
53 |
| -sepEndBy :: forall s a sep. Parser s a -> Parser s sep -> Parser s [a] |
| 63 | +sepEndBy :: forall m s a sep. (Monad m) => ParserT s m a -> ParserT s m sep -> ParserT s m [a] |
54 | 64 | sepEndBy p sep = sepEndBy1 p sep <|> return []
|
55 | 65 |
|
56 |
| -sepEndBy1 :: forall s a sep. Parser s a -> Parser s sep -> Parser s [a] |
| 66 | +sepEndBy1 :: forall m s a sep. (Monad m) => ParserT s m a -> ParserT s m sep -> ParserT s m [a] |
57 | 67 | sepEndBy1 p sep = do
|
58 | 68 | a <- p
|
59 | 69 | (do sep
|
60 | 70 | as <- sepEndBy p sep
|
61 | 71 | return (a : as)) <|> return [a]
|
62 | 72 |
|
63 |
| -endBy1 :: forall s a sep. Parser s a -> Parser s sep -> Parser s [a] |
| 73 | +endBy1 :: forall m s a sep. (Monad m) => ParserT s m a -> ParserT s m sep -> ParserT s m [a] |
64 | 74 | endBy1 p sep = many1 $ do
|
65 | 75 | a <- p
|
66 | 76 | sep
|
67 | 77 | return a
|
68 | 78 |
|
69 |
| -endBy :: forall s a sep. Parser s a -> Parser s sep -> Parser s [a] |
| 79 | +endBy :: forall m s a sep. (Monad m) => ParserT s m a -> ParserT s m sep -> ParserT s m [a] |
70 | 80 | endBy p sep = many $ do
|
71 | 81 | a <- p
|
72 | 82 | sep
|
73 | 83 | return a
|
74 | 84 |
|
75 |
| -chainr :: forall s a. Parser s a -> Parser s (a -> a -> a) -> a -> Parser s a |
| 85 | +chainr :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a |
76 | 86 | chainr p f a = chainr1 p f <|> return a
|
77 | 87 |
|
78 |
| -chainl :: forall s a. Parser s a -> Parser s (a -> a -> a) -> a -> Parser s a |
| 88 | +chainl :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a |
79 | 89 | chainl p f a = chainl1 p f <|> return a
|
80 | 90 |
|
81 |
| -chainl1 :: forall s a. Parser s a -> Parser s (a -> a -> a) -> Parser s a |
| 91 | +chainl1 :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m (a -> a -> a) -> ParserT s m a |
82 | 92 | chainl1 p f = do
|
83 | 93 | a <- p
|
84 | 94 | chainl1' p f a
|
85 | 95 |
|
86 |
| -chainl1' :: forall s a. Parser s a -> Parser s (a -> a -> a) -> a -> Parser s a |
| 96 | +chainl1' :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a |
87 | 97 | chainl1' p f a = (do f' <- f
|
88 | 98 | a' <- p
|
89 | 99 | chainl1' p f (f' a a')) <|> return a
|
90 | 100 |
|
91 |
| -chainr1 :: forall s a. Parser s a -> Parser s (a -> a -> a) -> Parser s a |
| 101 | +chainr1 :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m (a -> a -> a) -> ParserT s m a |
92 | 102 | chainr1 p f = do
|
93 | 103 | a <- p
|
94 | 104 | chainr1' p f a
|
95 | 105 |
|
96 |
| -chainr1' :: forall s a. Parser s a -> Parser s (a -> a -> a) -> a -> Parser s a |
| 106 | +chainr1' :: forall m s a. (Monad m) => ParserT s m a -> ParserT s m (a -> a -> a) -> a -> ParserT s m a |
97 | 107 | chainr1' p f a = (do f' <- f
|
98 | 108 | a' <- chainr1 p f
|
99 | 109 | return $ f' a a') <|> return a
|
100 | 110 |
|
101 |
| -choice :: forall s a. [Parser s a] -> Parser s a |
| 111 | +choice :: forall m s a. (Monad m) => [ParserT s m a] -> ParserT s m a |
102 | 112 | choice [] = fail "Nothing to parse"
|
103 | 113 | choice [x] = x
|
104 | 114 | choice (x:xs) = x <|> choice xs
|
|
0 commit comments