-- ==========================================================-- -- === Build abstract domains File: MakeDomains.m (1) ===-- -- ==========================================================-- module MakeDomains where import BaseDefs import Utils import Dependancy import List(nub) -- 1.3 -- ==========================================================-- -- mdFreeTVarsIn :: TypeDef -> -- a type definition [Naam] -- variables free in it mdFreeTVarsIn (tn, tvl, cal) = utSetToList (utSetSubtraction (utSetFromList allVars) (utSetFromList (tvl ++ ["int", "bool", "char"]))) where allVars = concat (map f cal) f (n, tel) = concat (map allTVs tel) allTVs (TDefVar n) = [n] allTVs (TDefCons n tel) = n:concat (map allTVs tel) -- ==========================================================-- -- mdMakeEdges :: [TypeDef] -> -- all type definitions [(Naam, Naam)] -- all edges resulting (from, to) mdMakeEdges tdl = concat (map mergeFromTo (zip froms tos)) where k13sel (a, b, c) = a froms = map k13sel tdl tos = map mdFreeTVarsIn tdl mergeFromTo (f, tol) = [(f, t) | t <- tol] -- ==========================================================-- -- mdTypeDependancy :: [TypeDef] -> -- all type definitions TypeDependancy -- list of groups & rec flag mdTypeDependancy tdl = map (singleRec.utSetToList) (deScc ins outs roots) where edges = mdMakeEdges tdl ins v = [u | (u, w) <- edges, v==w] outs v = [w | (u, w) <- edges, v==u] roots = nub (map f tdl) where f (a, b, c) = a singleRec (a:b:abs) = (True, a:b:abs) singleRec [a] = (a `elem` (mdFreeTVarsIn (findAIn tdl)), [a]) where findAIn ((tn, tvl, cal):rest) | a==tn = (tn, tvl, cal) | otherwise = findAIn rest -- ==========================================================-- -- mdIsRecursiveType :: TypeDependancy -> Naam -> Bool mdIsRecursiveType typedependancy typeName = search typedependancy where search ((rf, names):rest) | typeName `elem` names = rf | otherwise = search rest -- ==========================================================-- -- === end MakeDomains.m (1) ===-- -- ==========================================================--