-----------------------------------------------------------------------------
-- |
-- Module      :  Reader.Parser.Data
-- License     :  MIT (see the LICENSE file)
-- Maintainer  :  Felix Klein (klein@react.uni-saarland.de)
--
-- Common data used by the parser module.
--
-----------------------------------------------------------------------------

module Reader.Parser.Data
  ( Specification(..)
  , globalDef
  ) where

-----------------------------------------------------------------------------

import Data.Types
  ( SignalDecType
  )

import Data.Enum
  ( EnumDefinition
  )

import Data.Types
  ( Target
  , Semantics
  )

import Data.Expression
  ( Expr
  , ExprPos(..)
  )

import Data.Binding
  ( BindExpr
  )

import Text.Parsec
  ( (<|>)
  , char
  , letter
  , alphaNum
  )

import Text.Parsec.Token
  ( LanguageDef
  , GenLanguageDef(..)
  )

import Text.Parsec.Language
  ( emptyDef
  )

-----------------------------------------------------------------------------

-- | The @Specification@ record contains all the data of a
-- specification that is extracted by the parsing process. This includes:
--
--     * The title of the specification
--
--     * The description of the specification
--
--     * The semantics flag of the specification
--
--     * The target flag of the specification
--
--     * The tag list of the specification
--
--     * The list of bindings of an identifier to an
--       expression defined in the PARAMETERS subsection
--
--     * The list of bindings of an identifier to any
--       other expression defined in the DEFINITIONS subsection
--
--     * The list of input signals
--
--     * The list of output signals
--
--     * The list of expresssions representing the initial input of
--       the environment
--
--     * The list of expresssions representing the initial output of
--       the system
--
--     * The list of expresssions representing the globally asserted
--       requirements on the inputs of the specification
--
--     * The list of expresssions representing the
--       assumptions of the specification
--
--     * The list of expressions representing the
--       invariants of the specification
--
--     * The list of expressions representing the
--       guarantees of the specification

data Specification =
  Specification
  { title :: (String, ExprPos)
  , description :: (String, ExprPos)
  , semantics :: (Semantics, ExprPos)
  , target :: (Target, ExprPos)
  , tags :: [(String, ExprPos)]
  , enumerations :: [EnumDefinition String]
  , parameters :: [BindExpr String]
  , definitions :: [BindExpr String]
  , inputs :: [SignalDecType String]
  , outputs :: [SignalDecType String]
  , initially :: [Expr String]
  , preset :: [Expr String]
  , requirements :: [Expr String]
  , assumptions :: [Expr String]
  , invariants :: [Expr String]
  , guarantees :: [Expr String]
  }

-----------------------------------------------------------------------------

-- | The language definition which is shared among all parsers.

globalDef
  :: LanguageDef a

globalDef =
  emptyDef
  { identStart     = letter <|> char '_' <|> char '@'
  , identLetter    = alphaNum <|> char '_' <|> char '@' <|> char '\''
  , commentLine    = "//"
  , commentStart   = "/*"
  , commentEnd     = "*/"
  , nestedComments = True
  , caseSensitive  = True
  }

-----------------------------------------------------------------------------