Agda-2.3.2.2: src/transl/agda/CSyntax.hs
{-|
Agda abstract syntax which is produced by the parser
The name CSyntax originates from `Cayenne Syntax´, which served as a
starting point for Agda. (Lennart says it actually meant `concrete syntax´.)
-}
module CSyntax(module CSyntax, pprId,module MetaVars) where
import BinParse(Fixity(..),prec)
import Error
import Position
import Id
import Literal
import MetaVars
import PluginType(Plugin(..))
import Data.List (groupBy)
data CProgram
= CProgram [CModule]
-- | ErrProgram EMsg
deriving (Eq, Ord)
data CModule
= CModule Id [CArg] CPackageBody
deriving (Eq, Ord)
type Comment = String
data CExpr =
CVar Id
| CStar Position Int Int -- ^ #0 = Set, #1 = Type ... (second Int unused)
| Clam (Bool,CBind) CExpr
| CUniv CArg CExpr
| CArrow Bool CExpr CExpr
| Clet [CLetDef] CExpr
| CProduct Position [CSign]
| CRecord [CProp] Position [CLetDef]
| Copen CExpr COpenArgs CExpr
| CSelect CExpr Id
| CSum CSummands
| CCCon Id CType -- Remove!
| CCConS Id -- Remove!
| Ccase CExpr CCaseArms
| CApply CExpr [(Bool,CExpr)]
| CBinOp CExpr Id CExpr
| CMeta Position Bool Visibility MetaVar -- first Bool indicates what is allowed
-- in the metaexp, snd if should be automatically solvable or not
| CClos CEnv CExpr -- Only for printing
| Ccomment Bool Comment CExpr -- True if comment is to the left
| CPackageType -- Just for printing
| CIndSum [CArg] CIndSummands
-- ^ the telescope over which this is inductive
| CExternal (Plugin CExpr ())
| Cif CExpr CExpr CExpr
| CLit Position Literal
| CDo Position [CDoBind]
| CList Position [CExpr]
deriving (Ord,Show)
type CEnv = [(Id,CExpr)]
cApply e [] = e
cApply (CApply e []) as = CApply e as
cApply e as = CApply e as
cVar v = CVar v
cLam :: [(Bool,CBind)] -> CExpr -> CExpr
cLam args e = foldr Clam e args
clam :: CArg -> CExpr -> CExpr
clam (CArg xs (CMeta _ _ vis _)) e |(not (isVisible vis))
= cLam (toCBind xs Nothing) e
clam (CArg xs a) e = cLam (toCBind xs (Just a)) e
toCBind :: [(Bool,Id)] -> Maybe CExpr -> [(Bool,CBind)]
toCBind bs mt = map trans part
where part = groupBy (\p1 -> \p2 -> fst p1 == fst p2) bs
trans :: [(Bool,Id)] -> (Bool,CBind)
trans bxs = (fst (head bxs),CBind (map snd bs) mt)
cUniv1 :: CArg -> CExpr -> CExpr
cUniv1 (CArg ((hidden,x):xs) a) b | isDummyId x =
CArrow hidden a (cUniv1 (CArg xs a) b)
cUniv1 (CArg [] a) b = b
cUniv1 cb b = CUniv cb b
cUniv :: [CArg] -> CExpr -> CExpr
cUniv cb b = foldr cUniv1 b cb
cSet :: Position -> CExpr
cSet pos = CStar pos 0 (-1)
cType :: Position -> CExpr
cType pos = CStar pos 1 (-1)
cBinOp :: Id -> [CExpr] -> CExpr
cBinOp op es = foldr1 (\e1 -> \e2 -> CBinOp e1 op e2) es
type CType = CExpr
type CArgs = [CArg]
type CSummand = (Id, CArgs)
type CSummands = [CSummand]
type CCaseArms = [(CPat, CExpr)]
data CIndSummand = CIndExpl CSummand Id [(Bool,CExpr)]
-- ^ substitution
| CIndImpl CSummand [(Bool,CExpr)]
-- ^ substitution
deriving (Eq,Ord,Show)
type CIndSummands = [CIndSummand]
data CProp
= Cprivate
| Cpublic
| Cabstract
| Cconcrete
deriving (Eq, Ord, Show)
data COArg
= COArgT [CProp] Id CType
| COArg [CProp] Id
| COArgAs [CProp] Id Id
| COArgAsT [CProp] Id CType Id
deriving (Eq, Ord,Show)
type COArgs = [COArg]
data COpenArgs
= COpenArgs [COArg]
-- | COpenAll
deriving (Eq, Ord,Show)
data CDef = CDef [CProp] CDefn | CDefComment Comment
deriving (Eq, Ord,Show)
data CLetDef = CSimple CDef | CMutual [CDef] | CLetDefComment Comment
-- | CErrDef EMsg
deriving (Ord,Eq,Show)
mapCLetDef :: (CDef -> CDef) -> CLetDef -> CLetDef
mapCLetDef f (CSimple d) = CSimple (f d)
mapCLetDef f (CMutual ds) = CMutual (map f ds)
mapCLetDef _ d = d
flattenCLet :: CLetDef -> [CDef]
flattenCLet (CSimple d) = [d]
flattenCLet (CMutual ds) = ds
flattenCLet _ = []
data CDefn
= CValueT Id [CArg] CType CExpr
| CValueS Id [CArg] CType CClause
-- | CValueP Id [CClause]
| Ctype Id CArgs CType
| Cnewtype Id CArgs CType CSummand
| Cdata Id CArgs (Maybe CType) CSummands
| Cidata Id CArgs CType CIndSummands
| CValue Id CExpr
| CAxiom Id [CArg] CType
| CNative Id CType
-- | CPackage Id [CArg] [CProp] Position [CLetDef]
| CPackage Id [CArg] CPackageBody
| COpen CExpr COpenArgs
| CClass CClassArg Bool [CSign] -- should maybe rather be a CDef?
| CInstance Id [CArg] CInstanceArg [CLetDef]
-- | CDSign Id CType -- Used only while type checking
deriving (Eq, Ord,Show)
data CPackageBody =
CPackageDef [CProp] Position [CLetDef]
| CPackageInstance CExpr
deriving (Eq, Ord,Show)
data CClause
= CClause [(Bool,CPat)] CExpr
deriving (Eq, Ord,Show)
data CPatArg = CPatT Id CExpr
| CPatId Id
deriving (Eq, Ord,Show)
getCPatArgPos :: CPatArg -> Position
getCPatArgPos (CPatT x _) = getIdPosition x
getCPatArgPos (CPatId x) = getIdPosition x
data CPat
= CPCon Id [CPat]
| CPVar CPatArg
-- | CPAs Id CPat
-- | CPLit Position Literal
deriving (Eq, Ord,Show)
cPatVar :: Id -> CPat
cPatVar x = CPVar (CPatId x)
getCPatPos :: CPat -> Position
getCPatPos (CPCon c _) = getIdPosition c
getCPatPos (CPVar x) = getCPatArgPos x
data CBind = CBind [Id] (Maybe CType)
deriving (Eq, Ord,Show)
data CArg = CArg [(Bool,Id)] CType
deriving (Eq, Ord,Show)
data CSign
= CSign [Id] CType
| CSignDef CDefn
-- | CSignType Id CArgs ???
deriving (Eq, Ord,Show)
data CClassArg = CClassArg Id CArgs CExpr CArgs deriving (Eq,Show,Ord)
data CInstanceArg = CInstanceArg CExpr deriving (Eq,Show,Ord)
data CDoBind
= CDoBind Id CExpr
| CDoBind_ CExpr
| CDoLet [CLetDef]
deriving (Eq, Ord,Show)
{- moved to Id
ppId :: PDetail -> Id -> IText
ppId d i =
case getIdString i of
s@(c:_) | isAlpha c || c == '_' -> t s
s -> t ("("++s++")")
pprId :: Id -> String
pprId i = pIText (ppId PDReadable i)
-}
{-
ppConId :: PDetail -> Id -> IText
ppConId d i =
(case getIdString i of
s@(c:_) | isAlpha c -> t ('@':s)
s -> t ('@':("("++s++")")))
-}
{- moved to Id
ppInfix :: PDetail -> Id -> IText
ppInfix d i =
(case getIdString i of
s@(c:_) | isAlpha c -> t("`"++s++"`")
s -> t s)
idCDefn :: CDefn -> Maybe Id
idCDefn (CValueT c _ _ _) = Just c
idCDefn (CValueS c _ _ _) = Just c
--idCDefn (CValueP c _) = Just c
idCDefn (Ctype c _ _) = Just c
idCDefn (Cnewtype c _ _ _) = Just c
idCDefn (Cdata c _ _ _) = Just c
idCDefn (Cidata c _ _ _) = Just c
idCDefn (CValue c _) = Just c
idCDefn (CAxiom c _ _) = Just c
idCDefn (CNative c _) = Just c
idCDefn (CPackage c _ _) = Just c
idCDefn (COpen e as) = Nothing
idCDefn (CClass (CClassArg c _ _ _) _ _) = Just c
idCDefn (CInstance c _ _ _) = Just c
--idCDefn (CNative c _ _) = Just c
--idCDefn (CDSign c _) = Just c -- Used only while type checking
idCDef :: CDef -> Maybe Id
idCDef (CDefComment _) = Nothing
idCDef (CDef ps d) = idCDefn d
-}
class Identifiers a where
identifiers :: a -> [Id]
instance Identifiers CLetDef where
identifiers (CSimple d) = identifiers d
identifiers (CMutual ds) = concatMap identifiers ds
identifiers _ = []
instance Identifiers CDef where
identifiers (CDefComment _) = []
identifiers (CDef _ d) = identifiers d
instance Identifiers CDefn where
identifiers (CValueT c _ _ _) = [c]
identifiers (CValueS c _ _ _) = [c]
identifiers (Ctype c _ _) = [c]
identifiers (Cnewtype c _ _ (c',_)) = [c,c']
identifiers (Cdata c _ _ sums) = c:map fst sums
identifiers (Cidata c _ _ sums) = c: (concatMap identifiers sums)
identifiers (CValue c _) = [c]
identifiers (CAxiom c _ _) = [c]
identifiers (CNative c _) = [c]
identifiers (CPackage c _ _) = [c]
identifiers (COpen e as) = identifiers as
identifiers (CClass (CClassArg c _ _ _) _ _) = [c]
identifiers (CInstance c _ _ _) = [c]
identifiers _ = []
instance Identifiers COpenArgs where
identifiers (COpenArgs oas) = concatMap identifiers oas
instance Identifiers COArg where
identifiers (COArgT _ c _) = [c]
identifiers (COArg _ c) = [c]
identifiers (COArgAs _ _ c) = [c]
identifiers (COArgAsT _ _ _ c) = [c]
instance Identifiers CSign where
identifiers (CSign is t) = is
identifiers (CSignDef d) = []
instance Identifiers CIndSummand where
identifiers (CIndExpl sum _ _) = [fst sum]
identifiers (CIndImpl sum _) = [fst sum]
instance Identifiers CArg where
identifiers (CArg xs e) = map snd xs
addModifiers :: [CProp] -> CDef -> CDef
addModifiers ps (CDef ps' ds) = CDef (addMod' ps ps') ds
where addMod' [] ps = ps
addMod' (p:ps) ps' =
let ps2 = addMod' ps ps'
in if elem p ps2
then ps2
else case p of
Cabstract | elem Cconcrete ps' -> ps2
--raise (noPosition,EConflictingModifiers (ppReadable p) "concrete")
Cconcrete | elem Cabstract ps' -> ps2
--raise (noPosition,EConflictingModifiers (ppReadable p) "abstract")
Cpublic | elem Cprivate ps' -> ps2
--raise (noPosition,EConflictingModifiers (ppReadable p) "private")
Cprivate | elem Cpublic ps' -> ps2
--raise (noPosition,EConflictingModifiers (ppReadable p) "public")
_ -> (p:ps2)
addModifiers ps d = d
data CConstraint = CEq CExpr CExpr
| CJudg (CJudgement CExpr)
data CJudgement a = CIsType a
| HasType a CExpr
--deriving Show
precCExpr :: CExpr -> Int
precCExpr (CVar _) = 12
precCExpr (CStar _ _ _) = 12
precCExpr (CMeta _ _ _ _) = 12
precCExpr (CSelect _ _) = 12
precCExpr (CSum _) = 12
precCExpr (CIndSum _ _ ) = 12
precCExpr (CCConS _ ) = 12
precCExpr (CCCon _ _ ) = 12
precCExpr (CLit _ _) = 12
precCExpr (CBinOp _ op _) = prec $ getFixity op
precCExpr (CClos _ e) = precCExpr e
precCExpr (CArrow _ _ _) = 0
precCExpr (CUniv _ _) = 0
precCExpr (CDo _ _) = 0
precCExpr (Cif _ _ _) = 1
precCExpr (CList _ _) = 12
precCExpr (CExternal _) = 12
precCExpr (CApply _ _) = 9
precCExpr _ = 8
type CMetaSubst = (Bool,MetaVar,CExpr)
-- Gives an approx. position
getCExprPos :: CExpr -> Position
getCExprPos e = case e of
CVar n -> getIdPosition n
CStar pos _ _ -> pos
Clam as e -> getCExprPos e
CUniv as e -> getCExprPos e
CArrow _ e1 _ -> getCExprPos e1
Clet _ e -> getCExprPos e
CProduct pos _ -> pos
CRecord _ pos _ -> pos
Copen m _ _ -> getCExprPos m
CSelect _ n -> getIdPosition n
CSum [] -> noPosition
CSum ((n,_):_) -> getIdPosition n
CCCon n _ -> getIdPosition n
CCConS n -> getIdPosition n
Ccase e _ -> getCExprPos e
CApply e _ -> getCExprPos e
CBinOp e1 _ _ -> getCExprPos e1
CMeta pos _ _ _ -> pos
CClos _ e -> getCExprPos e
Ccomment _ _ e -> getCExprPos e
CPackageType -> noPosition
--CIndSum _ [] -> noPosition
--CIndSum _ (((n,_),_):_) -> getIdPosition n
CDo pos cbinds -> pos
CList pos _ -> pos
CExternal plug -> pluginPos plug
boundVars :: CArg -> [Id]
boundVars (CArg hxs _) = map snd hxs
{-- ------------------- -}
instance Eq CExpr where
(CVar x) == (CVar x') = x == x'
(CStar _ i _) == (CStar _ i' _) = i == i'
(Clam b e) == (Clam b' e') = b == b' && e == e'
(CUniv b e) == (CUniv b' e') = b == b' && e == e'
(CArrow b e1 e2) == (CArrow b' e1' e2') = b == b' && e1 == e1'&& e2 == e2'
(Clet ds e) == (Clet ds' e') = ds == ds' && e == e'
(CProduct _ cs) == (CProduct _ cs') = cs == cs'
(CRecord ps _ ds) == (CRecord ps' _ ds') = ps == ps' && ds == ds'
(Copen e1 oas e2) == (Copen e1' oas' e2') = e1 == e1' && oas == oas' && e2 == e2'
(CSelect e i) == (CSelect e' i') = e == e' && i == i'
(CSum cs) == (CSum cs') = cs == cs'
(CCCon i e) == (CCCon i' e') = e == e' && i == i'
(CCConS i) == (CCConS i') = i == i'
(Ccase e as) == (Ccase e' as') = e == e' && as == as'
(CApply e es) == (CApply e' es') = e == e' && es == es'
(CBinOp e1 i e2) == (CBinOp e1' i' e2') = i == i' && e1 == e1'&& e2 == e2'
(CMeta _ _ _ m) == (CMeta _ _ _ m') = m == m'
(Ccomment _ _ e) == (Ccomment _ _ e') = e == e'
CPackageType == CPackageType = True
(CExternal p) == (CExternal p') = p == p'
(CIndSum as cs) == (CIndSum as' cs') = as == as' && cs == cs'
(Cif e1 e2 e3) == (Cif e1' e2' e3') = e1 == e1' && e2 == e2' && e3 == e3'
(CLit _ l) == (CLit _ l') = l == l'
(CDo _ bs) == (CDo _ bs') = bs == bs'
(CList _ es) == (CList _ es') = es == es'
_ == _ = False
substNaiveCExpr :: [(CExpr,Id)] -> CExpr -> CExpr
substNaiveCExpr subst e = sub e
where sub e = maybe (sub' e) CVar (lookup e subst)
sub' (Clam bs e) = Clam bs (sub e)
sub' (CUniv bs e) = CUniv bs (sub e)
sub' (CArrow b e1 e2) = CArrow b (sub e1) (sub e2)
sub' (CSelect e i) = CSelect (sub e) i
sub' (CApply e es) = CApply (sub e) (map (\(h,e') -> (h,sub e')) es)
sub' (CBinOp e1 op e2) = CBinOp (sub e1) op (sub e2)
sub' (Cif b te fe) = Cif (sub b) (sub te) (sub fe)
sub' (CList p l) = CList p (map sub l)
sub' e = e