Changeset 11215 for trunk/CspCASL/StatAnaCSP.hs
- Timestamp:
- 05.01.2009 15:46:06 (11 months ago)
- Files:
-
- 1 modified
-
trunk/CspCASL/StatAnaCSP.hs (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/CspCASL/StatAnaCSP.hs
r11201 r11215 21 21 import qualified Data.Maybe as Maybe 22 22 import qualified Data.Set as S 23 23 -- liam added the following, they should be deleted from imports when 24 -- liams temp code is removed: Op_name mkSimpleId mkInfix OP_SYMB(..), 25 -- OP_TYPE(..) 24 26 import CASL.AS_Basic_CASL (FORMULA(..), OpKind(..), SORT, TERM(..), VAR, 25 27 VAR_DECL(..)) … … 34 36 import Common.ConvertGlobalAnnos 35 37 import qualified Common.Lib.Rel as Rel 36 import Common.Id (getRange, Id, simpleIdToId, nullRange , mkSimpleId)38 import Common.Id (getRange, Id, simpleIdToId, nullRange) 37 39 import Common.Lib.State 38 40 import Common.ExtSign … … 44 46 import CspCASL.SignCSP 45 47 48 import qualified Data.Set as Set 49 46 50 basicAnalysisCspCASL :: (CspBasicSpec, CspCASLSign, GlobalAnnos) 47 51 -> Result (CspBasicSpec, ExtSign CspCASLSign (), 48 [Named CspCASLSen tence])49 basicAnalysisCspCASL (cc, sigma, ga) = do52 [Named CspCASLSen]) 53 basicAnalysisCspCASL (cc, sigma, ga) = 50 54 let Result es mga = mergeGlobalAnnos ga $ globAnnos sigma 51 55 (_, accSig) = runState (ana_BASIC_CSP cc) $ case mga of … … 53 57 Just nga -> sigma { globAnnos = nga } 54 58 ds = reverse $ envDiags accSig 55 Result (es ++ ds) (Just ()) -- insert diagnostics 56 return (cc, mkExtSign accSig, [makeNamed "empty_sentence" emptyCCSentence, 57 makeNamed "StopProcSen" stopProc, 58 makeNamed "GParProcSen" gParProc, 59 makeNamed "AParProcSen" aParProc, 60 makeNamed "StopProcSen" seqProc]) 61 where 62 stopProc = CspCASLSentence (mkSimpleId "stopProc") [] (Stop nullRange) 63 seqProc = CspCASLSentence (mkSimpleId "seqProc") [] 64 (Sequential (Stop nullRange) 65 (Stop nullRange) nullRange) 66 gParProc = CspCASLSentence (mkSimpleId "gParProc") [] 67 (GeneralisedParallel (Stop nullRange) 68 (EventSet [mkSimpleId "S"] nullRange) 69 (Skip nullRange) nullRange) 70 aParProc = CspCASLSentence (mkSimpleId "gParProc") [] 71 (AlphabetisedParallel (Stop nullRange) 72 (EventSet [mkSimpleId "T"] nullRange) 73 (EventSet [mkSimpleId "U"] nullRange) 74 (Skip nullRange) nullRange) 59 -- Extract process equations only. 60 ext = extendedInfo accSig 61 ccsents = reverse $ ccSentences ext 62 -- Clean signature here 63 cleanSig = accSig 64 { extendedInfo = ext { ccSentences = []}} 65 in Result (es ++ ds) $ 66 Just (cc, mkExtSign cleanSig, ccsents) 75 67 76 68 ana_BASIC_CSP :: CspBasicSpec -> State CspCASLSign () … … 102 94 103 95 -- | Statically analyse a CspCASL channel declaration. 104 anaChanDecl :: CHANNEL_DECL -> State CspCASLSign CHANNEL_DECL96 anaChanDecl :: CHANNEL_DECL -> State CspCASLSign () 105 97 anaChanDecl (ChannelDecl chanNames chanSort) = do 106 98 checkSorts [chanSort] -- check channel sort is known … … 113 105 , envDiags = vds 114 106 } 115 return ( ChannelDecl chanNames chanSort)107 return () 116 108 117 109 -- | Statically analyse a CspCASL channel name. … … 178 170 sig <- get 179 171 let ext = extendedInfo sig 172 ccsens = ccSentences ext 180 173 procDecls = procSet ext 181 174 prof = pn `Map.lookup` procDecls 182 175 case prof of 183 -- Only analyse a process if its name (and thus profile) is known 184 Just (ProcProfile procArgs procAlpha) -> 185 do gVars <- anaProcVars pn procArgs vs -- compute global vars 186 termAlpha <- anaProcTerm proc gVars Map.empty 187 checkCommAlphaSub termAlpha procAlpha proc "process equation" 188 return () 189 Nothing -> 190 do addDiags [mkDiag Error "process equation for unknown process" pn] 191 return () 192 vds <- gets envDiags 193 put sig { envDiags = vds } 176 -- Only analyse a process if its name (and thus profile) is known 177 Just (ProcProfile procArgs procAlpha) -> 178 do gVars <- anaProcVars pn procArgs vs -- compute global vars 179 (termAlpha, fqProc) <- anaProcTerm proc (Map.fromList gVars) Map.empty 180 checkCommAlphaSub termAlpha procAlpha proc "process equation" 181 -- Save the diags from the checkCommAlphaSub 182 vds <- gets envDiags 183 -- put CspCASL Sentences back in to the state with new sentence 184 put sig {envDiags = vds, extendedInfo = 185 ext { ccSentences = 186 -- BUG - What should the constituent 187 -- alphabet be for this process? 188 -- probably the same as the inner one! 189 (makeNamed ("ProcHugo") 190 (ProcessEq pn gVars 191 Set.empty 192 fqProc)):ccsens 193 } 194 } 195 return () 196 Nothing -> 197 do addDiags [mkDiag Error "process equation for unknown process" pn] 198 return () 194 199 return () 195 200 196 201 -- | Statically analyse a CspCASL process equation's global variable 197 202 -- names. 198 anaProcVars :: PROCESS_NAME -> [SORT] -> [VAR] -> State CspCASLSign ProcVar Map203 anaProcVars :: PROCESS_NAME -> [SORT] -> [VAR] -> State CspCASLSign ProcVarList 199 204 anaProcVars pn ss vs = do 200 205 case (compare (length ss) (length vs)) of 201 206 LT -> do addDiags [mkDiag Error "too many process arguments" pn] 202 return Map.empty207 return [] 203 208 GT -> do addDiags [mkDiag Error "not enough process arguments" pn] 204 return Map.empty205 EQ -> Monad.foldM anaProcVar Map.empty(zip vs ss)209 return [] 210 EQ -> Monad.foldM anaProcVar [] (zip vs ss) 206 211 207 212 -- | Statically analyse a CspCASL process-global variable name. 208 anaProcVar :: ProcVar Map -> (VAR, SORT) -> State CspCASLSign ProcVarMap213 anaProcVar :: ProcVarList -> (VAR, SORT) -> State CspCASLSign ProcVarList 209 214 anaProcVar old (v, s) = do 210 if v ` Map.member` old211 then do addDiags [mkDiag Error "process arg declared more than once" v]215 if v `elem` (map fst old) 216 then do addDiags [mkDiag Error "process argument declared more than once" v] 212 217 return old 213 else return ( Map.insert v s old)218 else return (old ++ [(v, s)]) 214 219 215 220 -- Static analysis of process terms 216 221 222 -- BUG in fucntion below 223 -- not returing FQProcesses 217 224 -- | Statically analyse a CspCASL process term. 225 -- The process that is returned is a fully qualified process. 218 226 anaProcTerm :: PROCESS -> ProcVarMap -> ProcVarMap -> 219 State CspCASLSign CommAlpha227 State CspCASLSign (CommAlpha, PROCESS) 220 228 anaProcTerm proc gVars lVars = case proc of 221 NamedProcess name args _->229 NamedProcess name args range -> 222 230 do addDiags [mkDiag Debug "Named process" proc] 223 231 al <- anaNamedProc proc name args (lVars `Map.union` gVars) 224 return al 225 Skip _ -> 232 return (al, 233 FQProcess (NamedProcess name args range) al range) 234 Skip range -> 226 235 do addDiags [mkDiag Debug "Skip" proc] 227 return S.empty 228 Stop _ -> 236 return (S.empty, 237 FQProcess (Skip range) S.empty range) 238 Stop range -> 229 239 do addDiags [mkDiag Debug "Stop" proc] 230 return S.empty 231 Div _ -> 240 return (S.empty, 241 FQProcess (Stop range) S.empty range) 242 Div range -> 232 243 do addDiags [mkDiag Debug "Div" proc] 233 return S.empty 234 Run es _ -> 244 return (S.empty, 245 FQProcess (Div range) S.empty range) 246 Run es range -> 235 247 do addDiags [mkDiag Debug "Run" proc] 236 248 comms <- anaEventSet es 237 return comms 238 Chaos es _ -> 249 return (comms, 250 FQProcess (Run es range) comms range) 251 Chaos es range -> 239 252 do addDiags [mkDiag Debug "Chaos" proc] 240 253 comms <- anaEventSet es 241 return comms 242 PrefixProcess e p _ -> 254 return (comms, 255 FQProcess (Chaos es range) comms range) 256 PrefixProcess e p range -> 243 257 do addDiags [mkDiag Debug "Prefix" proc] 244 258 (evComms, rcvMap) <- anaEvent e (lVars `Map.union` gVars) 245 comms <- anaProcTerm p gVars (rcvMap `Map.union` lVars) 246 return (comms `S.union` evComms) 247 InternalPrefixProcess v s p _ -> 259 (comms, pFQTerm) <- anaProcTerm p gVars (rcvMap `Map.union` lVars) 260 return (comms `S.union` evComms, 261 FQProcess (PrefixProcess e pFQTerm range) (comms `S.union` evComms) range) 262 InternalPrefixProcess v s p range -> 248 263 do addDiags [mkDiag Debug "Internal prefix" proc] 249 264 checkSorts [s] -- check sort is known 250 comms <- anaProcTerm p gVars (Map.insert v s lVars) 251 return (S.insert (CommTypeSort s) comms) 252 ExternalPrefixProcess v s p _ -> 265 (comms, pFQTerm) <- anaProcTerm p gVars (Map.insert v s lVars) 266 return (S.insert (CommTypeSort s) comms, 267 FQProcess (InternalPrefixProcess v s pFQTerm range) (S.insert (CommTypeSort s) comms) range) 268 ExternalPrefixProcess v s p range -> 253 269 do addDiags [mkDiag Debug "External prefix" proc] 254 270 checkSorts [s] -- check sort is known 255 comms <- anaProcTerm p gVars (Map.insert v s lVars) 256 return (S.insert (CommTypeSort s) comms) 257 Sequential p q _ -> 271 (comms, pFQTerm) <- anaProcTerm p gVars (Map.insert v s lVars) 272 return (S.insert (CommTypeSort s) comms, 273 FQProcess (ExternalPrefixProcess v s pFQTerm range) (S.insert (CommTypeSort s) comms) range) 274 Sequential p q range -> 258 275 do addDiags [mkDiag Debug "Sequential" proc] 259 pComms <- anaProcTerm p gVars lVars 260 qComms <- anaProcTerm q gVars Map.empty 261 return (pComms `S.union` qComms) 262 InternalChoice p q _ -> 276 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 277 (qComms, qFQTerm) <- anaProcTerm q gVars Map.empty 278 return (pComms `S.union` qComms, 279 FQProcess (Sequential pFQTerm qFQTerm range) (pComms `S.union` qComms) range) 280 InternalChoice p q range -> 263 281 do addDiags [mkDiag Debug "InternalChoice" proc] 264 pComms <- anaProcTerm p gVars lVars 265 qComms <- anaProcTerm q gVars lVars 266 return (pComms `S.union` qComms) 267 ExternalChoice p q _ -> 282 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 283 (qComms, qFQTerm) <- anaProcTerm q gVars lVars 284 return (pComms `S.union` qComms, 285 FQProcess (InternalChoice pFQTerm qFQTerm range) (pComms `S.union` qComms) range) 286 ExternalChoice p q range -> 268 287 do addDiags [mkDiag Debug "ExternalChoice" proc] 269 pComms <- anaProcTerm p gVars lVars 270 qComms <- anaProcTerm q gVars lVars 271 return (pComms `S.union` qComms) 272 Interleaving p q _ -> 288 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 289 (qComms, qFQTerm) <- anaProcTerm q gVars lVars 290 return (pComms `S.union` qComms, 291 FQProcess (ExternalChoice pFQTerm qFQTerm range) (pComms `S.union` qComms) range) 292 Interleaving p q range -> 273 293 do addDiags [mkDiag Debug "Interleaving" proc] 274 pComms <- anaProcTerm p gVars lVars 275 qComms <- anaProcTerm q gVars lVars 276 return (pComms `S.union` qComms) 277 SynchronousParallel p q _ -> 294 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 295 (qComms, qFQTerm) <- anaProcTerm q gVars lVars 296 return (pComms `S.union` qComms, 297 FQProcess (Interleaving pFQTerm qFQTerm range) (pComms `S.union` qComms) range) 298 SynchronousParallel p q range -> 278 299 do addDiags [mkDiag Debug "Synchronous" proc] 279 pComms <- anaProcTerm p gVars lVars 280 qComms <- anaProcTerm q gVars lVars 281 return (pComms `S.union` qComms) 282 GeneralisedParallel p es q _ -> 300 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 301 (qComms, qFQTerm) <- anaProcTerm q gVars lVars 302 return (pComms `S.union` qComms, 303 FQProcess (SynchronousParallel pFQTerm qFQTerm range) (pComms `S.union` qComms) range) 304 GeneralisedParallel p es q range -> 283 305 do addDiags [mkDiag Debug "Generalised parallel" proc] 284 pComms<- anaProcTerm p gVars lVars306 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 285 307 synComms <- anaEventSet es 286 qComms <- anaProcTerm q gVars lVars 287 return (S.unions [pComms, qComms, synComms]) 288 AlphabetisedParallel p esp esq q _ -> 308 (qComms, qFQTerm) <- anaProcTerm q gVars lVars 309 return (S.unions [pComms, qComms, synComms], 310 FQProcess (GeneralisedParallel pFQTerm es qFQTerm range) (S.unions [pComms, qComms, synComms]) range) 311 AlphabetisedParallel p esp esq q range -> 289 312 do addDiags [mkDiag Debug "Alphabetised parallel" proc] 290 pComms<- anaProcTerm p gVars lVars313 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 291 314 pSynComms <- anaEventSet esp 292 315 checkCommAlphaSub pSynComms pComms proc 293 316 "alphabetised parallel, left" 294 317 qSynComms <- anaEventSet esq 295 qComms<- anaProcTerm q gVars lVars318 (qComms, qFQTerm) <- anaProcTerm q gVars lVars 296 319 checkCommAlphaSub qSynComms qComms proc 297 320 "alphabetised parallel, right" 298 return (pComms `S.union` qComms) 299 Hiding p es _ -> 321 return (pComms `S.union` qComms, 322 FQProcess (AlphabetisedParallel pFQTerm esp esq qFQTerm range) (pComms `S.union` qComms) range) 323 Hiding p es range -> 300 324 do addDiags [mkDiag Debug "Hiding" proc] 301 pComms<- anaProcTerm p gVars lVars325 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 302 326 hidComms <- anaEventSet es 303 return (pComms `S.union` hidComms) 304 RenamingProcess p r _ -> 327 return (pComms `S.union` hidComms, 328 FQProcess (Hiding pFQTerm es range) (pComms `S.union` hidComms) range) 329 RenamingProcess p r range -> 305 330 do addDiags [mkDiag Debug "Renaming" proc] 306 pComms<- anaProcTerm p gVars lVars331 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 307 332 renAlpha <- anaRenaming r 308 return (pComms `S.union` renAlpha) 309 ConditionalProcess f p q _ -> 333 return (pComms `S.union` renAlpha, 334 FQProcess (RenamingProcess pFQTerm r range) (pComms `S.union` renAlpha) range) 335 ConditionalProcess f p q range -> 310 336 do addDiags [mkDiag Debug "Conditional" proc] 311 pComms <- anaProcTerm p gVars lVars 312 qComms <- anaProcTerm q gVars lVars 337 (pComms, pFQTerm) <- anaProcTerm p gVars lVars 338 (qComms, qFQTerm) <- anaProcTerm q gVars lVars 339 -- mfs is the fully qualified formula version of f 313 340 mfs <- anaFormulaCspCASL (gVars `Map.union` lVars) f 341 addDiags [mkDiag Debug "Formula" f] 342 addDiags [mkDiag Debug "FQFormula" (Maybe.fromJust mfs)] 314 343 let fComms = case mfs of 315 344 Nothing -> S.empty 316 345 Just fs -> formulaComms fs 317 return (S.unions [pComms, qComms, fComms]) 346 return (S.unions [pComms, qComms, fComms], 347 FQProcess (ConditionalProcess (Maybe.fromJust mfs) pFQTerm qFQTerm range) 348 (S.unions [pComms, qComms, fComms]) range) 318 349 319 350 -- | Statically analyse a CspCASL "named process" term. … … 582 613 ga = globAnnos sig 583 614 mix = emptyMix { mixRules = makeRules ga allIds } 584 resF <- resolveFormula (putParen mix) (mixResolve mix) 585 ga (mixRules mix) frm 615 resF <- resolveFormula (putParen mix) (mixResolve mix) ga (mixRules mix) frm 586 616 minExpFORMULA (const return) sig resF 587 617