6332N/ADescription : syntactic csp-casl symbols
6332N/ACopyright : (c) Christian Maeder, DFKI GmbH 2011
6332N/AMaintainer : Christian.Maeder@dfki.de
data CspSymbItems = CspSymbItems CspSymbKind [CspSymb]
data CspSymbMapItems = CspSymbMapItems CspSymbKind [CspSymbMap]
data CspSymbKind = CaslKind SYMB_KIND | ProcessKind | ChannelKind
data CspSymb = CspSymb Id (Maybe CspType)
-- for channels with sorts we may re-use A_type that is ambiguous
data CspType = CaslType TYPE | ProcType ProcProfile
data CspSymbMap = CspSymbMap CspSymb (Maybe CspSymb)
pluralCspSympKind :: CspSymbKind -> [a] -> Doc
pluralCspSympKind k l = case k of
_ -> keyword $ pluralS_symb_list c l
ProcessKind -> keyword processS
ChannelKind -> keyword $ channelS ++ appendS l
instance Pretty CspSymbKind where
pretty k = pluralCspSympKind k [()]
instance Pretty CspType where
CaslType c -> colon <> pretty c
ProcType p -> printProcProfile p
instance Pretty CspSymb where
pretty (CspSymb i ms) = pretty i <+> pretty ms
instance Pretty CspSymbMap where
pretty (CspSymbMap s ms) = pretty s <+> case ms of
Just t -> mapsto <+> pretty t
instance Pretty CspSymbItems where
pretty (CspSymbItems k l) = pluralCspSympKind k l <+> ppWithCommas l
instance Pretty CspSymbMapItems where
pretty (CspSymbMapItems k l) = pluralCspSympKind k l <+> ppWithCommas l
parseCspId :: GenParser Char st Id
parseCspId = parseId csp_casl_keywords
cspSortId :: GenParser Char st SORT
cspSortId = sortId csp_casl_keywords
plainColon :: GenParser Char st ()
plainColon = forget $ pToken $ toKey colonS
commType :: GenParser Char st CommType
then return $ CommTypeChan $ TypedChanName (idToSimpleId s) r
else unexpected $ "sort " ++ show s
<|> return (CommTypeSort s)
bracedList :: GenParser Char st [CommType]
bracedList = braces $ commaSep1 commType
commAlpha :: GenParser Char st CommAlpha
commAlpha = fmap
Set.fromList $ single commType <|> bracedList
-- | parsing a possibly qualified identifier
cspSymb :: GenParser Char st CspSymb
t <- fmap CaslType (opOrPredType csp_casl_keywords) <|>
fmap (ProcType . ProcProfile []) commAlpha
return $ CspSymb i $ Just t
ts <- between oParenT cParenT $ commaSep1 cspSortId
return $ CspSymb i $ Just $ ProcType $ ProcProfile ts cs
<|> return (CspSymb i Nothing)
-- | parsing one symbol or a mapping of one to second symbol
cspSymbMap :: GenParser Char st CspSymbMap
cspSymbMap = liftM2 CspSymbMap cspSymb $ optionMaybe
$ pToken (toKey mapsTo) >> cspSymb
-- | parse a kind keyword
cspSymbKind :: GenParser Char st CspSymbKind
fmap (const ChannelKind) (pluralKeyword channelS)
<|> fmap (const ProcessKind) (pToken $ toKey processS)
<|> fmap (CaslKind . fst) symbKind
-- | parse a comma separated list of symbols
cspSymbs :: GenParser Char st [CspSymb]
_ <- commaT `followedWith` parseCspId
{- | Parse a possible kinded list of comma separated CspCASL symbols.
The argument is a list of keywords to avoid as identifiers. -}
cspSymbItems :: GenParser Char st CspSymbItems
cspSymbItems = fmap (CspSymbItems $ CaslKind Implicit) cspSymbs <|> do
fmap (CspSymbItems k) cspSymbs
-- | parse a comma separated list of symbols
cspSymbMaps :: GenParser Char st [CspSymbMap]
_ <- commaT `followedWith` parseCspId
-- | parse a possible kinded list of CspCASL symbol mappings
cspSymbMapItems :: GenParser Char st CspSymbMapItems
cspSymbMapItems = fmap (CspSymbMapItems $ CaslKind Implicit) cspSymbMaps
fmap (CspSymbMapItems k) cspSymbMaps