content: {- |
  Module      :  ./CspCASL/Parse_CspCASL.hs
  Description :  Parser for CspCASL specifications
  Copyright   :  (c) Uni Bremen 2007
  License     :  GPLv2 or higher, see LICENSE.txt
  
  Maintainer  :  a.m.gimblett@swan.ac.uk
  Stability   :  experimental
  Portability :  portable
  
  Parser for CSP-CASL specifications.
  -}
  
  module CspCASL.Parse_CspCASL (cspBasicExt) where
  
  import Text.ParserCombinators.Parsec
  import Common.AnnoState
  import Common.Lexer
  
  import CspCASL.AS_CspCASL
  import CspCASL.CspCASL_Keywords
  import CspCASL.Parse_CspCASL_Process
  
  instance AParsable CspBasicExt where
    aparser = cspBasicExt
  
  cspBasicExt :: AParser st CspBasicExt
  cspBasicExt =
    itemList cspKeywords channelS (const chanDecl) Channels
    <|> do
      p <- asKey processS
      auxItemList cspStartKeys [p] procItem ProcItems
  
  chanDecl :: AParser st CHANNEL_DECL
  chanDecl = do
    vs <- commaSep1 channel_name
    colonT
    es <- cspSortId
    return (ChannelDecl vs es)
  
  procItem :: AParser st PROC_ITEM
  procItem = do
    ep <- procDeclOrDefn
    case ep of
      Left (fpn, vs) -> do
        p <- csp_casl_process
        return $ Proc_Eq (ParmProcname fpn vs) p
      Right (pn, eas, al) -> case eas of
        Left ss -> return $ Proc_Decl pn ss al
        Right vds -> do
          p <- csp_casl_process
          return $ Proc_Defn pn vds al p
  