packages feed

cspretty-1.0: Language/CSPM/Syntax.hs

{- |
   Module      :  Language.CSP.Syntax
   Description :  Abstract syntax for CSP
   Copyright   :  Draper Laboratories
   
   Abstract syntax of machine-reable CSP.  This is intended to correspond
   with the input language of FDR3, though some features are likely missing.

-}

module Language.CSPM.Syntax where




{- | 'Id' is our type for names. -}
data Id  =
  -- | the 'Id' constructor should be used for most identifiers, like variable
  -- names.  It has two fields - a 'String' and an 'Int'.  Only the 'Int' is
  -- used to check equality of names, the 'String' is just a hint for pretty
  -- printing.  The pretty printer doesn't guarantee to use exactly this
  -- name in the case where different 'Id's use the same string part.
    Id    (String,Int)
  -- | 'Fixed' is for identifiers where the name matters outside the scope of
  -- what is currently being pretty printed (for example, to refer to the
  -- standard library).  The pretty printer will always use exactly this
  -- name, and the programmer must avoid conflicts to get sane CSPm.
  | Fixed String        
  deriving (Show)

instance Eq Id where
  (Id (_,i1)) == (Id (_,i2)) = i1 == i2
  (Fixed s1)  == (Fixed s2)  = s1 == s2
  _ == _                     = False
  
instance Ord Id where
  compare (Id (_,i1)) (Id (_,i2)) = compare i1 i2
  compare (Id _) (Fixed _)        = LT
  compare (Fixed s1) (Fixed s2)   = compare s1 s2
  compare (Fixed _)  (Id _)       = GT

-- | A helper function which gets the string part of an identifier, useful
-- for error messages
namePart :: Id -> String
namePart (Id (s,_)) = s
namePart (Fixed s)  = s

-- | Base types in FDR
data Type = TEvent | TProc
          | TChar | TBool | TInt | TUnit
          | TList Type | TSet Type | TMap Type Type
          | TData Id
          | TRange Exp Exp
            deriving (Eq, Show)

-- | Toplevel FDR modules (this corresponds to a .csp file)
data FDRMod = FDRMod { topLevels :: [Definition] }
              deriving (Eq, Show)

-- | Toplevel declarations in FDR
data Definition = 
    DVar Pat Exp
  | DFun Id [([Pat],Exp)]
  | DAnnot Id Type

   -- | Somewhat unusually, the arguments to data constructors in CSPm datatype
   -- declarations are actually expressions, not types.  In particular, the
   -- arguments must always be a set, as in:
   -- 
   -- >   datatype Foo = F.{0..5}.{True,False}
   -- 
   -- FDR provides a little syntax sugar to help with common cases, in that
   -- there are actually /expressions/ called @Int@ and @Bool@:
   --
   -- >     Int :: {Int}      Bool :: {Bool}
   -- >     Int = {0..}       Bool = {True,False}
  | DDataType Id [(Id,[Exp])]

  | DSubType Id [(Id,[Exp])]
  | DChan [Id] [Type]
  | DInclude String
  | DExternal Id
  | DTransparent Id
  | DAssert Assertion Model
    deriving (Eq, Show)

-- | The models that can be used in assertions.
data Model
  -- | Traces
  = MT
  -- | Failures
  | MF
  -- | Failures-divergences
  | MFD
  deriving (Eq,Show)

-- | FDR assertions
data Assertion = ARefines Exp Exp
               | ADeadlockFree Exp
               | ADivergenceFree Exp
               | ADeterministic Exp
               | AHasTrace Exp Exp
  deriving (Eq,Show)

-- | The types of fields one can use in a prefix.
data CommField =
  -- | .
    CFPlain Exp
  -- | ?
  | CFInput Pat
  -- | !
  | CFOutput Exp
  -- | $
  | CFNDInput Pat 
    deriving (Eq,Show)

-- | Constants
data Const = CStop | CSkip | CInt Integer | CChar Char | CUnit
           | CBool Bool | CString String
             deriving (Eq, Show)

-- | Comprehension Statements
data CompStmt =
    CSGen Pat Exp  -- CSGen p e  ==   p <- e     (or    p : e)
  | CSPred Exp
  deriving (Eq,Show)

-- | Patterns
data Pat =
    PId Id
  | PConcat Pat Pat
  | PDot Pat [Pat]
  | PDouble Pat Pat
  | PList [Pat]
  | PConst Const
  | PEmptySet
  | PSingletonSet Pat
  | PTuple [Pat]
  | PWildCard
  deriving (Eq,Show)

-- | Expressions
data Exp =
  -- FP basics
    EId Id
  | ELambda [Pat] Exp
  | EApp Exp [Exp]
  | ELet [Definition] Exp
  | EIfThenElse Exp Exp Exp
  | EUOp UOp Exp
  | EBinOp Exp BinOp Exp
  | EConst Const
  | EError String
    
  -- CSP-specific
  | EDot Exp [Exp]

  | EExtChoice Exp Exp
  | EGuarded Exp Exp
  | EHide Exp Exp
  | EIntChoice Exp Exp
  -- | In prefix we deviate a little from the strict grammar by taking an exp
  -- and its dotted arguments rather than an arbitrary expression.  This
  -- helps with pretty printing (and conceptually).
  | EPrefix Exp [CommField] Exp  
  | EProject Exp Exp  
  | ERename Exp [(Exp,Exp)]

  | EAlphaParallel Exp Exp Exp Exp
  | EGenParallel Exp Exp Exp
  | EInterleave Exp Exp

  | EException Exp Exp Exp
  | EInterrupt Exp Exp
  | ESeq Exp Exp
  | ELinkedParallel Exp [(Exp,Exp)] Exp 
  | ETimeout Exp Exp
  | ESyncExtChoice Exp Exp Exp
  | ESyncInterrupt Exp Exp Exp

  | ERepAlphaParallel [CompStmt] Exp Exp
  | ERepExtChoice [CompStmt] Exp
  | ERepGenParallel Exp [CompStmt] Exp
  | ERepInterleave [CompStmt] Exp
  | ERepIntChoice [CompStmt] Exp
  | ERepLinkedParallel [(Exp,Exp)] [CompStmt] Exp
  | ERepSeq [CompStmt] Exp
  | ERepSyncExtChoice Exp [CompStmt] Exp

  -- Lists
  | EList [Exp]
  | EListComp [Exp] [CompStmt]
  | EListFrom Exp
  | EListFromComp Exp [CompStmt]
  | EListFromTo Exp Exp
  | EListFromToComp Exp Exp [CompStmt]
  | EListConcat Exp Exp
  | EListLength Exp

  -- Tuples
  | ETuple [Exp]
         
  -- Sets
  | ESet [Exp]
  | ESetComp [Exp] [CompStmt]
  | ESetFrom Exp
  | ESetFromComp Exp [CompStmt]
  | ESetFromTo Exp Exp
  | ESetFromToComp Exp Exp [CompStmt]

  -- Built-in sets.  In the official CSPm syntax, these are just IDs provided by
  -- the standard library.  But for sanity, I'm making them explicit parts of
  -- the syntax.
  | ESetInt
  | ESetBool

  -- Enumerated Set
  | EEnumSet [Exp]
  | EEnumSetComp [Exp] [CompStmt]

  --maps
  | EMap [(Exp, Exp)]
    deriving (Eq, Show)

-- | Unary boolean and arithmetic operators
data UOp = 
    UNeg 
  | UNot
  deriving (Eq, Show)

-- | Binary boolean and arithmetic operators
data BinOp =

    BEq
  | BNeq
  | BLeq
  | BLt
  | BGeq
  | BGt

  | BPlus
  | BMinus
  | BTimes
  | BDiv
  | BMod

  | BAnd
  | BOr
  deriving (Eq, Show)