[project @ 1998-05-11 16:19:46 by simonm]
authorsimonm <unknown>
Mon, 11 May 1998 16:19:57 +0000 (16:19 +0000)
committersimonm <unknown>
Mon, 11 May 1998 16:19:57 +0000 (16:19 +0000)
Convert floating point literals from interfaces directly to Rationals,
rather than go via Doubles.

ghc/compiler/reader/Lex.lhs
ghc/compiler/rename/ParseIface.y

index 643bb53..beea1ef 100644 (file)
@@ -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 =
index 96fac18..03bdde8 100644 (file)
@@ -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