|
{-# LANGUAGE FlexibleInstances #-}
|
|
{-# LANGUAGE DefaultSignatures #-}
|
|
module Frontend.Parser.Posn where
|
|
|
|
import Frontend.Lexer.Tokens
|
|
import Data.Typeable
|
|
data Posn
|
|
= Posn { posnLine :: {-# UNPACK #-} !Int
|
|
, posnColm :: {-# UNPACK #-} !Int
|
|
}
|
|
deriving (Eq, Show, Ord)
|
|
|
|
class HasPosn a where
|
|
startPosn :: a -> Posn
|
|
endPosn :: a -> Posn
|
|
|
|
span :: (HasPosn b, HasPosn c) => b -> c -> a -> a
|
|
|
|
default span :: Typeable a => b -> c -> a -> a
|
|
span _ _ x = error $ "Can't span " ++ show (typeOf x)
|
|
|
|
instance HasPosn Token where
|
|
startPosn (Token _ l c) = Posn l c
|
|
endPosn (Token t l c) = Posn l (c + tokSize t)
|
|
|
|
instance HasPosn (Posn, Posn, a) where
|
|
startPosn (s, _, _) = s
|
|
endPosn (_, e, _) = e
|
|
|
|
span start end (_, _, x) = (startPosn start, endPosn end, x)
|
|
|
|
thd :: (a, b, c) -> c
|
|
thd (_, _, z) = z
|