Parse_AS_Structured.hs revision 6c244f12ab0dc7ba1baf1413266093886a570e13
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantzModule : $Header$
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantzDescription : parser for CASL (heterogeneous) structured specifications
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantzCopyright : (c) Till Mossakowski, Christian Maeder, Uni Bremen 2002-2005
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantzLicense : GPLv2 or higher, see LICENSE.txt
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantzMaintainer : Christian.Maeder@dfki.de
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4ndStability : provisional
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4ndPortability : non-portable(Grothendieck)
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4ndParser for CASL (heterogeneous) structured specifications
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen Concerning the homogeneous syntax, this follows Sect II:3.1.3
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen of the CASL Reference Manual.
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd ( annoParser2
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , groupSpec
3f08db06526d6901aa08c110b5bc7dde6bc39905nd , logicDescr
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , parseMapping
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , parseCorrespondences
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , translationList
3b3b7fc78d1f5bfc2769903375050048ff41ff26ndimport Logic.Logic (AnyLogic (..), language_name, data_logic, Syntax (..))
0066eddda7203f6345b56f77d146a759298dc635gryzorimport Logic.Comorphism (targetLogic, AnyComorphism (..))
3b3b7fc78d1f5bfc2769903375050048ff41ff26nd ( LogicGraph
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , setCurLogic
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , G_basic_spec (..)
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , G_symb_map_items_list (..)
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , G_symb_items_list (..)
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd , lookupCurrentLogic
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin , lookupComorphism)
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantzhetIRI :: GenParser Char st IRI
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4ndhetIRI = try $ do
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd i <- iriManchester
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin if iriToStringUnsecure i `elem` casl_reserved_words then
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin unexpected $ show i
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin else return i
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin-- | parse annotations and then still call an annotation parser
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4ndannoParser2 :: AParser st (Annoted a) -> AParser st (Annoted a)
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinannoParser2 =
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin liftM2 (\ x (Annoted y pos l r) -> Annoted y pos (x ++ l) r) annos
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd-- * logic and encoding names
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin-- within sublogics we allow some further symbol characters
35ff2d06df95b9593ee312dfff883c76f3b97798noodlsublogicName :: AParser st String
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinsublogicName = many $ satisfy $ \ c -> notElem c ":./\\" && isSignChar c
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf || elem c "_'" || isAlphaNum c
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf{- keep these identical in order to
f8b7daeb0e3f0ac4544fcc665de10c6b69a1ce0dsfdecide after seeing ".", ":" or "->" what was meant -}
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsflogicName :: AParser st Logic_name
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinlogicName = do
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin i <- iriManchester
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin let (ft, rt) = break (== '.') $ abbrevPath i
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantz (e, ms) <- if null rt then return (i, Nothing)
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantz s <- sublogicName -- try more sublogic characters
a7a43799fed7fcdeaa70584dbd3ecd130b25deb3noodl return (i { abbrevPath = ft}, Just . mkSimpleId $ tail rt ++ s)
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin mt <- optionMaybe $ oParenT >> iriCurie << cParenT
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf return $ Logic_name e ms mt
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinlogicDescr :: AParser st LogicDescr
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantzlogicDescr = do
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin n <- logicName
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf option (nameToLogicDescr n) $ do
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic r <- asKey serializationS
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic s <- hetIRI
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic return $ LogicDescr n (Just s) $ tokPos r
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic-- * parse Logic_code
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinparseLogic :: LogicGraph -> AParser st (Logic_code, LogicGraph)
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsfparseLogic lG = do
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin lc <- parseLogicAux
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf case lc of
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic Logic_code _ _ (Just l) _ ->
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic return (lc, setLogicName (nameToLogicDescr l) lG)
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic Logic_code (Just c) _ _ _ -> do
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic nLg <- lookupAndSetComorphismName c lG
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic return (lc, nLg)
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin _ -> return (lc, lG)
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsfparseLogicAux :: AParser st Logic_code
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinparseLogicAux =
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf do l <- asKey logicS
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic do e <- logicName -- try to parse encoding or logic source after "logic"
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic Logic_name f Nothing Nothing ->
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic do c <- colonT
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin parseLogAfterColon (Just f) [l, c]
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin <|> parseOptLogTarget Nothing (Just e) [l]
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf <|> return (Logic_code (Just f) Nothing Nothing
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin $ tokPos l)
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf _ -> parseOptLogTarget Nothing (Just e) [l]
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin f <- asKey funS -- parse at least a logic target after "logic"
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic t <- logicName
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic return $ Logic_code Nothing Nothing (Just t)
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin $ tokPos l `appRange` tokPos f
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf-- parse optional logic source and target after a colon (given an encoding e)
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinparseLogAfterColon :: Maybe IRI -> [Token] -> AParser st Logic_code
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinparseLogAfterColon e l =
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf do s <- logicName
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin parseOptLogTarget e (Just s) l
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin <|> return (Logic_code e (Just s) Nothing $ catRange l)
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf <|> parseOptLogTarget e Nothing l
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic-- parse an optional logic target (given encoding e or source s)
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalicparseOptLogTarget :: Maybe IRI -> Maybe Logic_name -> [Token]
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic -> AParser st Logic_code
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalicparseOptLogTarget e s l =
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantz do f <- asKey funS
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantz let p = catRange $ l ++ [f]
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantz do t <- logicName
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantz return (Logic_code e s (Just t) p)
a7a43799fed7fcdeaa70584dbd3ecd130b25deb3noodl <|> return (Logic_code e s Nothing p)
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinplainComma :: AParser st Token
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsfplainComma = anComma `notFollowedWith` asKey logicS
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin-- * parse G_mapping
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirincallSymParser :: Maybe (AParser st a) -> String -> String ->
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsf AParser st ([a], [Token])
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igaliccallSymParser p name itemType = case p of
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic fail $ "no symbol" ++ itemType ++ " parser for language " ++ name
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic Just pa -> separatedBy pa plainComma
9a58dc6a2b26ec128b1270cf48810e705f1a90dbsfparseItemsMap :: AnyLogic -> AParser st (G_symb_map_items_list, [Token])
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinparseItemsMap (Logic lid) = do
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin (cs, ps) <- callSymParser (parse_symb_map_items lid)
9a367ec3d570bcbaf8923dad66cb3b1532963964trawick (language_name lid) " maps"
9a367ec3d570bcbaf8923dad66cb3b1532963964trawick return (G_symb_map_items_list lid cs, ps)
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinparseMapping :: LogicGraph -> AParser st ([G_mapping], [Token])
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinparseMapping = parseMapOrHide G_logic_translation G_symb_map parseItemsMap
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirinparseMapOrHide :: (Logic_code -> a) -> (t -> a)
8951c7d73bfa2ae5a2c8fe5bd27f3e677be02564noirin -> (AnyLogic -> AParser st (t, [Token])) -> LogicGraph
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantz -> AParser st ([a], [Token])
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantzparseMapOrHide constrLogic constrMap pa lG =
1f53e295ebd19aed1767d12da7abfab9936c148cjerenkrantz do (n, nLg) <- parseLogic lG
1b390add6886fb1c0acdea82be0ef0920f1158casf do c <- anComma
1b390add6886fb1c0acdea82be0ef0920f1158casf (gs, ps) <- parseMapOrHide constrLogic constrMap pa nLg
1b390add6886fb1c0acdea82be0ef0920f1158casf return (constrLogic n : gs, c : ps)
1b390add6886fb1c0acdea82be0ef0920f1158casf <|> return ([constrLogic n], [])
1b390add6886fb1c0acdea82be0ef0920f1158casf l <- lookupCurrentLogic "parseMapOrHide" lG
1b390add6886fb1c0acdea82be0ef0920f1158casf (m, ps) <- pa l
1b390add6886fb1c0acdea82be0ef0920f1158casf do c <- anComma
1b390add6886fb1c0acdea82be0ef0920f1158casf (gs, qs) <- parseMapOrHide constrLogic constrMap pa lG
1b390add6886fb1c0acdea82be0ef0920f1158casf return (constrMap m : gs, ps ++ c : qs)
1b390add6886fb1c0acdea82be0ef0920f1158casf <|> return ([constrMap m], ps)
1b390add6886fb1c0acdea82be0ef0920f1158casf-- * parse G_hiding
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalicparseItemsList :: AnyLogic -> AParser st (G_symb_items_list, [Token])
1b390add6886fb1c0acdea82be0ef0920f1158casfparseItemsList (Logic lid) = do
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic (cs, ps) <- callSymParser (parse_symb_items lid)
f0fa55ff14fa0bf8fd72d989f6625de6dc3260c8igalic (language_name lid) ""
1b390add6886fb1c0acdea82be0ef0920f1158casf return (G_symb_items_list lid cs, ps)
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4ndparseHiding :: LogicGraph -> AParser st ([G_hiding], [Token])
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4ndparseHiding = parseMapOrHide G_logic_projection G_symb_list parseItemsList
3b3b7fc78d1f5bfc2769903375050048ff41ff26nd-- "then" is associative, therefore flatten extensions
7fec19672a491661b2fe4b29f685bc7f4efa64d4ndflatExts :: [Annoted SPEC] -> [Annoted SPEC]
7fec19672a491661b2fe4b29f685bc7f4efa64d4ndflatExts = concatMap $ \ as -> case item as of
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd Extension sps _ -> sps
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd Group sp _ -> case flatExts [sp] of
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd [_] -> [as]
bdd978e5ecd8daa2542d4d4e1988c78a622cd7f4nd sps -> sps