|
|
- {-# 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
|