Parse_CspCASL.hs revision 1c7c4d95775a8ad5f7373e5cf0bad86f8301c56c
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett{- |
5fdf8899e78fea735c30253322eb7715646317e4Andy GimblettModule : $Id$
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettDescription : Parser for CspCASL specifications
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettCopyright : (c) Uni Bremen 2007
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettMaintainer : a.m.gimblett@swan.ac.uk
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettStability : experimental
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettPortability : portable
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettParser for CSP-CASL specifications.
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett-}
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettmodule CspCASL.Parse_CspCASL (
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett cspBasicSpec
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett) where
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport Text.ParserCombinators.Parsec (choice, many1, try, (<|>),
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett option, sepBy)
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport CASL.AS_Basic_CASL (VAR)
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport Common.AnnoState (AParser, asKey, colonT, equalT, anSemi)
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport Common.Id (genName)
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport Common.Lexer (commaSep1, cParenT, oParenT)
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport CspCASL.AS_CspCASL
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport CspCASL.AS_CspCASL_Process
dd0d7990e6ce74fe7531c1c05eb672dd940a8be7Christian Maederimport CspCASL.Core_CspCASL
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport CspCASL.CspCASL_Keywords
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblettimport CspCASL.Parse_CspCASL_Process
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettcspBasicSpec :: AParser st CspBasicSpec
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettcspBasicSpec = do
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett chans <- option [] $ do
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett choice [asKey channelS, asKey channelsS]
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett cds <- chanDecl `sepBy` anSemi
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett -- XXX how to have an _optional_ final semicolon here?
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett return cds
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett items <- processItems
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett let (decls, eqs) = splitProcItems items
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett return (basicToCore (CspBasicSpec chans decls eqs))
c052e3ee4a53ee3a2da829aa142fd596ef6c9e3dAndy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettchanDecl :: AParser st CHANNEL
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettchanDecl = do vs <- commaSep1 var
5fdf8899e78fea735c30253322eb7715646317e4Andy Gimblett colonT
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett es <- event_set
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett return (Channel vs es)
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy Gimbletttype PROC_ITEM = Either PROC_DECL PROC_EQ
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettprocessItems :: AParser st [PROC_ITEM]
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettprocessItems = do asKey processS
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett procItems <|> fmap singleProcess csp_casl_process
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett-- Turn an unnamed singleton process into a declaration/equation.
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettsingleProcess :: PROCESS -> [PROC_ITEM]
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettsingleProcess p =
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett [Left (ProcDecl singletonProcessName [] FullAlphabet),
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett Right (ProcEq (ParmProcname singletonProcessName []) p)]
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett where singletonProcessName = genName "P"
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettsplitProcItems :: [PROC_ITEM] -> ([PROC_DECL], [PROC_EQ])
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettsplitProcItems i = ([x | Left x <- i], [x | Right x <- i])
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettprocItems :: AParser st [PROC_ITEM]
77998f1139e55978f6288e905cd16565f2e20298Andy GimblettprocItems = many1 procItem
77998f1139e55978f6288e905cd16565f2e20298Andy Gimblett
5fdf8899e78fea735c30253322eb7715646317e4Andy GimblettprocItem :: AParser st PROC_ITEM
procItem = try (do pdcl <- procDecl
return (Left pdcl))
<|> (do peq <- procEq
return (Right peq))
procDecl :: AParser st PROC_DECL
procDecl = do
pn <- process_name
parms <- option [] $ do
try oParenT
parms <- commaSep1 event_set
cParenT
return parms
colonT
es <- event_set
return (ProcDecl pn parms es)
procEq :: AParser st PROC_EQ
procEq = do
pn <- try (do
pn <- parmProcname
equalT
return pn)
p <- csp_casl_process
return (ProcEq pn p)
parmProcname :: AParser st PARM_PROCNAME
parmProcname = do
pn <- process_name
pv <- procVars
return (ParmProcname pn pv)
procVars :: AParser st [VAR]
procVars = do try oParenT
vs <- commaSep1 var
cParenT
return vs
<|> return []