packages feed

mulang-0.1.0.0: src/Language/Mulang.hs

{-# LANGUAGE DeriveGeneric #-}

module Language.Mulang (
    Program(..),
    Declaration(..),
    Equation(..),
    Rhs(..),
    GuardedRhs(..),
    Expression(..),
    ComprehensionStatement(..),
    Alternative(..),
    GuardedAlternatives(..),
    GuardedAlternative(..),
    Pattern(..),
    LiteralValue(..)
  ) where

import           GHC.Generics

data Program = Program [Declaration] deriving (Eq, Show, Read, Generic)

type Identifier = String

-- declaration or directive
data Declaration
         = TypeAlias Identifier
         | RecordDeclaration Identifier
         | TypeSignature Identifier
         | FunctionDeclaration Identifier [Equation]    -- functional, maybe pure,
                                                        -- optionally guarded,
                                                        -- optionally pattern matched function
         | ProcedureDeclaration Identifier              -- classic imperative-style procedure
         | ConstantDeclaration Identifier Rhs [Declaration]
  deriving (Eq, Show, Read, Generic)

data Equation = Equation [Pattern] Rhs [Declaration] deriving (Eq, Show, Read, Generic)

data Rhs
         = UnguardedRhs Expression
         | GuardedRhss  [GuardedRhs]
  deriving (Eq, Show, Read, Generic)

data GuardedRhs = GuardedRhs Expression Expression deriving (Eq, Show, Read, Generic)

-- expression or statement
-- may have effects
data Expression
        = Variable Identifier
        | Literal LiteralValue
        | InfixApplication Expression String Expression
        | Application Expression Expression
        | Lambda [Pattern] Expression
        | Let [Declaration] Expression
        | If Expression Expression Expression
        | Match Expression [Alternative]
        | MuTuple [Expression]
        | MuList [Expression]
        | Comprehension Expression [ComprehensionStatement]
        | Sequence [Expression]                   -- sequence of statements
        | ExpressionOther
  deriving (Eq, Show, Read, Generic)

data Pattern
        = VariablePattern String                 -- ^ variable
        | LiteralPattern String              -- ^ literal constant
        | InfixApplicationPattern Pattern String Pattern
        | ApplicationPattern String [Pattern]        -- ^ data constructor and argument
        | TuplePattern [Pattern]              -- ^ tuple pattern
        | ListPattern [Pattern]               -- ^ list pattern
        | AsPattern String Pattern         -- ^ @\@@-pattern
        | WildcardPattern                   -- ^ wildcard pattern (@_@)
        | OtherPattern
  deriving (Eq, Show, Read, Generic)

data ComprehensionStatement
        = MuGenerator Pattern Expression
        | MuQualifier Expression
        | LetStmt [Declaration]
  deriving (Eq, Show, Read, Generic)


data Alternative = Alternative Pattern GuardedAlternatives [Declaration] deriving (Eq, Show, Read, Generic)

data GuardedAlternatives
        = UnguardedAlternative Expression          -- ^ @->@ /exp/
        | GuardedAlternatives  [GuardedAlternative] -- ^ /gdpat/
  deriving (Eq, Show, Read, Generic)


data GuardedAlternative = GuardedAlternative Expression Expression deriving (Eq, Show, Read, Generic)

data LiteralValue
          = MuBool Bool
          | MuInteger Integer
          | MuFloat Rational
          | MuString String
    deriving (Eq, Show, Read, Generic)