diff options
Diffstat (limited to 'parser.hs')
-rw-r--r-- | parser.hs | 30 |
1 files changed, 24 insertions, 6 deletions
@@ -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")) |