@@ -12,84 +12,103 @@ item = P $ \inp ->
1212 [] -> []
1313 (x: xs) -> [(x, xs)]
1414
15- instance Functor Parser where
16- fmap f p = P $ \ inp ->
17- case parse p inp of
18- [] -> []
19- [(v, out)] -> [(f v, out)]
20-
21- instance Applicative Parser where
22- pure v = P $ \ inp -> [(v, inp)]
23-
24- pf <*> px = P $ \ inp ->
25- case parse pf inp of
26- [] -> []
27- [(f, out)] -> parse (fmap f px) out
28-
29- instance Monad Parser where
30- p >>= f = P $ \ inp ->
31- case parse p inp of
32- [] -> []
33- [(v, out)] -> parse (f v) out
34-
35- instance Alternative Parser where
36- empty = P $ \ inp -> []
37-
38- p <|> q = P $ \ inp ->
39- case parse p inp of
40- [] -> parse q inp
41- [(v, out)] -> [(v, out)]
15+ -- | Three basic parsers: `item`, `return v`, and `empty`.
4216
17+ -- | Succeeds for Single characters that satify the predicate function `p`.
4318sat :: (Char -> Bool ) -> Parser Char
4419sat p = do
4520 x <- item
4621 if p x
4722 then return x
4823 else empty
4924
25+ -- | The `digit` parser is defined for single digits.
5026digit :: Parser Char
5127digit = sat isDigit
5228
29+ -- | The `lower` parser is defined for lower-case letters.
5330lower :: Parser Char
5431lower = sat isLower
5532
33+ -- | The `upper` parser is defined for upper-case letters.
5634upper :: Parser Char
5735upper = sat isUpper
5836
37+ -- | The `letter` parser is defined for arbitrary letters.
5938letter :: Parser Char
6039letter = sat isAlpha
6140
41+ -- | The `alphaum` parser is defined for alphanumerica characters.
6242alphanum :: Parser Char
6343alphanum = sat isAlphaNum
6444
45+ -- | The `char` parser is defined for specific characters.
6546char :: Char -> Parser Char
6647char x = sat (== x)
6748
49+ -- | The `string` parser is defined for the string of characters `xs`
50+ -- with the string itself returned as the result value and succeeds only if the
51+ -- entire target string is consumed from the input to the parser.
6852string :: String -> Parser String
6953string [] = return []
7054string (x: xs) = do
7155 char x
7256 string xs
7357 return (x: xs)
7458
59+ -- | The `ident` parser is defined for strings comprising a lower-case letter
60+ -- followed by zero or more alphanueric characters
7561ident :: Parser String
7662ident = do
7763 x <- lower
7864 xs <- many alphanum
7965 return (x: xs)
8066
67+ -- | The `nat` parser is defined for natural numbers comprising one or more
68+ -- digits.
8169nat :: Parser Int
8270nat = do
8371 xs <- some digit
8472 return (read xs)
8573
74+ -- | The `space` parser is defined for spacing comprising zero or more space,
75+ -- tab, and newline characters.
8676space :: Parser ()
8777space = do
8878 many (sat isSpace)
8979 return ()
9080
81+ -- | The `int` parser is defined for integer values.
9182int :: Parser Int
9283int = do
9384 char ' -'
9485 n <- nat
9586 return (- n) <|> nat
87+
88+ instance Functor Parser where
89+ fmap f p = P $ \ inp ->
90+ case parse p inp of
91+ [] -> []
92+ [(v, out)] -> [(f v, out)]
93+
94+ instance Applicative Parser where
95+ pure v = P $ \ inp -> [(v, inp)]
96+
97+ pf <*> px = P $ \ inp ->
98+ case parse pf inp of
99+ [] -> []
100+ [(f, out)] -> parse (fmap f px) out
101+
102+ instance Monad Parser where
103+ p >>= f = P $ \ inp ->
104+ case parse p inp of
105+ [] -> []
106+ [(v, out)] -> parse (f v) out
107+
108+ instance Alternative Parser where
109+ empty = P $ \ inp -> []
110+
111+ p <|> q = P $ \ inp ->
112+ case parse p inp of
113+ [] -> parse q inp
114+ [(v, out)] -> [(v, out)]
0 commit comments