aboutsummaryrefslogtreecommitdiff
path: root/src/Parser.hs
diff options
context:
space:
mode:
authorAkshay <[email protected]>2020-10-12 06:56:57 +0100
committerAkshay <[email protected]>2020-10-12 06:56:57 +0100
commitc5d07ee83d1522b5ee9753d379dc1daf09600c08 (patch)
treee99b76152f01a89f3fdfa81c7ef515a4ad64d166 /src/Parser.hs
parent2d9320bf71912b2c682c15a8933031394de40936 (diff)
parse signed ints and floats correctly
Diffstat (limited to 'src/Parser.hs')
-rw-r--r--src/Parser.hs24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/Parser.hs b/src/Parser.hs
index 37b0b9d..0ac8b54 100644
--- a/src/Parser.hs
+++ b/src/Parser.hs
@@ -33,15 +33,27 @@ parseString = do
33 char '"' 33 char '"'
34 return (StringLiteral innards) 34 return (StringLiteral innards)
35 35
36parseSign :: Parser (Maybe Char)
37parseSign = do
38 sign <- optionMaybe (oneOf "+-")
39 return $ case sign of
40 Just '+' -> Nothing
41 s -> s
42
36parseInt :: Parser Expr 43parseInt :: Parser Expr
37parseInt = IntLiteral . read <$> many1 digit 44parseInt = do
45 sign <- parseSign
46 val <- many1 digit
47 return $ (IntLiteral . read) $ maybe val (:val) sign
38 48
39parseFloat :: Parser Expr 49parseFloat :: Parser Expr
40parseFloat = do 50parseFloat = do
51 sign <- parseSign
41 characteristic <- many1 digit 52 characteristic <- many1 digit
42 char '.' 53 char '.'
43 mantissa <- many1 digit 54 mantissa <- many1 digit
44 return $ (FloatLiteral . read) $ characteristic ++ "." ++ mantissa 55 let fval = characteristic ++ "." ++ mantissa
56 return $ (FloatLiteral . read) $ maybe fval (:fval) sign
45 57
46symbol :: Parser Char 58symbol :: Parser Char
47symbol = oneOf "!#$%&|*+:/-=<?>@^_~" 59symbol = oneOf "!#$%&|*+:/-=<?>@^_~"
@@ -73,10 +85,10 @@ parseUnquote = parseModifier ',' "unquote"
73 85
74parseLispValue :: Parser Expr 86parseLispValue :: Parser Expr
75parseLispValue = 87parseLispValue =
76 try parseId 88 parseString
77 <|> parseString
78 <|> try parseFloat 89 <|> try parseFloat
79 <|> parseInt 90 <|> try parseInt
91 <|> try parseId
80 <|> parseQuote 92 <|> parseQuote
81 <|> parseQuasiquote 93 <|> parseQuasiquote
82 <|> parseUnquote 94 <|> parseUnquote
@@ -85,7 +97,7 @@ parseLispValue =
85 char '(' >> spaces 97 char '(' >> spaces
86 x <- sepEndBy parseLispValue whiteSpace 98 x <- sepEndBy parseLispValue whiteSpace
87 spaces 99 spaces
88 t <- optionMaybe $ char '.' >> space >> parseLispValue 100 t <- optionMaybe $ space >> char '.' >> space >> parseLispValue
89 spaces >> char ')' 101 spaces >> char ')'
90 return $ maybe (List x) (DottedList x) t 102 return $ maybe (List x) (DottedList x) t
91 <?> "lisp value" 103 <?> "lisp value"