From 9e59d4fc5304f937bfb2a81a77e5c1b778f468e4 Mon Sep 17 00:00:00 2001 From: "Yann Esposito (Yogsototh)" Date: Thu, 18 Jul 2013 10:14:26 +0200 Subject: [PATCH] partial exo 6 (Float) --- tests/float.in | 1 + tests/float.out | 1 + y.hs | 47 +++++++++++++++++++++++++++++++---------------- 3 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 tests/float.in create mode 100644 tests/float.out diff --git a/tests/float.in b/tests/float.in new file mode 100644 index 0000000..6324d40 --- /dev/null +++ b/tests/float.in @@ -0,0 +1 @@ +3.14 diff --git a/tests/float.out b/tests/float.out new file mode 100644 index 0000000..c13b93f --- /dev/null +++ b/tests/float.out @@ -0,0 +1 @@ +Float 3.14 diff --git a/y.hs b/y.hs index 75591bb..bb4cbc4 100644 --- a/y.hs +++ b/y.hs @@ -4,15 +4,39 @@ import Data.List (foldl') import Text.ParserCombinators.Parsec hiding (spaces) import System.Environment (getArgs) +-- The possible LISP values data LispVal = Atom String | List [LispVal] | DottedList [LispVal] LispVal + | Float Float | Number Integer | Character Char | String String | Bool Bool deriving (Show) +-- The program (in IO) +-- execute the arguments given in parameters +main :: IO () +main = do + args <- getArgs + putStrLn (readExpr (args !!0)) + +-- ReadExpr will take a program as input +-- and will return the result of a parseExpr +readExpr :: String -> String +readExpr input = case parse parseExpr "lisp" input of + Left err -> "No match: " ++ show err + Right val -> show val + +-- parseExpr will parse the Expression +parseExpr :: Parser LispVal +parseExpr = parseString + <|> try parseChar -- #\a #\b etc... + <|> try parseFloat -- 3.1415 + <|> parseNumber -- 3, #b011001, #o070, #d930, #xFF3 + <|> parseAtom -- symbol-323 + symbol :: Parser Char symbol = oneOf "!#$%&|*+-/:<=>?@^_~" @@ -101,25 +125,16 @@ parseSimpleNumber = do numStr <- many1 digit return (read numStr) +parseFloat :: Parser LispVal +parseFloat = do + numBeforeDot <- many1 digit + char '.' + numAfterDot <- many1 digit + return $ Float (read (numBeforeDot ++ "." ++ numAfterDot)) + parseNumber :: Parser LispVal parseNumber = do number <- parseSimpleNumber <|> parseBaseSpecifiedNumber return (Number number) -parseExpr :: Parser LispVal -parseExpr = parseString - <|> try parseChar - <|> parseNumber - <|> parseAtom - - -readExpr :: String -> String -readExpr input = case parse parseExpr "lisp" input of - Left err -> "No match: " ++ show err - Right val -> show val - -main :: IO () -main = do - args <- getArgs - putStrLn (readExpr (args !!0))