ruler-0.4.0.0: src/ARule/AVarRename.cag
-------------------------------------------------------------------------
-- Optimisation: ARule/Expr rename of AVar
-------------------------------------------------------------------------
%%[1 hs module (ARule.AVarRename)
%%]
%%[1 hs export (arlElimAlphaRename)
%%]
%%[1 hs import (qualified Data.Map as Map, Common, Expr.Expr, ARule.ARule, FmGam)
%%]
%%[1 ag import({Expr/AbsSynAG}, {ARule/AbsSynAG}, {Expr/SelfAG}, {ARule/SelfAG})
%%]
%%[1 ag import({ARule/EqnDest1NmAG}, {ARule/InCompDestAG})
%%]
%%[1 ag
WRAPPER AGExprItf AGARuleItf
%%]
%%[1 hs
exprASubst :: RnMp -> Expr -> Expr
exprASubst rnm e
= self_Syn_AGExprItf r2
where r1 = sem_AGExprItf (AGExprItf_AGItf e)
r2 = wrap_AGExprItf r1
(Inh_AGExprItf { rnMp_Inh_AGExprItf = rnm
})
arlElimAlphaRename :: ARule -> ARule
arlElimAlphaRename r
= self_Syn_AGARuleItf r2
where r1 = sem_AGARuleItf (AGARuleItf_AGItf r)
r2 = wrap_AGARuleItf r1
(Inh_AGARuleItf)
%%]
-------------------------------------------------------------------------
-- Part I: Elimination of alpha renaming
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-- Rename map gather
-------------------------------------------------------------------------
%%[1 hs
rnRepl :: RnMp -> RnSrc -> RnSrc
rnRepl m e
= case e of
RnExpr (Expr_AVar (ANm_Loc n _)) -> r n
RnNm (ANm_Loc n _) -> r n
_ -> e
where r n = maybe e (RnExpr . exprASubst (Map.delete n m) . rnSrc2Expr . snd) (Map.lookup n m)
%%]
%%[1 ag
ATTR AEqns AEqn ANm AllExpr AExpr [ | | gathRnMp USE {`rnMpUnion`} {Map.empty}: RnMp ]
ATTR AllARuleButARule AllExpr AGExprItf [ rnMp: RnMp | | ]
SEM AEqn
| Eqn loc . gathRnMp = let m = case @dest.mbSingleANm of
Just (ANm_Loc dn p) | AtRetain `notElem` p
-> Map.singleton dn (0,v)
where v = case (@val.mbSingleANm,@val.self) of
(Just sn,_ ) -> RnNm sn
(_ ,AExpr_Expr e) -> RnExpr e
_ -> Map.empty
in m `rnMpUnion` @val.gathRnMp
SEM ANm
| Loc lhs . gathRnMp = Map.singleton @nm (1,RnNone)
SEM ARule
| Rule eqns . rnMp = Map.filter (\(c,v)
-> case v of
RnNone -> False
RnExpr _ | c > 1 -> False
_ -> True
)
@eqns.gathRnMp
%%]
-------------------------------------------------------------------------
-- Replica
-------------------------------------------------------------------------
%%[1 ag
ATTR AEqns AEqn [ | | replRnEqns USE {++} {[]}: {[AEqn]} ]
SEM Expr
| AVar lhs . self = rnSrc2Expr (rnRepl @lhs.rnMp (RnExpr @self))
SEM AEqn
| Eqn lhs . replRnEqns = case @dest.mbSingleANm of
Just (ANm_Loc n _)
-> case Map.lookup n @lhs.rnMp of
Just _ -> []
_ -> [@self]
_ -> [@self]
| * - Eqn lhs . replRnEqns = [@self]
SEM ARule
| Rule lhs . self = ARule_Rule @ndNmL @rlNm @info @eqns.replRnEqns
%%]