partial exo 6 (Float)

This commit is contained in:
Yann Esposito (Yogsototh) 2013-07-18 10:14:26 +02:00
parent a5285e5ddb
commit 9e59d4fc53
3 changed files with 33 additions and 16 deletions

1
tests/float.in Normal file
View file

@ -0,0 +1 @@
3.14

1
tests/float.out Normal file
View file

@ -0,0 +1 @@
Float 3.14

47
y.hs
View file

@ -4,15 +4,39 @@ import Data.List (foldl')
import Text.ParserCombinators.Parsec hiding (spaces) import Text.ParserCombinators.Parsec hiding (spaces)
import System.Environment (getArgs) import System.Environment (getArgs)
-- The possible LISP values
data LispVal = Atom String data LispVal = Atom String
| List [LispVal] | List [LispVal]
| DottedList [LispVal] LispVal | DottedList [LispVal] LispVal
| Float Float
| Number Integer | Number Integer
| Character Char | Character Char
| String String | String String
| Bool Bool | Bool Bool
deriving (Show) 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 :: Parser Char
symbol = oneOf "!#$%&|*+-/:<=>?@^_~" symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
@ -101,25 +125,16 @@ parseSimpleNumber = do
numStr <- many1 digit numStr <- many1 digit
return (read numStr) return (read numStr)
parseFloat :: Parser LispVal
parseFloat = do
numBeforeDot <- many1 digit
char '.'
numAfterDot <- many1 digit
return $ Float (read (numBeforeDot ++ "." ++ numAfterDot))
parseNumber :: Parser LispVal parseNumber :: Parser LispVal
parseNumber = do parseNumber = do
number <- parseSimpleNumber number <- parseSimpleNumber
<|> parseBaseSpecifiedNumber <|> parseBaseSpecifiedNumber
return (Number number) 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))