diff options
Diffstat (limited to 'assignment-13/uFPL/Sim.dcl')
-rw-r--r-- | assignment-13/uFPL/Sim.dcl | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/assignment-13/uFPL/Sim.dcl b/assignment-13/uFPL/Sim.dcl new file mode 100644 index 0000000..6ee6e14 --- /dev/null +++ b/assignment-13/uFPL/Sim.dcl @@ -0,0 +1,78 @@ +definition module uFPL.Sim + +import iTasks + +import uFPL +from uFPL.C import :: Signedness + +:: UFPLException + = LiftException String + | NoShareException ISharedRef + | WriteToROShare ISharedRef + +instance toString UFPLException + +class lift a :: a -> Task Dynamic +class unlift a b :: b -> a + +:: ReadOrWrite = ReadOnly | ReadWrite + +:: ISharedInt = + { iisname :: String + , iisinit :: Int + , iisrw :: ReadOrWrite + } + +:: ISharedRef :== String + +:: IShares = + { ishares :: [ISharedInt] + } + +:: IExpr + = ILitInt Int + | ILitBool Bool + | ILitChar Char + | IShared ISharedRef + | IAdd IExpr IExpr + | ISub IExpr IExpr + | IMul IExpr IExpr + | IDiv IExpr IExpr + | IEq IExpr IExpr + | ILt IExpr IExpr + | IAnd IExpr IExpr + | IOr IExpr IExpr + | IIf IExpr IExpr IExpr + +:: ITrigger + = IChange ISharedRef + | IBecomes ISharedRef IExpr + | ITAnd ITrigger ITrigger + | ITOr ITrigger ITrigger + +:: IRule + = IAssign ISharedRef IExpr + | IWhen IExpr [IRule] + | ITrigger ITrigger [IRule] + | ISetCursor (IExpr, IExpr) + | IPrint IExpr + +:: INamedRule = Rule String [IRule] + +derive class iTask Signedness, CType, ReadOrWrite, ISharedInt, IShares, IExpr, + ITrigger, IRule, INamedRule + +instance lift [a] | lift a +instance unlift [a] [b] | unlift a b +instance lift IExpr +instance unlift IExpr (Expr t rw) | Expr t +instance lift ISharedInt +instance unlift ISharedInt (UShared Int rw) +instance lift ITrigger +instance unlift ITrigger Trigger +instance lift IRule +instance unlift IRule Rule +instance lift INamedRule +instance unlift INamedRule NamedRule + +simulate :: [NamedRule] -> Task () |