From ae8ff4666104497a9d6f1d89f044bbb202f10c71 Mon Sep 17 00:00:00 2001 From: Samir Benmendil Date: Tue, 23 Jan 2018 20:39:54 +0000 Subject: [PATCH] Add parsers for List, DottedList and Quoted Nothing really new here. --- app/Main.hs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/app/Main.hs b/app/Main.hs index 03dbb41..fb8294a 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -65,11 +65,31 @@ parseNumber = do toNum <- radix 'o' -> readOct 'b' -> readInt 2 (\x -> elem x "01") (read . (:[])) +parseList :: Parser LispVal +parseList = liftM List $ sepBy parseExpr spaces + +parseDottedList :: Parser LispVal +parseDottedList = do + head <- endBy parseExpr spaces + tail <- char '.' >> spaces >> parseExpr + return $ DottedList head tail + +parseQuoted :: Parser LispVal +parseQuoted = do + char '\'' + x <- parseExpr + return $ List [Atom "quote", x] + parseExpr :: Parser LispVal parseExpr = parseString - <|> parseCharacter <|> parseNumber <|> parseAtom + <|> try parseCharacter + <|> parseQuoted + <|> do char '(' + x <- try parseList <|> parseDottedList + char ')' + return x readExpr :: String -> String readExpr input = case parse parseExpr "lisp" input of -- 2.48.1