diff --git a/ghc/compiler/reader/Lex.lhs b/ghc/compiler/reader/Lex.lhs index 643bb532b9e3e864522dfad9ba78792daf39fcb4..beea1efe095283c6c04333a9a58b90a043acb96f 100644 --- a/ghc/compiler/reader/Lex.lhs +++ b/ghc/compiler/reader/Lex.lhs @@ -53,6 +53,8 @@ import FastString import StringBuffer import GlaExts import ST ( runST ) + +import PrelRead ( readRational__ ) -- Glasgow non-std \end{code} %************************************************************************ @@ -219,7 +221,7 @@ data IfaceToken | ITccall (Bool,Bool) -- (is_casm, may_gc) | ITscc CostCentre | ITchar Char | ITstring FAST_STRING - | ITinteger Integer | ITdouble Double + | ITinteger Integer | ITrational Rational | ITinteger_lit | ITfloat_lit | ITrational_lit | ITaddr_lit | ITlit_lit | ITstring_lit | ITunknown String -- Used when the lexer can't make sense of it | ITeof -- end of file token @@ -443,13 +445,19 @@ lex_num cont minus acc# buf = -- presence of floating point numbers in interface -- files is not that common. (ToDo) case expandWhile (isDigit) (incLexeme buf') of - buf'' -> -- points to first non digit char - case reads (lexemeToString buf'') of - [(v,_)] -> cont (ITdouble v) (stepOverLexeme buf'') + buf2 -> -- points to first non digit char + let l = case currentChar# buf2 of + 'e'# -> let buf3 = incLexeme buf2 in + case currentChar# buf3 of + '-'# -> expandWhile (isDigit) (incLexeme buf3) + _ -> expandWhile (isDigit) buf3 + _ -> buf2 + in let v = readRational__ (lexemeToString l) in + cont (ITrational v) (stepOverLexeme l) + _ -> cont (ITinteger (fromInt (minus acc'))) (stepOverLexeme buf') --- case reads (lexemeToString buf') of --- [(i,_)] -> cont (ITinteger i) (stepOverLexeme buf') + ------------ lex_keyword cont buf = diff --git a/ghc/compiler/rename/ParseIface.y b/ghc/compiler/rename/ParseIface.y index 96fac18cedb2ad0ba9bde46e0b2350a6074c5d02..03bdde8eb305362195a69c2af849fc6c7990e424 100644 --- a/ghc/compiler/rename/ParseIface.y +++ b/ghc/compiler/rename/ParseIface.y @@ -102,7 +102,7 @@ import Outputable CHAR { ITchar $$ } STRING { ITstring $$ } INTEGER { ITinteger $$ } - DOUBLE { ITdouble $$ } + RATIONAL { ITrational $$ } INTEGER_LIT { ITinteger_lit } FLOAT_LIT { ITfloat_lit } @@ -572,8 +572,8 @@ core_lit : INTEGER { MachInt $1 True } | CHAR { MachChar $1 } | STRING { MachStr $1 } | STRING_LIT STRING { NoRepStr $2 } - | DOUBLE { MachDouble (toRational $1) } - | FLOAT_LIT DOUBLE { MachFloat (toRational $2) } + | RATIONAL { MachDouble $1 } + | FLOAT_LIT RATIONAL { MachFloat $2 } | INTEGER_LIT INTEGER { NoRepInteger $2 (panic "NoRepInteger type") -- The type checker will add the types