{-# LANGUAGE Trustworthy #-}{-# LANGUAGE NoImplicitPrelude #-}------------------------------------------------------------------------------- |-- Module : Text.Read.Lex-- Copyright : (c) The University of Glasgow 2002-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : provisional-- Portability : non-portable (uses Text.ParserCombinators.ReadP)---- The cut-down Haskell lexer, used by Text.Read-------------------------------------------------------------------------------moduleText.Read.Lex-- lexing types(Lexeme (..),Number ,numberToInteger ,numberToFixed ,numberToRational ,numberToRangedRational -- lexer,lex ,expect ,hsLex ,lexChar ,readBinP ,readIntP ,readOctP ,readDecP ,readHexP ,isSymbolChar )whereimportText.ParserCombinators.ReadP importGHC.Base importGHC.Char importGHC.Num (Num (..),Integer )importGHC.Show (Show (..))importGHC.Unicode (GeneralCategory (..),generalCategory ,isSpace ,isAlpha ,isAlphaNum )importGHC.Real (Rational ,(%) ,fromIntegral ,Integral ,toInteger ,(^) ,quot ,even )importGHC.List importGHC.Enum (minBound ,maxBound )importData.Maybe -- local copy to break import-cycle-- | @'guard' b@ is @'return' ()@ if @b@ is 'True',-- and 'mzero' if @b@ is 'False'.guard ::(MonadPlus m )=>Bool ->m ()guard :: forall (m :: * -> *). MonadPlus m => Bool -> m () guard Bool True =() -> m () forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return ()guard Bool False =m () forall a. m a forall (m :: * -> *) a. MonadPlus m => m a mzero -- ------------------------------------------------------------------------------- Lexing types-- ^ Haskell lexemes.dataLexeme =Char Char -- ^ Character literal|String String -- ^ String literal, with escapes interpreted|Punc String -- ^ Punctuation or reserved symbol, e.g. @(@, @::@|Ident String -- ^ Haskell identifier, e.g. @foo@, @Baz@|Symbol String -- ^ Haskell symbol, e.g. @>>@, @:%@|Number Number -- ^ @since 4.6.0.0|EOF deriving(Lexeme -> Lexeme -> Bool (Lexeme -> Lexeme -> Bool) -> (Lexeme -> Lexeme -> Bool) -> Eq Lexeme forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: Lexeme -> Lexeme -> Bool == :: Lexeme -> Lexeme -> Bool $c/= :: Lexeme -> Lexeme -> Bool /= :: Lexeme -> Lexeme -> Bool Eq -- ^ @since 2.01,Int -> Lexeme -> ShowS [Lexeme] -> ShowS Lexeme -> String (Int -> Lexeme -> ShowS) -> (Lexeme -> String) -> ([Lexeme] -> ShowS) -> Show Lexeme forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: Int -> Lexeme -> ShowS showsPrec :: Int -> Lexeme -> ShowS $cshow :: Lexeme -> String show :: Lexeme -> String $cshowList :: [Lexeme] -> ShowS showList :: [Lexeme] -> ShowS Show -- ^ @since 2.01)-- | @since 4.6.0.0dataNumber =MkNumber Int -- BaseDigits -- Integral part|MkDecimal Digits -- Integral part(Maybe Digits )-- Fractional part(Maybe Integer )-- Exponentderiving(Number -> Number -> Bool (Number -> Number -> Bool) -> (Number -> Number -> Bool) -> Eq Number forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: Number -> Number -> Bool == :: Number -> Number -> Bool $c/= :: Number -> Number -> Bool /= :: Number -> Number -> Bool Eq -- ^ @since 4.6.0.0,Int -> Number -> ShowS [Number] -> ShowS Number -> String (Int -> Number -> ShowS) -> (Number -> String) -> ([Number] -> ShowS) -> Show Number forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: Int -> Number -> ShowS showsPrec :: Int -> Number -> ShowS $cshow :: Number -> String show :: Number -> String $cshowList :: [Number] -> ShowS showList :: [Number] -> ShowS Show -- ^ @since 4.6.0.0)-- | @since 4.5.1.0numberToInteger ::Number ->Maybe Integer numberToInteger :: Number -> Maybe Integer numberToInteger (MkNumber Int base Digits iPart )=Integer -> Maybe Integer forall a. a -> Maybe a Just (Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val (Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral Int base )Digits iPart )numberToInteger (MkDecimal Digits iPart Maybe Digits Nothing Maybe Integer Nothing )=Integer -> Maybe Integer forall a. a -> Maybe a Just (Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val Integer 10Digits iPart )numberToInteger Number _=Maybe Integer forall a. Maybe a Nothing -- | @since 4.7.0.0numberToFixed ::Integer ->Number ->Maybe (Integer ,Integer )numberToFixed :: Integer -> Number -> Maybe (Integer, Integer) numberToFixed Integer _(MkNumber Int base Digits iPart )=(Integer, Integer) -> Maybe (Integer, Integer) forall a. a -> Maybe a Just (Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val (Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral Int base )Digits iPart ,Integer 0)numberToFixed Integer _(MkDecimal Digits iPart Maybe Digits Nothing Maybe Integer Nothing )=(Integer, Integer) -> Maybe (Integer, Integer) forall a. a -> Maybe a Just (Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val Integer 10Digits iPart ,Integer 0)numberToFixed Integer p (MkDecimal Digits iPart (Just Digits fPart )Maybe Integer Nothing )=leti :: Integer i =Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val Integer 10Digits iPart f :: Integer f =Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val Integer 10(Integer -> Digits -> Digits forall a. Integer -> [a] -> [a] integerTake Integer p (Digits fPart Digits -> Digits -> Digits forall a. [a] -> [a] -> [a] ++ Int -> Digits forall a. a -> [a] repeat Int 0))-- Sigh, we really want genericTake, but that's above us in-- the hierarchy, so we define our own version here (actually-- specialised to Integer)integerTake ::Integer ->[a ]->[a ]integerTake :: forall a. Integer -> [a] -> [a] integerTake Integer n [a] _|Integer n Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool <= Integer 0=[]integerTake Integer _[]=[]integerTake Integer n (a x : [a] xs )=a x a -> [a] -> [a] forall a. a -> [a] -> [a] : Integer -> [a] -> [a] forall a. Integer -> [a] -> [a] integerTake (Integer n Integer -> Integer -> Integer forall a. Num a => a -> a -> a - Integer 1)[a] xs in(Integer, Integer) -> Maybe (Integer, Integer) forall a. a -> Maybe a Just (Integer i ,Integer f )numberToFixed Integer _Number _=Maybe (Integer, Integer) forall a. Maybe a Nothing -- This takes a floatRange, and if the Rational would be outside of-- the floatRange then it may return Nothing. Not that it will not-- /necessarily/ return Nothing, but it is good enough to fix the-- space problems in #5688-- Ways this is conservative:-- * the floatRange is in base 2, but we pretend it is in base 10-- * we pad the floatRange a bit, just in case it is very small-- and we would otherwise hit an edge case-- * We only worry about numbers that have an exponent. If they don't-- have an exponent then the Rational won't be much larger than the-- Number, so there is no problem-- | @since 4.5.1.0numberToRangedRational ::(Int ,Int )->Number ->Maybe Rational -- Nothing = InfnumberToRangedRational :: (Int, Int) -> Number -> Maybe Rational numberToRangedRational (Int neg ,Int pos )n :: Number n @(MkDecimal Digits iPart Maybe Digits mFPart (Just Integer exp ))-- if exp is out of integer bounds,-- then the number is definitely out of range|Integer exp Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool > Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral (Int forall a. Bounded a => a maxBound ::Int )Bool -> Bool -> Bool || Integer exp Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool < Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral (Int forall a. Bounded a => a minBound ::Int )=Maybe Rational forall a. Maybe a Nothing |Bool otherwise =letmFirstDigit :: Maybe Int mFirstDigit =case(Int -> Bool) -> Digits -> Digits forall a. (a -> Bool) -> [a] -> [a] dropWhile (Int 0Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == )Digits iPart ofiPart' :: Digits iPart' @(Int _: Digits _)->Int -> Maybe Int forall a. a -> Maybe a Just (Digits -> Int forall a. [a] -> Int length Digits iPart' )[]->caseMaybe Digits mFPart ofMaybe Digits Nothing ->Maybe Int forall a. Maybe a Nothing Just Digits fPart ->case(Int -> Bool) -> Digits -> (Digits, Digits) forall a. (a -> Bool) -> [a] -> ([a], [a]) span (Int 0Int -> Int -> Bool forall a. Eq a => a -> a -> Bool == )Digits fPart of(Digits _,[])->Maybe Int forall a. Maybe a Nothing (Digits zeroes ,Digits _)->Int -> Maybe Int forall a. a -> Maybe a Just (Int -> Int forall a. Num a => a -> a negate (Digits -> Int forall a. [a] -> Int length Digits zeroes ))incaseMaybe Int mFirstDigit ofMaybe Int Nothing ->Rational -> Maybe Rational forall a. a -> Maybe a Just Rational 0Just Int firstDigit ->letfirstDigit' :: Int firstDigit' =Int firstDigit Int -> Int -> Int forall a. Num a => a -> a -> a + Integer -> Int forall a. Num a => Integer -> a fromInteger Integer exp inifInt firstDigit' Int -> Int -> Bool forall a. Ord a => a -> a -> Bool > (Int pos Int -> Int -> Int forall a. Num a => a -> a -> a + Int 3)thenMaybe Rational forall a. Maybe a Nothing elseifInt firstDigit' Int -> Int -> Bool forall a. Ord a => a -> a -> Bool < (Int neg Int -> Int -> Int forall a. Num a => a -> a -> a - Int 3)thenRational -> Maybe Rational forall a. a -> Maybe a Just Rational 0elseRational -> Maybe Rational forall a. a -> Maybe a Just (Number -> Rational numberToRational Number n )numberToRangedRational (Int, Int) _Number n =Rational -> Maybe Rational forall a. a -> Maybe a Just (Number -> Rational numberToRational Number n )-- | @since 4.6.0.0numberToRational ::Number ->Rational numberToRational :: Number -> Rational numberToRational (MkNumber Int base Digits iPart )=Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val (Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral Int base )Digits iPart Integer -> Integer -> Rational forall a. Integral a => a -> a -> Ratio a % Integer 1numberToRational (MkDecimal Digits iPart Maybe Digits mFPart Maybe Integer mExp )=leti :: Integer i =Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val Integer 10Digits iPart incase(Maybe Digits mFPart ,Maybe Integer mExp )of(Maybe Digits Nothing ,Maybe Integer Nothing )->Integer i Integer -> Integer -> Rational forall a. Integral a => a -> a -> Ratio a % Integer 1(Maybe Digits Nothing ,Just Integer exp )|Integer exp Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool >= Integer 0->(Integer i Integer -> Integer -> Integer forall a. Num a => a -> a -> a * (Integer 10Integer -> Integer -> Integer forall a b. (Num a, Integral b) => a -> b -> a ^ Integer exp ))Integer -> Integer -> Rational forall a. Integral a => a -> a -> Ratio a % Integer 1|Bool otherwise ->Integer i Integer -> Integer -> Rational forall a. Integral a => a -> a -> Ratio a % (Integer 10Integer -> Integer -> Integer forall a b. (Num a, Integral b) => a -> b -> a ^ (-Integer exp ))(Just Digits fPart ,Maybe Integer Nothing )->Integer -> Integer -> Digits -> Rational fracExp Integer 0Integer i Digits fPart (Just Digits fPart ,Just Integer exp )->Integer -> Integer -> Digits -> Rational fracExp Integer exp Integer i Digits fPart -- fracExp is a bit more efficient in calculating the Rational.-- Instead of calculating the fractional part alone, then-- adding the integral part and finally multiplying with-- 10 ^ exp if an exponent was given, do it all at once.-- ------------------------------------------------------------------------------- Lexinglex ::ReadP Lexeme lex :: ReadP Lexeme lex =ReadP () skipSpaces ReadP () -> ReadP Lexeme -> ReadP Lexeme forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> ReadP Lexeme lexToken -- | @since 4.7.0.0expect ::Lexeme ->ReadP ()expect :: Lexeme -> ReadP () expect Lexeme lexeme =do{ReadP () skipSpaces ;Lexeme thing <-ReadP Lexeme lexToken ;ifLexeme thing Lexeme -> Lexeme -> Bool forall a. Eq a => a -> a -> Bool == Lexeme lexeme then() -> ReadP () forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return ()elseReadP () forall a. ReadP a pfail }hsLex ::ReadP String -- ^ Haskell lexer: returns the lexed string, rather than the lexemehsLex :: ReadP String hsLex =doReadP () skipSpaces (String s ,Lexeme _)<-ReadP Lexeme -> ReadP (String, Lexeme) forall a. ReadP a -> ReadP (String, a) gather ReadP Lexeme lexToken String -> ReadP String forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return String s lexToken ::ReadP Lexeme lexToken :: ReadP Lexeme lexToken =ReadP Lexeme lexEOF ReadP Lexeme -> ReadP Lexeme -> ReadP Lexeme forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Lexeme lexLitChar ReadP Lexeme -> ReadP Lexeme -> ReadP Lexeme forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Lexeme lexString ReadP Lexeme -> ReadP Lexeme -> ReadP Lexeme forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Lexeme lexPunc ReadP Lexeme -> ReadP Lexeme -> ReadP Lexeme forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Lexeme lexSymbol ReadP Lexeme -> ReadP Lexeme -> ReadP Lexeme forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Lexeme lexId ReadP Lexeme -> ReadP Lexeme -> ReadP Lexeme forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Lexeme lexNumber -- ------------------------------------------------------------------------ End of filelexEOF ::ReadP Lexeme lexEOF :: ReadP Lexeme lexEOF =doString s <-ReadP String look Bool -> ReadP () forall (m :: * -> *). MonadPlus m => Bool -> m () guard (String -> Bool forall a. [a] -> Bool null String s )Lexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Lexeme EOF -- ----------------------------------------------------------------------------- Single character lexemeslexPunc ::ReadP Lexeme lexPunc :: ReadP Lexeme lexPunc =doChar c <-(Char -> Bool) -> ReadP Char satisfy Char -> Bool isPuncChar Lexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (String -> Lexeme Punc [Char c ])-- | The @special@ character class as defined in the Haskell Report.isPuncChar ::Char ->Bool isPuncChar :: Char -> Bool isPuncChar Char c =Char c Char -> String -> Bool forall a. Eq a => a -> [a] -> Bool `elem` String ",;()[]{}`"-- ------------------------------------------------------------------------ SymbolslexSymbol ::ReadP Lexeme lexSymbol :: ReadP Lexeme lexSymbol =doString s <-(Char -> Bool) -> ReadP String munch1 Char -> Bool isSymbolChar ifString s String -> [String] -> Bool forall a. Eq a => a -> [a] -> Bool `elem` [String] reserved_ops thenLexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (String -> Lexeme Punc String s )-- Reserved-ops count as punctuationelseLexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (String -> Lexeme Symbol String s )wherereserved_ops :: [String] reserved_ops =[String "..",String "::",String "=",String "\\",String "|",String "<-",String "->",String "@",String "~",String "=>"]isSymbolChar ::Char ->Bool isSymbolChar :: Char -> Bool isSymbolChar Char c =Bool -> Bool not (Char -> Bool isPuncChar Char c )Bool -> Bool -> Bool && caseChar -> GeneralCategory generalCategory Char c ofGeneralCategory MathSymbol ->Bool True GeneralCategory CurrencySymbol ->Bool True GeneralCategory ModifierSymbol ->Bool True GeneralCategory OtherSymbol ->Bool True GeneralCategory DashPunctuation ->Bool True GeneralCategory OtherPunctuation ->Bool -> Bool not (Char c Char -> String -> Bool forall a. Eq a => a -> [a] -> Bool `elem` String "'\"")GeneralCategory ConnectorPunctuation ->Char c Char -> Char -> Bool forall a. Eq a => a -> a -> Bool /= Char '_'GeneralCategory _->Bool False -- ------------------------------------------------------------------------ identifierslexId ::ReadP Lexeme lexId :: ReadP Lexeme lexId =doChar c <-(Char -> Bool) -> ReadP Char satisfy Char -> Bool isIdsChar String s <-(Char -> Bool) -> ReadP String munch Char -> Bool isIdfChar Lexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (String -> Lexeme Ident (Char c Char -> ShowS forall a. a -> [a] -> [a] : String s ))where-- Identifiers can start with a '_'isIdsChar :: Char -> Bool isIdsChar Char c =Char -> Bool isAlpha Char c Bool -> Bool -> Bool || Char c Char -> Char -> Bool forall a. Eq a => a -> a -> Bool == Char '_'isIdfChar :: Char -> Bool isIdfChar Char c =Char -> Bool isAlphaNum Char c Bool -> Bool -> Bool || Char c Char -> String -> Bool forall a. Eq a => a -> [a] -> Bool `elem` String "_'"-- ----------------------------------------------------------------------------- Lexing character literalslexLitChar ::ReadP Lexeme lexLitChar :: ReadP Lexeme lexLitChar =doChar _<-Char -> ReadP Char char Char '\''(Char c ,Bool esc )<-ReadP (Char, Bool) lexCharE Bool -> ReadP () forall (m :: * -> *). MonadPlus m => Bool -> m () guard (Bool esc Bool -> Bool -> Bool || Char c Char -> Char -> Bool forall a. Eq a => a -> a -> Bool /= Char '\'')-- Eliminate '' possibilityChar _<-Char -> ReadP Char char Char '\''Lexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Char -> Lexeme Char Char c )lexChar ::ReadP Char lexChar :: ReadP Char lexChar =do{(Char c ,Bool _)<-ReadP (Char, Bool) lexCharE ;ReadP () consumeEmpties ;Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char c }where-- Consumes the string "\&" repeatedly and greedily (will only produce one match)consumeEmpties ::ReadP ()consumeEmpties :: ReadP () consumeEmpties =doString rest <-ReadP String look caseString rest of(Char '\\': Char '&': String _)->String -> ReadP String string String "\\&"ReadP String -> ReadP () -> ReadP () forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> ReadP () consumeEmpties String _->() -> ReadP () forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return ()lexCharE ::ReadP (Char ,Bool )-- "escaped or not"?lexCharE :: ReadP (Char, Bool) lexCharE =doChar c1 <-ReadP Char get ifChar c1 Char -> Char -> Bool forall a. Eq a => a -> a -> Bool == Char '\\'thendoChar c2 <-ReadP Char lexEsc ;(Char, Bool) -> ReadP (Char, Bool) forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Char c2 ,Bool True )else(Char, Bool) -> ReadP (Char, Bool) forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Char c1 ,Bool False )wherelexEsc :: ReadP Char lexEsc =ReadP Char lexEscChar ReadP Char -> ReadP Char -> ReadP Char forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Char lexNumeric ReadP Char -> ReadP Char -> ReadP Char forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Char lexCntrlChar ReadP Char -> ReadP Char -> ReadP Char forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP Char lexAscii lexEscChar :: ReadP Char lexEscChar =doChar c <-ReadP Char get caseChar c ofChar 'a'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\a'Char 'b'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\b'Char 'f'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\f'Char 'n'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\n'Char 'r'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\r'Char 't'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\t'Char 'v'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\v'Char '\\'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\\'Char '\"'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\"'Char '\''->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\''Char _->ReadP Char forall a. ReadP a pfail lexNumeric :: ReadP Char lexNumeric =doInt base <-ReadP Int lexBaseChar ReadP Int -> ReadP Int -> ReadP Int forall a. ReadP a -> ReadP a -> ReadP a <++ Int -> ReadP Int forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Int 10Integer n <-Int -> ReadP Integer lexInteger Int base Bool -> ReadP () forall (m :: * -> *). MonadPlus m => Bool -> m () guard (Integer n Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool <= Int -> Integer forall a. Integral a => a -> Integer toInteger (Char -> Int ord Char forall a. Bounded a => a maxBound ))Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Int -> Char chr (Integer -> Int forall a. Num a => Integer -> a fromInteger Integer n ))lexCntrlChar :: ReadP Char lexCntrlChar =doChar _<-Char -> ReadP Char char Char '^'Char c <-ReadP Char get caseChar c ofChar '@'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^@'Char 'A'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^A'Char 'B'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^B'Char 'C'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^C'Char 'D'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^D'Char 'E'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^E'Char 'F'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^F'Char 'G'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^G'Char 'H'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^H'Char 'I'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^I'Char 'J'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^J'Char 'K'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^K'Char 'L'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^L'Char 'M'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^M'Char 'N'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^N'Char 'O'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^O'Char 'P'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^P'Char 'Q'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^Q'Char 'R'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^R'Char 'S'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^S'Char 'T'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^T'Char 'U'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^U'Char 'V'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^V'Char 'W'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^W'Char 'X'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^X'Char 'Y'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^Y'Char 'Z'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^Z'Char '['->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^['Char '\\'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^\'Char ']'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^]'Char '^'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^^'Char '_'->Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\^_'Char _->ReadP Char forall a. ReadP a pfail lexAscii :: ReadP Char lexAscii =[ReadP Char] -> ReadP Char forall a. [ReadP a] -> ReadP a choice [(String -> ReadP String string String "SOH"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\SOH')ReadP Char -> ReadP Char -> ReadP Char forall a. ReadP a -> ReadP a -> ReadP a <++ (String -> ReadP String string String "SO"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\SO')-- \SO and \SOH need maximal-munch treatment-- See the Haskell report Sect 2.6,String -> ReadP String string String "NUL"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\NUL',String -> ReadP String string String "STX"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\STX',String -> ReadP String string String "ETX"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\ETX',String -> ReadP String string String "EOT"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\EOT',String -> ReadP String string String "ENQ"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\ENQ',String -> ReadP String string String "ACK"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\ACK',String -> ReadP String string String "BEL"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\BEL',String -> ReadP String string String "BS"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\BS',String -> ReadP String string String "HT"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\HT',String -> ReadP String string String "LF"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\LF',String -> ReadP String string String "VT"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\VT',String -> ReadP String string String "FF"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\FF',String -> ReadP String string String "CR"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\CR',String -> ReadP String string String "SI"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\SI',String -> ReadP String string String "DLE"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\DLE',String -> ReadP String string String "DC1"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\DC1',String -> ReadP String string String "DC2"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\DC2',String -> ReadP String string String "DC3"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\DC3',String -> ReadP String string String "DC4"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\DC4',String -> ReadP String string String "NAK"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\NAK',String -> ReadP String string String "SYN"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\SYN',String -> ReadP String string String "ETB"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\ETB',String -> ReadP String string String "CAN"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\CAN',String -> ReadP String string String "EM"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\EM',String -> ReadP String string String "SUB"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\SUB',String -> ReadP String string String "ESC"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\ESC',String -> ReadP String string String "FS"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\FS',String -> ReadP String string String "GS"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\GS',String -> ReadP String string String "RS"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\RS',String -> ReadP String string String "US"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\US',String -> ReadP String string String "SP"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\SP',String -> ReadP String string String "DEL"ReadP String -> ReadP Char -> ReadP Char forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> Char -> ReadP Char forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Char '\DEL']-- ----------------------------------------------------------------------------- string literallexString ::ReadP Lexeme lexString :: ReadP Lexeme lexString =doChar _<-Char -> ReadP Char char Char '"'ShowS -> ReadP Lexeme body ShowS forall a. a -> a id wherebody :: ShowS -> ReadP Lexeme body ShowS f =do(Char c ,Bool esc )<-ReadP (Char, Bool) lexStrItem ifChar c Char -> Char -> Bool forall a. Eq a => a -> a -> Bool /= Char '"'Bool -> Bool -> Bool || Bool esc thenShowS -> ReadP Lexeme body (ShowS f ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c . (Char c Char -> ShowS forall a. a -> [a] -> [a] : ))elselets :: String s =ShowS f String ""inLexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (String -> Lexeme String String s )lexStrItem :: ReadP (Char, Bool) lexStrItem =(ReadP () lexEmpty ReadP () -> ReadP (Char, Bool) -> ReadP (Char, Bool) forall a b. ReadP a -> ReadP b -> ReadP b forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >> ReadP (Char, Bool) lexStrItem )ReadP (Char, Bool) -> ReadP (Char, Bool) -> ReadP (Char, Bool) forall a. ReadP a -> ReadP a -> ReadP a +++ ReadP (Char, Bool) lexCharE lexEmpty :: ReadP () lexEmpty =doChar _<-Char -> ReadP Char char Char '\\'Char c <-ReadP Char get caseChar c ofChar '&'->() -> ReadP () forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return ()Char _|Char -> Bool isSpace Char c ->doReadP () skipSpaces ;Char _<-Char -> ReadP Char char Char '\\';() -> ReadP () forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return ()Char _->ReadP () forall a. ReadP a pfail -- ----------------------------------------------------------------------------- Lexing numberstypeBase =Int typeDigits =[Int ]lexNumber ::ReadP Lexeme lexNumber :: ReadP Lexeme lexNumber =ReadP Lexeme lexHexOct ReadP Lexeme -> ReadP Lexeme -> ReadP Lexeme forall a. ReadP a -> ReadP a -> ReadP a <++ -- First try for hex or octal 0x, 0o etc-- If that fails, try for a decimal numberReadP Lexeme lexDecNumber -- Start with ordinary digitslexHexOct ::ReadP Lexeme lexHexOct :: ReadP Lexeme lexHexOct =doChar _<-Char -> ReadP Char char Char '0'Int base <-ReadP Int lexBaseChar Digits digits <-Int -> ReadP Digits lexDigits Int base Lexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Number -> Lexeme Number (Int -> Digits -> Number MkNumber Int base Digits digits ))lexBaseChar ::ReadP Int -- Lex a single character indicating the base; fail if not therelexBaseChar :: ReadP Int lexBaseChar =doChar c <-ReadP Char get caseChar c ofChar 'o'->Int -> ReadP Int forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Int 8Char 'O'->Int -> ReadP Int forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Int 8Char 'x'->Int -> ReadP Int forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Int 16Char 'X'->Int -> ReadP Int forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Int 16Char _->ReadP Int forall a. ReadP a pfail lexDecNumber ::ReadP Lexeme lexDecNumber :: ReadP Lexeme lexDecNumber =doDigits xs <-Int -> ReadP Digits lexDigits Int 10Maybe Digits mFrac <-ReadP (Maybe Digits) lexFrac ReadP (Maybe Digits) -> ReadP (Maybe Digits) -> ReadP (Maybe Digits) forall a. ReadP a -> ReadP a -> ReadP a <++ Maybe Digits -> ReadP (Maybe Digits) forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Maybe Digits forall a. Maybe a Nothing Maybe Integer mExp <-ReadP (Maybe Integer) lexExp ReadP (Maybe Integer) -> ReadP (Maybe Integer) -> ReadP (Maybe Integer) forall a. ReadP a -> ReadP a -> ReadP a <++ Maybe Integer -> ReadP (Maybe Integer) forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Maybe Integer forall a. Maybe a Nothing Lexeme -> ReadP Lexeme forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Number -> Lexeme Number (Digits -> Maybe Digits -> Maybe Integer -> Number MkDecimal Digits xs Maybe Digits mFrac Maybe Integer mExp ))lexFrac ::ReadP (Maybe Digits )-- Read the fractional part; fail if it doesn't-- start ".d" where d is a digitlexFrac :: ReadP (Maybe Digits) lexFrac =doChar _<-Char -> ReadP Char char Char '.'Digits fraction <-Int -> ReadP Digits lexDigits Int 10Maybe Digits -> ReadP (Maybe Digits) forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Digits -> Maybe Digits forall a. a -> Maybe a Just Digits fraction )lexExp ::ReadP (Maybe Integer )lexExp :: ReadP (Maybe Integer) lexExp =doChar _<-Char -> ReadP Char char Char 'e'ReadP Char -> ReadP Char -> ReadP Char forall a. ReadP a -> ReadP a -> ReadP a +++ Char -> ReadP Char char Char 'E'Integer exp <-ReadP Integer signedExp ReadP Integer -> ReadP Integer -> ReadP Integer forall a. ReadP a -> ReadP a -> ReadP a +++ Int -> ReadP Integer lexInteger Int 10Maybe Integer -> ReadP (Maybe Integer) forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Integer -> Maybe Integer forall a. a -> Maybe a Just Integer exp )wheresignedExp :: ReadP Integer signedExp =doChar c <-Char -> ReadP Char char Char '-'ReadP Char -> ReadP Char -> ReadP Char forall a. ReadP a -> ReadP a -> ReadP a +++ Char -> ReadP Char char Char '+'Integer n <-Int -> ReadP Integer lexInteger Int 10Integer -> ReadP Integer forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (ifChar c Char -> Char -> Bool forall a. Eq a => a -> a -> Bool == Char '-'then-Integer n elseInteger n )lexDigits ::Int ->ReadP Digits -- Lex a non-empty sequence of digits in specified baselexDigits :: Int -> ReadP Digits lexDigits Int base =doString s <-ReadP String look Digits xs <-String -> (Digits -> Digits) -> ReadP Digits forall {b}. String -> (Digits -> b) -> ReadP b scan String s Digits -> Digits forall a. a -> a id Bool -> ReadP () forall (m :: * -> *). MonadPlus m => Bool -> m () guard (Bool -> Bool not (Digits -> Bool forall a. [a] -> Bool null Digits xs ))Digits -> ReadP Digits forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return Digits xs wherescan :: String -> (Digits -> b) -> ReadP b scan (Char c : String cs )Digits -> b f =caseInt -> Char -> Maybe Int forall a. (Eq a, Num a) => a -> Char -> Maybe Int valDig Int base Char c ofJust Int n ->doChar _<-ReadP Char get ;String -> (Digits -> b) -> ReadP b scan String cs (Digits -> b f (Digits -> b) -> (Digits -> Digits) -> Digits -> b forall b c a. (b -> c) -> (a -> b) -> a -> c . (Int n Int -> Digits -> Digits forall a. a -> [a] -> [a] : ))Maybe Int Nothing ->b -> ReadP b forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Digits -> b f [])scan []Digits -> b f =b -> ReadP b forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Digits -> b f [])lexInteger ::Base ->ReadP Integer lexInteger :: Int -> ReadP Integer lexInteger Int base =doDigits xs <-Int -> ReadP Digits lexDigits Int base Integer -> ReadP Integer forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (Integer -> Digits -> Integer forall a. Num a => a -> Digits -> a val (Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral Int base )Digits xs )val ::Num a =>a ->Digits ->a val :: forall a. Num a => a -> Digits -> a val =a -> Digits -> a forall a d. (Num a, Integral d) => a -> [d] -> a valSimple {-# RULES"val/Integer"val =valInteger #-}{-# INLINE[1]val #-}-- The following algorithm is only linear for types whose Num operations-- are in constant time.valSimple ::(Num a ,Integral d )=>a ->[d ]->a valSimple :: forall a d. (Num a, Integral d) => a -> [d] -> a valSimple a base =a -> [d] -> a forall {a}. Integral a => a -> [a] -> a go a 0wherego :: a -> [a] -> a go a r []=a r go a r (a d : [a] ds )=a r' a -> a -> a forall a b. a -> b -> b `seq` a -> [a] -> a go a r' [a] ds wherer' :: a r' =a r a -> a -> a forall a. Num a => a -> a -> a * a base a -> a -> a forall a. Num a => a -> a -> a + a -> a forall a b. (Integral a, Num b) => a -> b fromIntegral a d {-# INLINEvalSimple #-}-- A sub-quadratic algorithm for Integer. Pairs of adjacent radix b-- digits are combined into a single radix b^2 digit. This process is-- repeated until we are left with a single digit. This algorithm-- performs well only on large inputs, so we use the simple algorithm-- for smaller inputs.valInteger ::Integer ->Digits ->Integer valInteger :: Integer -> Digits -> Integer valInteger Integer b0 Digits ds0 =Integer -> Int -> [Integer] -> Integer forall {d} {t}. (Integral d, Integral t) => d -> t -> [d] -> d go Integer b0 (Digits -> Int forall a. [a] -> Int length Digits ds0 )([Integer] -> Integer) -> [Integer] -> Integer forall a b. (a -> b) -> a -> b $ (Int -> Integer) -> Digits -> [Integer] forall a b. (a -> b) -> [a] -> [b] map Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral Digits ds0 wherego :: d -> t -> [d] -> d go d _t _[]=d 0go d _t _[d d ]=d d go d b t l [d] ds |t l t -> t -> Bool forall a. Ord a => a -> a -> Bool > t 40=d b' d -> d -> d forall a b. a -> b -> b `seq` d -> t -> [d] -> d go d b' t l' (d -> [d] -> [d] forall {t}. Num t => t -> [t] -> [t] combine d b [d] ds' )|Bool otherwise =d -> [d] -> d forall a d. (Num a, Integral d) => a -> [d] -> a valSimple d b [d] ds where-- ensure that we have an even number of digits-- before we call combine:ds' :: [d] ds' =ift -> Bool forall a. Integral a => a -> Bool even t l then[d] ds elsed 0d -> [d] -> [d] forall a. a -> [a] -> [a] : [d] ds b' :: d b' =d b d -> d -> d forall a. Num a => a -> a -> a * d b l' :: t l' =(t l t -> t -> t forall a. Num a => a -> a -> a + t 1)t -> t -> t forall a. Integral a => a -> a -> a `quot` t 2combine :: t -> [t] -> [t] combine t b (t d1 : t d2 : [t] ds )=t d t -> [t] -> [t] forall a b. a -> b -> b `seq` (t d t -> [t] -> [t] forall a. a -> [a] -> [a] : t -> [t] -> [t] combine t b [t] ds )whered :: t d =t d1 t -> t -> t forall a. Num a => a -> a -> a * t b t -> t -> t forall a. Num a => a -> a -> a + t d2 combine t _[]=[]combine t _[t _]=String -> [t] forall a. String -> a errorWithoutStackTrace String "this should not happen"-- Calculate a Rational from the exponent [of 10 to multiply with],-- the integral part of the mantissa and the digits of the fractional-- part. Leaving the calculation of the power of 10 until the end,-- when we know the effective exponent, saves multiplications.-- More importantly, this way we need at most one gcd instead of three.---- frac was never used with anything but Integer and base 10, so-- those are hardcoded now (trivial to change if necessary).fracExp ::Integer ->Integer ->Digits ->Rational fracExp :: Integer -> Integer -> Digits -> Rational fracExp Integer exp Integer mant []|Integer exp Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool < Integer 0=Integer mant Integer -> Integer -> Rational forall a. Integral a => a -> a -> Ratio a % (Integer 10Integer -> Integer -> Integer forall a b. (Num a, Integral b) => a -> b -> a ^ (-Integer exp ))|Bool otherwise =Integer -> Rational forall a. Num a => Integer -> a fromInteger (Integer mant Integer -> Integer -> Integer forall a. Num a => a -> a -> a * Integer 10Integer -> Integer -> Integer forall a b. (Num a, Integral b) => a -> b -> a ^ Integer exp )fracExp Integer exp Integer mant (Int d : Digits ds )=Integer exp' Integer -> Rational -> Rational forall a b. a -> b -> b `seq` Integer mant' Integer -> Rational -> Rational forall a b. a -> b -> b `seq` Integer -> Integer -> Digits -> Rational fracExp Integer exp' Integer mant' Digits ds whereexp' :: Integer exp' =Integer exp Integer -> Integer -> Integer forall a. Num a => a -> a -> a - Integer 1mant' :: Integer mant' =Integer mant Integer -> Integer -> Integer forall a. Num a => a -> a -> a * Integer 10Integer -> Integer -> Integer forall a. Num a => a -> a -> a + Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral Int d valDig ::(Eq a ,Num a )=>a ->Char ->Maybe Int valDig :: forall a. (Eq a, Num a) => a -> Char -> Maybe Int valDig a 2Char c |Char '0'Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char c Bool -> Bool -> Bool && Char c Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char '1'=Int -> Maybe Int forall a. a -> Maybe a Just (Char -> Int ord Char c Int -> Int -> Int forall a. Num a => a -> a -> a - Char -> Int ord Char '0')|Bool otherwise =Maybe Int forall a. Maybe a Nothing valDig a 8Char c |Char '0'Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char c Bool -> Bool -> Bool && Char c Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char '7'=Int -> Maybe Int forall a. a -> Maybe a Just (Char -> Int ord Char c Int -> Int -> Int forall a. Num a => a -> a -> a - Char -> Int ord Char '0')|Bool otherwise =Maybe Int forall a. Maybe a Nothing valDig a 10Char c =Char -> Maybe Int valDecDig Char c valDig a 16Char c |Char '0'Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char c Bool -> Bool -> Bool && Char c Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char '9'=Int -> Maybe Int forall a. a -> Maybe a Just (Char -> Int ord Char c Int -> Int -> Int forall a. Num a => a -> a -> a - Char -> Int ord Char '0')|Char 'a'Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char c Bool -> Bool -> Bool && Char c Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char 'f'=Int -> Maybe Int forall a. a -> Maybe a Just (Char -> Int ord Char c Int -> Int -> Int forall a. Num a => a -> a -> a - Char -> Int ord Char 'a'Int -> Int -> Int forall a. Num a => a -> a -> a + Int 10)|Char 'A'Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char c Bool -> Bool -> Bool && Char c Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char 'F'=Int -> Maybe Int forall a. a -> Maybe a Just (Char -> Int ord Char c Int -> Int -> Int forall a. Num a => a -> a -> a - Char -> Int ord Char 'A'Int -> Int -> Int forall a. Num a => a -> a -> a + Int 10)|Bool otherwise =Maybe Int forall a. Maybe a Nothing valDig a _Char _=String -> Maybe Int forall a. String -> a errorWithoutStackTrace String "valDig: Bad base"valDecDig ::Char ->Maybe Int valDecDig :: Char -> Maybe Int valDecDig Char c |Char '0'Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char c Bool -> Bool -> Bool && Char c Char -> Char -> Bool forall a. Ord a => a -> a -> Bool <= Char '9'=Int -> Maybe Int forall a. a -> Maybe a Just (Char -> Int ord Char c Int -> Int -> Int forall a. Num a => a -> a -> a - Char -> Int ord Char '0')|Bool otherwise =Maybe Int forall a. Maybe a Nothing -- ------------------------------------------------------------------------ other numeric lexing functionsreadIntP ::Num a =>a ->(Char ->Bool )->(Char ->Int )->ReadP a readIntP :: forall a. Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadP a readIntP a base Char -> Bool isDigit Char -> Int valDigit =doString s <-(Char -> Bool) -> ReadP String munch1 Char -> Bool isDigit a -> ReadP a forall a. a -> ReadP a forall (m :: * -> *) a. Monad m => a -> m a return (a -> Digits -> a forall a. Num a => a -> Digits -> a val a base ((Char -> Int) -> String -> Digits forall a b. (a -> b) -> [a] -> [b] map Char -> Int valDigit String s )){-# SPECIALISEreadIntP ::Integer ->(Char ->Bool )->(Char ->Int )->ReadP Integer #-}readIntP' ::(Eq a ,Num a )=>a ->ReadP a readIntP' :: forall a. (Eq a, Num a) => a -> ReadP a readIntP' a base =a -> (Char -> Bool) -> (Char -> Int) -> ReadP a forall a. Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadP a readIntP a base Char -> Bool isDigit Char -> Int valDigit whereisDigit :: Char -> Bool isDigit Char c =Bool -> (Int -> Bool) -> Maybe Int -> Bool forall b a. b -> (a -> b) -> Maybe a -> b maybe Bool False (Bool -> Int -> Bool forall a b. a -> b -> a const Bool True )(a -> Char -> Maybe Int forall a. (Eq a, Num a) => a -> Char -> Maybe Int valDig a base Char c )valDigit :: Char -> Int valDigit Char c =Int -> (Int -> Int) -> Maybe Int -> Int forall b a. b -> (a -> b) -> Maybe a -> b maybe Int 0Int -> Int forall a. a -> a id (a -> Char -> Maybe Int forall a. (Eq a, Num a) => a -> Char -> Maybe Int valDig a base Char c ){-# SPECIALISEreadIntP' ::Integer ->ReadP Integer #-}readBinP ,readOctP ,readDecP ,readHexP ::(Eq a ,Num a )=>ReadP a readBinP :: forall a. (Eq a, Num a) => ReadP a readBinP =a -> ReadP a forall a. (Eq a, Num a) => a -> ReadP a readIntP' a 2readOctP :: forall a. (Eq a, Num a) => ReadP a readOctP =a -> ReadP a forall a. (Eq a, Num a) => a -> ReadP a readIntP' a 8readDecP :: forall a. (Eq a, Num a) => ReadP a readDecP =a -> ReadP a forall a. (Eq a, Num a) => a -> ReadP a readIntP' a 10readHexP :: forall a. (Eq a, Num a) => ReadP a readHexP =a -> ReadP a forall a. (Eq a, Num a) => a -> ReadP a readIntP' a 16{-# SPECIALISEreadBinP ::ReadP Integer #-}{-# SPECIALISEreadOctP ::ReadP Integer #-}{-# SPECIALISEreadDecP ::ReadP Integer #-}{-# SPECIALISEreadHexP ::ReadP Integer #-}