%
% (c) The Foo Project, University of Glasgow 1998
% @(#) $Docid: Oct. 9th 1999 15:28 Sigbjorn Finne $
% @(#) $Contactid: v-sfinne@microsoft.com $
%
\begin{code}
module Literal
(
Literal(..)
, IntegerLit(..)
, iLit
, iLitToIntegral
, iLitToInteger
, ppLit
, ppILit
, litToString
) where
import PP
import Utils
import List ( intersperse )
import Opts ( optNoQualNames )
\end{code}
\begin{code}
data Literal
= IntegerLit IntegerLit
| StringLit String
| TypeConst String
| WStringLit String
| CharLit Char
| WCharLit Char
| FixedPtLit Rational
| FloatingLit (String, Double)
| BooleanLit Bool
| NullLit
| GuidLit [String]
| LitLit String
deriving (
Show
, Eq
)
data IntegerLit = ILit Int Integer
deriving (
Show
, Eq
)
iLit :: Integral a => a -> Literal
iLit x = IntegerLit (ILit 10 (toInteger x))
iLitToIntegral :: Integral a => IntegerLit -> a
iLitToIntegral (ILit _ x) = fromInteger x
iLitToInteger :: IntegerLit -> Integer
iLitToInteger (ILit _ x) = x
litToString :: Literal -> String
litToString l =
case l of
IntegerLit (ILit _ v) -> show v
StringLit s -> s
TypeConst s -> s
WStringLit s -> s
CharLit c -> [c]
WCharLit c -> [c]
FixedPtLit r -> show r
FloatingLit (s,_) -> s
BooleanLit b -> show b
GuidLit [g] -> g
NullLit -> "0"
GuidLit gs -> '{':concat (intersperse "-" gs) ++ "}"
LitLit s -> s
\end{code}
%*
%
\subsection{Pretty printing literals}
%
%*
\begin{code}
ppLit :: Literal -> PPDoc a
ppLit (IntegerLit ilit) = ppILit ilit
ppLit (StringLit s) = text (show s)
ppLit (WStringLit ws) = text (show ws)
ppLit (TypeConst s) = text s
ppLit (CharLit c) = text (show c)
ppLit (WCharLit c) = text (show c)
ppLit (FixedPtLit r) = rational r
ppLit (FloatingLit (d,x))
| x < 0.0 = parens (text d)
| otherwise = text d
ppLit (BooleanLit b)
| optNoQualNames = text (if b then "True" else "False")
| otherwise = text (if b then "Prelude.True" else "Prelude.False")
ppLit (GuidLit ls) = hcat (punctuate (char '-') (map text ls))
ppLit (LitLit ls) = text ls
ppLit NullLit = text "NULL"
ppILit :: IntegerLit -> PPDoc a
ppILit (ILit base val) =
case base of
8 -> text (showOct val "")
16 -> text (showHex val "")
10 | val < 0 -> parens (integer val)
| otherwise -> integer val
_ -> trace ("ppILit: No one told me that base " ++
show base ++ " was supported!\n") $
integer val
\end{code}