Skip to content

Commit

Permalink
completed non exercises part
Browse files Browse the repository at this point in the history
time for exercises
  • Loading branch information
kalotay committed Feb 8, 2012
1 parent 6a83895 commit 384cdb3
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion simple_parser.hs
@@ -1,3 +1,4 @@
import Control.Monad
import System.Environment
import Text.ParserCombinators.Parsec hiding (spaces)

Expand All @@ -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"

Expand Down

0 comments on commit 384cdb3

Please sign in to comment.