DataP.hs revision 93200332914950da5c053bdbd2a8a1f8df3a26f2
823a5b3f4375f12b6edae4dd5169ee01771baebeJan ZelenyAdaptation and extension of a parser for data definitions given in
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenyappendix of G. Huttons's paper - Monadic Parser Combinators.
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenymodule DataP (Statement(..),Data(..),Type(..),Body(..),
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny Name,Var,Class,Constructor,
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny datadecl,newtypedecl)
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenyimport ParseLib2
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenydata Statement = DataStmt | NewTypeStmt deriving (Eq,Show)
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenydata Data = D { name :: Name, -- type name
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny constraints :: [(Class,Var)],
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny vars :: [Var], -- Parameters
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny body :: [Body],
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny derives :: [Class], -- derived classes
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny statement :: Statement}
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny | TypeName Name
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny deriving (Eq,Show)
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenydata Body = Body { constructor :: Constructor,
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny labels :: [Name],
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny types :: [Type]} deriving (Eq,Show)
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenytype Name = String
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenytype Var = String
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenytype Class = String
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenytype Constructor = String
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny----------------------------------------------------------------------------
1a3e6221b38a7cae27d7e84a30bb8ea3c3900a47Jan ZelenyextContext :: Parser [()]
1a3e6221b38a7cae27d7e84a30bb8ea3c3900a47Jan ZelenyextContext = do
1a3e6221b38a7cae27d7e84a30bb8ea3c3900a47Jan Zeleny symbol "forall"
1a3e6221b38a7cae27d7e84a30bb8ea3c3900a47Jan Zeleny many1 variable
1a3e6221b38a7cae27d7e84a30bb8ea3c3900a47Jan Zeleny constructorP
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny many variable
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenydatadecl :: Parser Data
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zelenydatadecl = do
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny symbol "data"
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny cons <- opt constraint
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny x <- constructorP
1a3e6221b38a7cae27d7e84a30bb8ea3c3900a47Jan Zeleny xs <- many variable
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny opt extContext
b42bb7d9dbf9a4c44a03e7bf1bab471a8a85e858Michal Zidek b <- (infixdecl +++ conrecdecl) `sepby1` symbol "|"
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny d <- opt deriveP
823a5b3f4375f12b6edae4dd5169ee01771baebeJan Zeleny return $ D x cons xs b d DataStmt