diff options
Diffstat (limited to 'ghc/compiler/abstractSyn/HsLit.lhs')
-rw-r--r-- | ghc/compiler/abstractSyn/HsLit.lhs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/ghc/compiler/abstractSyn/HsLit.lhs b/ghc/compiler/abstractSyn/HsLit.lhs new file mode 100644 index 0000000000..bf5ae19d0b --- /dev/null +++ b/ghc/compiler/abstractSyn/HsLit.lhs @@ -0,0 +1,76 @@ +% +% (c) The GRASP/AQUA Project, Glasgow University, 1992-1994 +% +\section[HsLit]{Abstract syntax: source-language literals} + +\begin{code} +#include "HsVersions.h" + +module HsLit where + +import AbsPrel ( PrimKind ) +import Outputable +import Pretty +import Util +\end{code} + +\begin{code} +data Literal + = CharLit Char -- characters + | CharPrimLit Char -- unboxed char literals + | StringLit FAST_STRING -- strings + | StringPrimLit FAST_STRING -- packed string + + | IntLit Integer -- integer-looking literals + | FracLit Rational -- frac-looking literals + -- Up through dict-simplification, IntLit and FracLit simply + -- mean the literal was integral- or fractional-looking; i.e., + -- whether it had an explicit decimal-point in it. *After* + -- dict-simplification, they mean (boxed) "Integer" and + -- "Rational" [Ratio Integer], respectively. + + -- Dict-simplification tries to replace such lits w/ more + -- specific ones, using the unboxed variants that follow... + | LitLitLitIn FAST_STRING -- to pass ``literal literals'' through to C + -- also: "overloaded" type; but + -- must resolve to boxed-primitive! + -- (WDP 94/10) + | LitLitLit FAST_STRING + UniType -- and now we know the type + -- Must be a boxed-primitive type + + | IntPrimLit Integer -- unboxed Int literals +#if __GLASGOW_HASKELL__ <= 22 + | FloatPrimLit Double -- unboxed Float literals + | DoublePrimLit Double -- unboxed Double literals +#else + | FloatPrimLit Rational -- unboxed Float literals + | DoublePrimLit Rational -- unboxed Double literals +#endif +\end{code} + +\begin{code} +negLiteral (IntLit i) = IntLit (-i) +negLiteral (FracLit f) = FracLit (-f) +\end{code} + +\begin{code} +instance Outputable Literal where + ppr sty (CharLit c) = ppStr (show c) + ppr sty (CharPrimLit c) = ppBeside (ppStr (show c)) (ppChar '#') + ppr sty (StringLit s) = ppStr (show s) + ppr sty (StringPrimLit s) = ppBeside (ppStr (show s)) (ppChar '#') + ppr sty (IntLit i) = ppInteger i +#if __GLASGOW_HASKELL__ <= 22 + ppr sty (FracLit f) = ppDouble (fromRational f) -- ToDo: better?? + ppr sty (FloatPrimLit f) = ppBeside (ppDouble f) (ppChar '#') + ppr sty (DoublePrimLit d) = ppBeside (ppDouble d) (ppStr "##") +#else + ppr sty (FracLit f) = ppRational f + ppr sty (FloatPrimLit f) = ppBeside (ppRational f) (ppChar '#') + ppr sty (DoublePrimLit d) = ppBeside (ppRational d) (ppStr "##") +#endif + ppr sty (IntPrimLit i) = ppBeside (ppInteger i) (ppChar '#') + ppr sty (LitLitLitIn s) = ppBesides [ppStr "``", ppPStr s, ppStr "''"] + ppr sty (LitLitLit s k) = ppBesides [ppStr "``", ppPStr s, ppStr "''"] +\end{code} |