8 import Control.Applicative
10 ------------------------------------------------------------
11 -- 1. Parsing repetitions
12 ------------------------------------------------------------
13 sequenceA :: Applicative f => [f a] -> f [a]
14 sequenceA [] = pure []
15 sequenceA (x:xs) = (:) <$> x <*> sequenceA xs
16 -- sequenceA (x:xs) = liftA2 (:) x (sequenceA xs)
18 replicateA :: Applicative f => Int -> f a -> f [a]
19 replicateA n x = sequenceA (replicate n x)
21 zeroOrMore :: Parser a -> Parser [a]
22 zeroOrMore p = oneOrMore p <|> pure []
24 oneOrMore :: Parser a -> Parser [a]
25 oneOrMore p = liftA2 (:) p (zeroOrMore p)
27 ------------------------------------------------------------
29 ------------------------------------------------------------
31 spaces :: Parser String
34 ident :: Parser String
37 ------------------------------------------------------------
38 -- 3. Parsing S-expressions
39 ------------------------------------------------------------
41 -- An "identifier" is represented as just a String; however, only
42 -- those Strings consisting of a letter followed by any number of
43 -- letters and digits are valid identifiers.
46 -- An "atom" is either an integer value or an identifier.
47 data Atom = N Integer | I Ident
50 -- An S-expression is either an atom, or a list of S-expressions.