ddc-base-0.2.0.1: DDC/Base/Lexer.hs
-- | Lexer utilities.
module DDC.Base.Lexer
( SourcePos (..)
-- * Tokens
, Token (..)
, takeParsecSourcePos)
where
import DDC.Base.Pretty
import qualified Text.Parsec.Pos as P
-- SourcePos ------------------------------------------------------------------
-- | A position in the source file.
--
-- If there is no file path then we assume that the input has been read
-- from an interactive session and display ''<interactive>'' when pretty printing.
data SourcePos
= SourcePos
{ sourcePosFile :: Maybe FilePath
, sourcePosLine :: Int
, sourcePosColumn :: Int }
deriving (Eq, Show)
instance Pretty SourcePos where
ppr (SourcePos (Just f) l c)
= ppr $ f ++ ":" ++ show l ++ ":" ++ show c
ppr (SourcePos Nothing l c)
= ppr $ "<interactive>:" ++ show l ++ ":" ++ show c
-- Token-----------------------------------------------------------------------
-- | Wrapper for primitive token type that gives it a source position.
data Token t
= Token
{ tokenTok :: t
, tokenSourcePos :: SourcePos }
deriving (Eq, Show)
-- | Take the parsec style source position from a token.
takeParsecSourcePos :: Token k -> P.SourcePos
takeParsecSourcePos (Token _ sp)
= case sp of
SourcePos Nothing l c -> P.newPos "<interactive>" l c
SourcePos (Just f) l c -> P.newPos f l c