module LexUtil (isIdent,isLower_, -- Char -> Bool
isSymbol, -- Char -> Bool
readInteger, -- String -> Integer
readNumber, -- Integer -> String -> Integer
readRational) -- String -> Rational
where
import HsName(isSymbol)
import Char(isDigit, isOctDigit, isHexDigit, digitToInt, isAlpha, isLower)
import Ratio
isIdent c = isAlpha c || isDigit c || c == '\'' || c == '_'
isLower_ c = isLower c || c == '_'
readInteger :: String -> Integer
readInteger ('0':'o':ds) = readInteger2 8 isOctDigit ds
readInteger ('0':'O':ds) = readInteger2 8 isOctDigit ds
readInteger ('0':'x':ds) = readInteger2 16 isHexDigit ds
readInteger ('0':'X':ds) = readInteger2 16 isHexDigit ds
readInteger ds = readInteger2 10 isDigit ds
readNumber :: Integer -> String -> Integer
readNumber radix ds = readInteger2 radix (const True) ds
readInteger2 :: Integer -> (Char -> Bool) -> String -> Integer
readInteger2 radix isDig ds
= foldl1 (\n d -> n * radix + d) (map (fromIntegral . digitToInt)
(takeWhile isDig ds))
readRational :: String -> Rational
readRational xs
= (readInteger (i ++ m))%1 * 10^^((case e of
"" -> 0
('+':e2) -> read e2
_ -> read e) - length m)
where (i, r1) = span isDigit xs
(m, r2) = span isDigit (dropWhile (== '.') r1)
e = dropWhile (== 'e') r2