summaryrefslogtreecommitdiff
path: root/parser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'parser.hs')
-rw-r--r--parser.hs30
1 files changed, 24 insertions, 6 deletions
diff --git a/parser.hs b/parser.hs
index 1b103d4..3ba5e18 100644
--- a/parser.hs
+++ b/parser.hs
@@ -112,8 +112,8 @@ pParenExpr = do
return e
pLiteral :: Parser Literal
-pLiteral = (LitInt <$> pInteger) <|> (LitInt <$> pCharStr) <|> (LitString <$> pString)
- <|> try pLitCall <|> (LitVar <$> pName)
+pLiteral = (LitFloat <$> pFloat) <|> (LitInt <$> pInteger) <|> (LitInt <$> pCharStr)
+ <|> (LitString <$> pString) <|> try pLitCall <|> (LitVar <$> pName)
pLitCall :: Parser Literal
pLitCall = do
@@ -183,8 +183,8 @@ pStReturn = do
primitiveTypes :: Map.Map String Type
primitiveTypes = Map.fromList
- [("i1", TypeInt 1), ("i8", TypeInt 8), ("i16", TypeInt 16), ("i32", TypeInt 32), ("i64", TypeInt 64),
- ("u8", TypeUInt 8), ("u16", TypeUInt 16), ("u32", TypeUInt 32), ("u64", TypeUInt 64),
+ [("i8", TypeInt 8), ("i16", TypeInt 16), ("i32", TypeInt 32), ("i64", TypeInt 64),
+ ("u1", TypeUInt 1), ("u8", TypeUInt 8), ("u16", TypeUInt 16), ("u32", TypeUInt 32), ("u64", TypeUInt 64),
("float", TypeFloat), ("double", TypeDouble)]
findPrimType :: String -> Type
@@ -231,7 +231,25 @@ pName = ((:) <$> pFirstChar <*> many pOtherChar) << pWhiteComment
pOtherChar = satisfy (isAlpha .||. isDigit .||. (=='_'))
pInteger :: Parser Integer
-pInteger = (read <$> many1 (satisfy isDigit)) << pWhiteComment
+pInteger = (read <$> many1 digit) << pWhiteComment
+
+pFloat :: Parser Double
+pFloat = try $ do
+ pre <- many1 digit
+ post <- choice [pExponent,
+ (do
+ void $ char '.'
+ s <- many1 digit
+ ex <- option "" pExponent
+ return $ '.' : s ++ ex)]
+ pWhiteComment
+ return $ read $ pre ++ post
+ where
+ pExponent = do
+ c <- choice [char 'e', char 'E']
+ pm <- option "" $ choice [string "+", string "-"]
+ val <- many1 digit
+ return $ c : pm ++ val
pString :: Parser String
pString = do
@@ -264,7 +282,7 @@ pEscapeHex = do
return $ chr $ 16 * c1 + c2
where
pHexChar :: Parser Int
- pHexChar = (liftM (\c -> ord c - ord '0') (satisfy isDigit))
+ pHexChar = (liftM (\c -> ord c - ord '0') digit)
<|> (liftM (\c -> ord c - ord 'a' + 10) (oneOf "abcdef"))
<|> (liftM (\c -> ord c - ord 'A' + 10) (oneOf "ABCDEF"))