@@ -0,0 +1,184 @@
13+data Parser a = P (String -> Either String (a,String))
15+parse : Parser a -> String ->Either String (a,String)
16+parse (P p) inp = p inp
18+instance Monad Parser where
19+ return v = P (\inp => Right (v,inp))
20+ p >>= f = P (\inp => case parse p inp of
22+ Right (v,rest) => parse (f v) rest)
25+instance MonadPlus Parser where
26+ mzero = P (\inp => Left "Parse Error")
27+ mplus p q = P (\inp => case parse p inp of
28+ Left msg => parse q inp
29+ Right (v,out) => Right(v,out))
38+failure : String -> Parser a
39+failure msg = P (\inp => Left msg)
42+item = P (\inp => case unpack inp of
43+ [] => Left "Error! Parsing empty list."
44+ (x::xs) => Right (x, pack xs))
52+(|||) : Parser a -> Parser a -> Parser a
60+sat : (Char -> Bool) -> Parser Char
61+sat p = item >>= (\x => if p x then return x else failure "failed")
63+oneof : List Char -> Parser Char
64+oneof xs = sat (\x => elem x xs)
78+alphanum : Parser Char
79+alphanum = sat isAlphaNum
81+char : Char -> Parser Char
84+string : String -> Parser String
85+helper : List Char -> Parser (List Char)
86+string s = do result <- helper (unpack s)
90+helper (x::xs) = do char x
94+many1 : Parser a -> Parser (List a)
95+many : Parser a -> Parser (List a)
101+many p = many1 p `mplus` return []
105+ident : Parser String
106+ident = do x <- letter
107+ xs <- many1 alphanum
108+ return (pack(x::xs))
112+nat = do xs <- many digit
113+ return (cast (cast xs))
123+space = do many (sat isSpace)
129+token : Parser a -> Parser a
135+identifier : Parser String
136+identifier = token ident
144+symbol : String -> Parser String
145+symbol xs = token (string xs)
147+--apply : Parser a -> String -> List (a,String)
148+--apply p = parse (space >>= (\_ => p))
164+factor = do symbol "("
170+term = do f <- factor
178+eval : String -> Maybe Int
179+eval xs = case (parse expr xs) of
180+ Right (n,rest) => if rest == "" then Just n else Nothing