@@ -668,6 +668,9 @@ lexStdToken = do
668
668
(n, str) <- lexBinary
669
669
con <- intHash
670
670
return (con (n, ' 0' : c: str))
671
+ | toLower c == ' x' && isHexDigit d && HexFloatLiterals `elem` exts -> do
672
+ discard 2
673
+ lexHexadecimalFloat c
671
674
| toLower c == ' x' && isHexDigit d -> do
672
675
discard 2
673
676
(n, str) <- lexHexadecimal
@@ -1036,22 +1039,50 @@ lexDecimalOrFloat = do
1036
1039
' #' : _ | MagicHash `elem` exts -> discard 1 >> return (IntTokHash (parseInteger 10 ds, ds))
1037
1040
_ -> return (IntTok (parseInteger 10 ds, ds))
1038
1041
1039
- where
1040
- lexExponent :: Lex a (Integer , String )
1041
- lexExponent = do
1042
- (e: r) <- getInput
1043
- discard 1 -- 'e' or 'E'
1044
- case r of
1045
- ' +' : d: _ | isDigit d -> do
1042
+ lexExponent :: Lex a (Integer , String )
1043
+ lexExponent = do
1044
+ (e: r) <- getInput
1045
+ discard 1 -- discard ex notation
1046
+ case r of
1047
+ ' +' : d: _ | isDigit d -> do
1046
1048
discard 1
1047
1049
(n, str) <- lexDecimal
1048
1050
return (n, e: ' +' : str)
1049
- ' -' : d: _ | isDigit d -> do
1051
+ ' -' : d: _ | isDigit d -> do
1050
1052
discard 1
1051
1053
(n, str) <- lexDecimal
1052
1054
return (negate n, e: ' -' : str)
1053
- d: _ | isDigit d -> lexDecimal >>= \ (n,str) -> return (n, e: str)
1054
- _ -> fail " Float with missing exponent"
1055
+ d: _ | isDigit d -> lexDecimal >>= \ (n,str) -> return (n, e: str)
1056
+ _ -> fail " Float with missing exponent"
1057
+
1058
+ lexHexadecimalFloat :: Char -> Lex a Token
1059
+ lexHexadecimalFloat c = do
1060
+ ds <- lexWhile isHexDigit
1061
+ rest <- getInput
1062
+ exts <- getExtensionsL
1063
+ case rest of
1064
+ (' .' : d: _) | isHexDigit d -> do
1065
+ discard 1
1066
+ frac <- lexWhile isHexDigit
1067
+ let num = parseInteger 16 ds
1068
+ numFrac = parseFrac frac
1069
+ (exponent , estr) <- do
1070
+ rest2 <- getInput
1071
+ case rest2 of
1072
+ ' p' : _ -> lexExponent
1073
+ ' P' : _ -> lexExponent
1074
+ _ -> return (0 ," " )
1075
+ con <- lexHash FloatTok FloatTokHash (Right DoubleTokHash )
1076
+ return $ con (((num% 1 ) + numFrac) * 2 ^^ (exponent ), ' 0' : c: ds ++ ' .' : frac ++ estr)
1077
+ e: _ | toLower e == ' p' -> do
1078
+ (exponent , estr) <- lexExponent
1079
+ con <- lexHash FloatTok FloatTokHash (Right DoubleTokHash )
1080
+ return $ con (((parseInteger 16 ds)% 1 ) * 2 ^^ exponent , ' 0' : c: ds ++ estr)
1081
+ _ -> return (IntTok (parseInteger 16 ds, ' 0' : c: ds))
1082
+ where
1083
+ parseFrac :: String -> Rational
1084
+ parseFrac ds =
1085
+ foldl (\ n (dp, d) -> n + (d / (16 ^^ dp))) (0 % 1 ) $ zip [1 .. ] (map ((% 1 ) . toInteger . digitToInt) ds)
1055
1086
1056
1087
lexHash :: (b -> Token ) -> (b -> Token ) -> Either String (b -> Token ) -> Lex a (b -> Token )
1057
1088
lexHash a b c = do
0 commit comments