module CC.Source(module CC.Source, module CC.Types) where import CC.Pretty import CC.Types data Program = Program [Decl] deriving (Show, Read) data Decl = Def Def -- import? deriving (Show, Read) data Def = Function (Maybe Type) (Name, SourceRange) [(Name, SourceRange)] Expr deriving (Show, Read) data Type = TFun Type Type | TInt deriving (Show, Read) data Expr = Call SourceRange Expr Expr | Int SourceRange Int | Var SourceRange Name deriving (Show, Read) instance Pretty Type where pretty = unparse class Unparse a where -- Parentheses are required if precedence of unparsed element is -- greater than the argument. unparsePrec :: Int -> a -> String unparse :: a -> String unparse = unparsePrec 0 instance Unparse Type where unparsePrec _ TInt = "Int" unparsePrec p (TFun a b) = let s = unparsePrec 3 a ++ " -> " ++ unparsePrec 2 b in if p > 2 then "(" ++ s ++ ")" else s instance HasRange Expr where range (Call sr _ _) = sr range (Int sr _) = sr range (Var sr _) = sr