As.hs revision ccd28c25c1aee73a195053e677eca17e20917d84
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian MaederModule : $Header$
c63ebf815c8a874525cf18670ad74847f7fc7b26Christian MaederDescription : abstract syntax of VSE programs and dynamic logic
c092fcac4b8f5c524c22ca579189c4487c13edf7Christian MaederCopyright : (c) C. Maeder, DFKI 2008
fefee7e1dee1ee5f0768a03a4abae88d1ca2c3fdRazvan PascanuLicense : GPLv2 or higher, see LICENSE.txt
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederMaintainer : Christian.Maeder@dfki.de
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiStability : provisional
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiPortability : portable
c092fcac4b8f5c524c22ca579189c4487c13edf7Christian MaederCASL extention to VSE programs and dynamic logic
dda5ab793f1615c1ba1dcaa97a4346b0878da6b1Christian Maederas described on page 4-7 (Sec 2.3.1, 2.5.2, 2.5.4, 2.6) of
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian MaederBruno Langenstein's API description
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian Maederimport qualified Data.Map as Map
dda5ab793f1615c1ba1dcaa97a4346b0878da6b1Christian Maeder-- | input or output procedure parameter kind
d56ece59c372cb887355825901222b9f3377f7e6Thiemo Wiedemeyerdata Paramkind = In | Out deriving (Show, Eq, Ord)
f77f29e84b3f6e791c82e61b13fbf76582bedd2fChristian Maeder-- | a procedure parameter
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian Maederdata Procparam = Procparam Paramkind SORT deriving (Show, Eq, Ord)
da333ffa6336cf59a4071fcddad358c5eafd3e61Sonja Gröning-- | procedure or function declaration
c0c2380bced8159ff0297ece14eba948bd236471Christian Maederdata Profile = Profile [Procparam] (Maybe SORT) deriving (Show, Eq, Ord)
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross-- | further VSE signature entries
fc1a590cd3ee36797c0a032ff41e07f8e2469341Christian Maederdata Sigentry = Procedure Id Profile Range deriving (Show, Eq)
fc1a590cd3ee36797c0a032ff41e07f8e2469341Christian Maederdata Procdecls = Procdecls [Annoted Sigentry] Range deriving (Show, Eq)
834c2e71b8e390e5b05c8d02bb6eb22621125133Markus Grossinstance GetRange Procdecls where
6e52f1dfc0da4bc4a7701cf856641c9dce08fc7dChristian Maeder getRange (Procdecls _ r) = r
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina Sojakova-- | wrapper for positions
63da71bfb4226f504944b293fb77177ebcaea7d4Ewaryst Schulzdata Ranged a = Ranged { unRanged :: a, range :: Range }
923e25bb8c7cf9f2978c7844ad173704482cc3b0Martin Kühl deriving (Show, Eq, Ord)
2b873214c9ab511bbca437c036371ab664aedaceChristian Maeder-- | attach a nullRange
fe4e6766a6e51cca3f8cc9632c25936af147d8b9Christian MaedermkRanged :: a -> Ranged a
834c2e71b8e390e5b05c8d02bb6eb22621125133Markus GrossmkRanged a = Ranged a nullRange
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross-- | programs with ranges
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Grosstype Program = Ranged PlainProgram
ee1c7c5796832536932d7b06cbfb1ca13f9a0d7bMartin Kühl-- | programs based on restricted terms and formulas
ee1c7c5796832536932d7b06cbfb1ca13f9a0d7bMartin Kühldata PlainProgram =
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder | Assign VAR (TERM ())
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder | Call (FORMULA ()) -- ^ a procedure call as predication
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder | Return (TERM ())
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder | Block [VAR_DECL] Program
c4451dc7da4a15726ba96179aecf046a5df5cae1Christian Maeder | Seq Program Program
2b873214c9ab511bbca437c036371ab664aedaceChristian Maeder | If (FORMULA ()) Program Program
fa388aea9cef5f9734fec346159899a74432ce26Christian Maeder | While (FORMULA ()) Program
63719301448519453f66383f4e583d9fd5b89ecbChristian Maeder deriving (Show, Eq, Ord)
fc1a590cd3ee36797c0a032ff41e07f8e2469341Christian Maeder-- | alternative variable declaration
fc1a590cd3ee36797c0a032ff41e07f8e2469341Christian Maederdata VarDecl = VarDecl VAR SORT (Maybe (TERM ())) Range deriving Show
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina SojakovatoVarDecl :: [VAR_DECL] -> [VarDecl]
72079df98b3cb7cc1fd82a0a24984893dcd05ecaEwaryst SchulztoVarDecl = concatMap
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder (\ (Var_decl vs s r) -> map (\ v -> VarDecl v s Nothing r) vs)
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian MaederaddInits :: [VarDecl] -> Program -> ([VarDecl], Program)
fbc4f8708092d571a45cb483f37cc6b674da45a7Christian MaederaddInits vs p = case vs of
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder vd@(VarDecl v s Nothing z) : r -> case unRanged p of
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder Seq (Ranged (Assign av t) _) p2 | v == av
fbc4f8708092d571a45cb483f37cc6b674da45a7Christian Maeder -> let (rs, q) = addInits r p2
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross in (VarDecl v s (Just t) z : rs, q)
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross _ -> let (rs, q) = addInits r p
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross in (vd : rs, q)
d56ece59c372cb887355825901222b9f3377f7e6Thiemo Wiedemeyer-- | extend CASL formulas by box or diamond formulas and defprocs
d56ece59c372cb887355825901222b9f3377f7e6Thiemo Wiedemeyerdata VSEforms =
f1dec6898638ba1131a9fadbc4d1544c93dfabb0Klaus Luettich Dlformula BoxOrDiamond Program Sentence
d56ece59c372cb887355825901222b9f3377f7e6Thiemo Wiedemeyer | Defprocs [Defproc]
d56ece59c372cb887355825901222b9f3377f7e6Thiemo Wiedemeyer | RestrictedConstraint [Constraint] (Map.Map SORT Id) Bool
d56ece59c372cb887355825901222b9f3377f7e6Thiemo Wiedemeyer deriving (Show, Eq, Ord)
f77f29e84b3f6e791c82e61b13fbf76582bedd2fChristian Maedertype Dlformula = Ranged VSEforms
data Procs = Procs { procsMap :: Map.Map Id Profile } deriving (Show, Eq, Ord)
emptyProcs = Procs Map.empty
foldM (\ m (k, v) -> case Map.lookup k m1 of
Nothing -> return $ Map.insert k v m
m1 $ Map.toList m2
foldM (\ m (k, v) -> case Map.lookup k m1 of
Just w -> if w == v then return $ Map.insert k v m else
diffProcs (Procs m1) (Procs m2) = Procs $ Map.difference m1 m2
isSubProcsMap (Procs m1) (Procs m2) = Map.isSubmapOfBy (==) m1 m2
printRestrTypedecl :: Map.Map SORT Id -> DATATYPE_DECL -> Doc
pretty $ Map.findWithDefault (gnRestrName s) s restr]
(map (\ (i, p) -> emptyAnno $ Procedure i p nullRange) $ Map.toList m)