diff --git a/simple_parser.hs b/simple_parser.hs index 9948b94..8f60491 100644 --- a/simple_parser.hs +++ b/simple_parser.hs @@ -1,3 +1,4 @@ +import Control.Monad import System.Environment import Text.ParserCombinators.Parsec hiding (spaces) @@ -7,8 +8,37 @@ symbol = oneOf "!#$%&|*+-/:<=>?@^_~" spaces :: Parser () spaces = skipMany1 space +data LispVal = Atom String + | List [LispVal] + | DottedList [LispVal] LispVal + | Number Integer + | String String + | Bool Bool + +parseString :: Parser LispVal +parseString = do { char '"'; + x <- many (noneOf "\""); + char '"'; + return $ String x; +} + +parseAtom :: Parser LispVal +parseAtom = do first <- letter <|> symbol + rest <- many (letter <|> digit <|> symbol) + let atom = first:rest + return $ case atom of + "#t" -> Bool True + "#f" -> Bool False + _ -> Atom atom + +parseNumber :: Parser LispVal +parseNumber = liftM (Number . read) $ many1 digit + +parseExpr :: Parser LispVal +parseExpr = parseAtom <|> parseString <|> parseNumber + readExpr :: String -> String -readExpr input = case parse (spaces >> symbol) "lisp" input of +readExpr input = case parse parseExpr "lisp" input of Left err -> "No match: " ++ show err Right val -> "Found value"