summaryrefslogtreecommitdiff
path: root/compiler/hsSyn/HsLit.lhs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/hsSyn/HsLit.lhs')
-rw-r--r--compiler/hsSyn/HsLit.lhs96
1 files changed, 96 insertions, 0 deletions
diff --git a/compiler/hsSyn/HsLit.lhs b/compiler/hsSyn/HsLit.lhs
new file mode 100644
index 0000000000..c6d7e5dbea
--- /dev/null
+++ b/compiler/hsSyn/HsLit.lhs
@@ -0,0 +1,96 @@
+%
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
+%
+\section[HsLit]{Abstract syntax: source-language literals}
+
+\begin{code}
+module HsLit where
+
+#include "HsVersions.h"
+
+import {-# SOURCE #-} HsExpr( SyntaxExpr )
+import Type ( Type )
+import Outputable
+import FastString
+import Ratio ( Rational )
+\end{code}
+
+
+%************************************************************************
+%* *
+\subsection[HsLit]{Literals}
+%* *
+%************************************************************************
+
+
+\begin{code}
+data HsLit
+ = HsChar Char -- Character
+ | HsCharPrim Char -- Unboxed character
+ | HsString FastString -- String
+ | HsStringPrim FastString -- Packed string
+ | HsInt Integer -- Genuinely an Int; arises from TcGenDeriv,
+ -- and from TRANSLATION
+ | HsIntPrim Integer -- Unboxed Int
+ | HsInteger Integer Type -- Genuinely an integer; arises only from TRANSLATION
+ -- (overloaded literals are done with HsOverLit)
+ | HsRat Rational Type -- Genuinely a rational; arises only from TRANSLATION
+ -- (overloaded literals are done with HsOverLit)
+ | HsFloatPrim Rational -- Unboxed Float
+ | HsDoublePrim Rational -- Unboxed Double
+
+instance Eq HsLit where
+ (HsChar x1) == (HsChar x2) = x1==x2
+ (HsCharPrim x1) == (HsCharPrim x2) = x1==x2
+ (HsString x1) == (HsString x2) = x1==x2
+ (HsStringPrim x1) == (HsStringPrim x2) = x1==x2
+ (HsInt x1) == (HsInt x2) = x1==x2
+ (HsIntPrim x1) == (HsIntPrim x2) = x1==x2
+ (HsInteger x1 _) == (HsInteger x2 _) = x1==x2
+ (HsRat x1 _) == (HsRat x2 _) = x1==x2
+ (HsFloatPrim x1) == (HsFloatPrim x2) = x1==x2
+ (HsDoublePrim x1) == (HsDoublePrim x2) = x1==x2
+ lit1 == lit2 = False
+
+data HsOverLit id -- An overloaded literal
+ = HsIntegral Integer (SyntaxExpr id) -- Integer-looking literals;
+ | HsFractional Rational (SyntaxExpr id) -- Frac-looking literals
+ -- Before type checking, the SyntaxExpr is 'fromInteger' or 'fromRational'
+ -- After type checking, it is (fromInteger 3) or lit_78; that is,
+ -- the expression that should replace the literal.
+ -- This is unusual, because we're replacing 'fromInteger' with a call
+ -- to fromInteger. Reason: it allows commoning up of the fromInteger
+ -- calls, which wouldn't be possible if the desguarar made the application
+
+-- Comparison operations are needed when grouping literals
+-- for compiling pattern-matching (module MatchLit)
+instance Eq (HsOverLit id) where
+ (HsIntegral i1 _) == (HsIntegral i2 _) = i1 == i2
+ (HsFractional f1 _) == (HsFractional f2 _) = f1 == f2
+ l1 == l2 = False
+
+instance Ord (HsOverLit id) where
+ compare (HsIntegral i1 _) (HsIntegral i2 _) = i1 `compare` i2
+ compare (HsIntegral _ _) (HsFractional _ _) = LT
+ compare (HsFractional f1 _) (HsFractional f2 _) = f1 `compare` f2
+ compare (HsFractional f1 _) (HsIntegral _ _) = GT
+\end{code}
+
+\begin{code}
+instance Outputable HsLit where
+ -- Use "show" because it puts in appropriate escapes
+ ppr (HsChar c) = pprHsChar c
+ ppr (HsCharPrim c) = pprHsChar c <> char '#'
+ ppr (HsString s) = pprHsString s
+ ppr (HsStringPrim s) = pprHsString s <> char '#'
+ ppr (HsInt i) = integer i
+ ppr (HsInteger i _) = integer i
+ ppr (HsRat f _) = rational f
+ ppr (HsFloatPrim f) = rational f <> char '#'
+ ppr (HsDoublePrim d) = rational d <> text "##"
+ ppr (HsIntPrim i) = integer i <> char '#'
+
+instance Outputable (HsOverLit id) where
+ ppr (HsIntegral i _) = integer i
+ ppr (HsFractional f _) = rational f
+\end{code}