{-step operation-}


newtype Var = Var String
            deriving (Eq, Ord, Show, Read)
           
           
data Oplus = Plus 
           | Minus
           | Index
             deriving (Eq, Ord, Show, Read)
             
             
data Otime = Oplus
           | Time
           | Div
           | Eq
           | Less    -- < --
           | Greater   -- > --
           | Less_Eq
           | Greater_Eq
           | Not_Eq
           deriving (Eq, Ord, Show, Read)
                    
             
data Const = Const Int
             deriving (Eq, Ord, Show, Read)

                      
data Exp = EConst Const
         | EVar Var
         | EVar_List Var Exp
         | EExp Exp Otime Exp
         | ETop Var
         | EEmpty Var
           deriving (Eq, Ord, Show, Read)
           

data Step = Oplus_Eq Var Oplus Exp
          | Oplus_Eq_List Var Exp Oplus Exp
          | Push Exp Exp
          | Pop Exp Exp
          | Skip
          deriving (Eq, Ord, Show, Read)
                   
            

{-SRL-}
data Blk = SStep Step
         | Sif Exp Blk Blk Exp
         | Sblk Blk Blk
         | Sfrom  Exp Blk Blk Exp
         deriving (Eq, Ord, Show, Read)

            
data SRL = SRL Blk
         deriving (Eq, Ord, Show, Read)


{-RL-}
data Label = Label String
           deriving (Eq, Ord, Show, Read)


data Jump = Rgoto Label
          | Rif Exp Label Label
          | Rexit
          deriving (Eq, Ord, Show, Read)


data From = Rfrom Label
          | Rfi Exp Label Label
          | Rentry
          deriving (Eq, Ord, Show, Read)
                   

data Rlblk = Rblk Label From [Step] Jump
           deriving (Eq, Ord, Show, Read)

                    
data Rl = Rrl [Rlblk]
        deriving (Eq, Ord, Show, Read)
