MixAna.hs revision 5e224517e0f2d6286d8c55e676066715fc358edf
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiModule : $Header$
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiCopyright : (c) Christian Maeder and Uni Bremen 2003
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiLicence : similar to LGPL, see HetCATS/LICENCE.txt or LIZENZ.txt
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiMaintainer : hets@tzi.de
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiStability : experimental
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian MaederPortability : portable
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian MaederMixfix analysis of terms and patterns, types annotations are also analysed
06d7655040315f69ae152a74373ad16a9c2e09c2Martin Kühlimport qualified Common.Lib.Map as Map
f6efd319ac43b72b37eff648e93b939d16174121Christian Maederimport qualified Common.Lib.Set as Set
06d7655040315f69ae152a74373ad16a9c2e09c2Martin Kühlimport qualified Common.Lib.Rel as Rel
61745001283cdb80c0ed9715919cff9747eb5f35Martin Kühl-- import Control.Exception(assert)
acde06dd6089b05f501690e471467da09f90d894Martin Kühlassert :: Bool -> a -> a
ee1c7c5796832536932d7b06cbfb1ca13f9a0d7bMartin Kühlassert b a = if b then a else error ("assert")
ee1c7c5796832536932d7b06cbfb1ca13f9a0d7bMartin Kühltype Rule = (Id, Int, [Token])
ee1c7c5796832536932d7b06cbfb1ca13f9a0d7bMartin KühltrueId = mkId [mkSimpleId trueS]
2eb86e6017c065aa54cc31c5169250985ac7b36cMartin KühlfalseId :: Id
2eb86e6017c065aa54cc31c5169250985ac7b36cMartin KühlfalseId = mkId [mkSimpleId falseS]
06d7655040315f69ae152a74373ad16a9c2e09c2Martin KühlifThenElse :: Id
2eb86e6017c065aa54cc31c5169250985ac7b36cMartin KühlifThenElse = mkId (map mkSimpleId [ifS, place, thenS, place, elseS, place])
2eb86e6017c065aa54cc31c5169250985ac7b36cMartin KühlwhenElse :: Id
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühlwhenElse = mkId (map mkSimpleId [place, whenS, place, elseS, place])
50ea34ea29d0121f3e692b7029b09d28dc7988fdTill MossakowskimkInfix :: String -> Id
dd30accd995f6af9461ad42e142da90e783ecdc2Klaus LuettichmkInfix s = mkId $ map mkSimpleId [place, s, place]
06d7655040315f69ae152a74373ad16a9c2e09c2Martin KühlinfixIf = mkInfix ifS
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühlexEq = mkInfix exEqual
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühleqId = mkInfix equalS
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühlandId = mkInfix lAnd
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühlorId = mkInfix lOr
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühlimplId = mkInfix implS
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühleqvId = mkInfix equivS
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühldefId = mkId $ map mkSimpleId [defS, place]
caf544dc9b8f02e05e37786681153f5660e67f64Martin KühlnotId = mkId $ map mkSimpleId [notS, place]
ee1c7c5796832536932d7b06cbfb1ca13f9a0d7bMartin KühlbuiltinRelIds :: Set.Set Id
builtinRelIds = Set.fromDistinctAscList [typeId, eqId, exEq, defId]
builtinLogIds :: Set.Set Id
builtinLogIds = Set.fromDistinctAscList
pMap = Rel.toMap precs
:Map.elems pMap)
Set.\\ Set.fromDistinctAscList [applId, whenElse])
rels1 = map ( \ i -> (notId, i)) $ Set.toList builtinRelIds
rels2 = map ( \ i -> (i, whenElse)) $ Set.toList builtinRelIds
newPrecs = foldr (\ (a, b) p -> if Rel.member b a p then p else
Rel.insert a b p) precs $
, prec_annos = Rel.transClosure newPrecs }
mkPrecIntMap :: Rel.Rel Id -> PrecMap
let t = Rel.topSort r
in (m, Map.find eqId m, l)
getIdPrec :: PrecMap -> Set.Set Id -> Id -> Int
getIdPrec (pm, r, m) ps i = Map.findWithDefault
(if Set.member i ps then r
`Set.union` is))) ++
(filter isMixfix $ Set.toList is))
(initTermRules ps $ Set.fromDistinctAscList
initPatternRules :: (PrecMap, Set.Set Id) -> [Id] -> [Rule]
Set.unions (map getKnowns cs)
let ids = Map.keys as
$ Set.unions $ map getKnowns ids