Parse_AS_Structured.hs revision e3c9174a782e90f965a0b080c22861c3ef5af12d
abd8dd44106c507dd2cb64359b63d7d56fa0a9c8Christian Maeder
abd8dd44106c507dd2cb64359b63d7d56fa0a9c8Christian Maeder{- HetCATS/Syntax/Parse_AS_Structured.hs
09249711700a6acbc40a2e337688b434d7aafa28Christian Maeder $Id$
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder Author: Till Mossakowski, Christian Maeder
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian Maeder Year: 2002/2003
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder
3f69b6948966979163bdfe8331c38833d5d90ecdChristian Maeder Parsing the Structured part of hetrogenous specifications.
abd8dd44106c507dd2cb64359b63d7d56fa0a9c8Christian Maeder http://www.cofi.info/Documents/CASL/Summary/
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder from 25 March 2001
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder C.2.2 Structured Specifications
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder todo:
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder fixing of details concerning annos
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder logic translations and implicit coercions
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder "and" should do union of involved logics
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder therefore, logic should be explicit argument instead of kept in the state
950e053ba55ac9c7d9c26a1ab48bd00202b29511Christian Maeder arch specs
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder-}
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maeder
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maedermodule Syntax.Parse_AS_Structured where
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Logic.Grothendieck
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maederimport Logic.Logic
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maeder
ad270004874ce1d0697fb30d7309f180553bb315Christian Maederimport CASL.Logic_CASL -- we need the default logic
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder
abd8dd44106c507dd2cb64359b63d7d56fa0a9c8Christian Maederimport Syntax.AS_Structured
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Syntax.AS_Library
76647324ed70f33b95a881b536d883daccf9568dChristian Maederimport Common.AS_Annotation
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Common.Anno_Parser
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Common.Id(tokPos)
76647324ed70f33b95a881b536d883daccf9568dChristian Maederimport Common.Keywords
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Common.Lexer
05ae87b9efa19655024b0b6ac344d250b96567cdChristian Maederimport Common.Token
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Common.Lib.Parsec
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Common.Lib.Parsec.Char (digit)
d48085f765fca838c1d972d2123601997174583dChristian Maederimport qualified Common.Lib.Map as Map
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Common.Id
d48085f765fca838c1d972d2123601997174583dChristian Maederimport Data.List
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder
a39a820684c1974350f46593025e0bb279f41bc6Christian Maederimport Data.Maybe(maybeToList)
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder
a39a820684c1974350f46593025e0bb279f41bc6Christian Maederimport Syntax.Print_AS_Structured -- for test purposes
76647324ed70f33b95a881b536d883daccf9568dChristian Maederimport Syntax.Print_HetCASL
d48085f765fca838c1d972d2123601997174583dChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian Maeder------------------------------------------------------------------------
d48085f765fca838c1d972d2123601997174583dChristian Maeder-- annotation adapter
d48085f765fca838c1d972d2123601997174583dChristian Maeder------------------------------------------------------------------------
d48085f765fca838c1d972d2123601997174583dChristian Maeder
05ae87b9efa19655024b0b6ac344d250b96567cdChristian MaederasKey = pToken . toKey
d48085f765fca838c1d972d2123601997174583dChristian Maeder
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder-- skip to leading annotation and read many
a716971174535184da7713ed308423e355a4aa66Christian Maederannos :: GenParser Char st [Annotation]
793945d4ac7c0f22760589c87af8e71427c76118Christian Maederannos = skip >> many (annotationL << skip)
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder
5e5c3fbbf8c22b883d551d83429b9f8d8041f1e0Christian MaederannoParser parser = bind (\x y -> Annoted y [] x []) annos parser
feab655b0275874012c3cf9859064c177860cc70Christian Maeder
f2c2b420e386a90d940c758c631d16f12952d2b7Christian MaederannoParser2 parser = bind (\x (Annoted y pos l r) -> Annoted y pos (x++l) r) annos parser
f2c2b420e386a90d940c758c631d16f12952d2b7Christian Maeder
f2c2b420e386a90d940c758c631d16f12952d2b7Christian MaederemptyAnno :: a -> Annoted a
793945d4ac7c0f22760589c87af8e71427c76118Christian MaederemptyAnno x = Annoted x [] [] []
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder
a716971174535184da7713ed308423e355a4aa66Christian Maeder
a716971174535184da7713ed308423e355a4aa66Christian Maeder------------------------------------------------------------------------
5e5c3fbbf8c22b883d551d83429b9f8d8041f1e0Christian Maeder-- logic and encoding names
a716971174535184da7713ed308423e355a4aa66Christian Maeder------------------------------------------------------------------------
a716971174535184da7713ed308423e355a4aa66Christian Maeder
a716971174535184da7713ed308423e355a4aa66Christian Maeder-- exclude colon (because encoding must be recognized)
a716971174535184da7713ed308423e355a4aa66Christian Maeder-- ecclude dot to recognize optional sublogic name
5e5c3fbbf8c22b883d551d83429b9f8d8041f1e0Christian Maeder
793945d4ac7c0f22760589c87af8e71427c76118Christian MaederotherChars = "_`"
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian Maeder
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian Maeder-- better list what is allowed rather than exclude what is forbidden
9884c7cef7e5a2c8595d5ef8c7d32b9b44a3fad8Christian Maeder-- white spaces und non-printables should be not allowed!
9884c7cef7e5a2c8595d5ef8c7d32b9b44a3fad8Christian MaederencodingName = pToken(reserved (funS:casl_reserved_words) (many1
fd2dcd5c071e938c07338fd3a32296819b8a2333Christian Maeder (oneOf (otherChars ++ (signChars \\ ":."))
fd2dcd5c071e938c07338fd3a32296819b8a2333Christian Maeder <|> scanLPD)))
fd2dcd5c071e938c07338fd3a32296819b8a2333Christian Maeder
fd2dcd5c071e938c07338fd3a32296819b8a2333Christian Maeder-- keep these identical in order to
9884c7cef7e5a2c8595d5ef8c7d32b9b44a3fad8Christian Maeder-- decide after seeing ".", ":" or "->" what was meant
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian MaederlogicName = do e <- encodingName
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian Maeder do string dotS
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian Maeder s <- encodingName
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian Maeder return (Logic_name e (Just s))
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian Maeder <|> return (Logic_name e Nothing)
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian Maeder
ee6c748be810b24e3c70ffd74f291c7394e389f5Christian Maeder------------------------------------------------------------------------
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder-- parse Logic_code
d48085f765fca838c1d972d2123601997174583dChristian Maeder------------------------------------------------------------------------
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder
793945d4ac7c0f22760589c87af8e71427c76118Christian MaederparseLogic :: GenParser Char AnyLogic Logic_code
793945d4ac7c0f22760589c87af8e71427c76118Christian MaederparseLogic =
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder do l <- asKey logicS
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder do e <- logicName -- try to parse encoding or logic source after "logic"
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder case e of
793945d4ac7c0f22760589c87af8e71427c76118Christian Maeder Logic_name _ (Just _) -> parseOptLogTarget Nothing (Just e) [l]
a716971174535184da7713ed308423e355a4aa66Christian Maeder Logic_name f Nothing ->
a716971174535184da7713ed308423e355a4aa66Christian Maeder do c <- asKey colonS
a716971174535184da7713ed308423e355a4aa66Christian Maeder parseLogAfterColon (Just f) [l,c]
67a14e04c885a87e4273a300eef60e680531088cChristian Maeder <|> parseOptLogTarget Nothing (Just e) [l]
67a14e04c885a87e4273a300eef60e680531088cChristian Maeder <|> do f <- asKey funS -- parse at least a logic target after "logic"
67a14e04c885a87e4273a300eef60e680531088cChristian Maeder t <- logicName
d48085f765fca838c1d972d2123601997174583dChristian Maeder return (Logic_code Nothing Nothing (Just t) (map tokPos [l,f]))
d48085f765fca838c1d972d2123601997174583dChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian Maeder-- parse optional logic source and target after a colon (given an encoding e)
d48085f765fca838c1d972d2123601997174583dChristian MaederparseLogAfterColon e l =
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder do s <- logicName
d48085f765fca838c1d972d2123601997174583dChristian Maeder parseOptLogTarget e (Just s) l
d48085f765fca838c1d972d2123601997174583dChristian Maeder <|> return (Logic_code e (Just s) Nothing (map tokPos l))
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder <|> parseOptLogTarget e Nothing l
d48085f765fca838c1d972d2123601997174583dChristian Maeder <|> return (Logic_code e Nothing Nothing (map tokPos l))
d48085f765fca838c1d972d2123601997174583dChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian Maeder-- parse an optional logic target (given encoding e or source s)
76647324ed70f33b95a881b536d883daccf9568dChristian MaederparseOptLogTarget e s l =
d48085f765fca838c1d972d2123601997174583dChristian Maeder do f <- asKey funS
d48085f765fca838c1d972d2123601997174583dChristian Maeder do t <- logicName
d48085f765fca838c1d972d2123601997174583dChristian Maeder return (Logic_code e s (Just t) (map tokPos (l++[f])))
d48085f765fca838c1d972d2123601997174583dChristian Maeder <|> return (Logic_code e s Nothing (map tokPos (l++[f])))
d48085f765fca838c1d972d2123601997174583dChristian Maeder
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder------------------------------------------------------------------------
d48085f765fca838c1d972d2123601997174583dChristian Maeder-- for parsing "," not followed by "logic" within G_mapping
d48085f765fca838c1d972d2123601997174583dChristian Maeder------------------------------------------------------------------------
d48085f765fca838c1d972d2123601997174583dChristian Maeder-- ParsecCombinator.notFollowedBy only allows to check for a single "tok"
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder-- thus a single Char.
d48085f765fca838c1d972d2123601997174583dChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian MaedernotFollowedWith :: GenParser tok st a -> GenParser tok st b
d48085f765fca838c1d972d2123601997174583dChristian Maeder -> GenParser tok st a
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maederp1 `notFollowedWith` p2 = try ((p1 >> p2 >> pzero) <|> p1)
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian MaederplainComma = commaT `notFollowedWith` asKey logicS
d48085f765fca838c1d972d2123601997174583dChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian Maeder-- rearrange list to keep current logic as first element
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder-- does not consume anything! (may only fail)
d48085f765fca838c1d972d2123601997174583dChristian Maeder{-switchLogic :: Logic_code -> LogicGraph -> GenParser Char st LogicGraph
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian MaederswitchLogic n l@(Logic i : _) =
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder let s = case n of
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder Logic_code _ _ (Just (Logic_name t _)) _ -> tokStr t
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder _ -> language_name i
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder (f, r) = partition (\ (Logic x) -> language_name x == s) l
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder in if null f then fail ("unknown language " ++ s)
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder else return (f++r)
d48085f765fca838c1d972d2123601997174583dChristian Maeder-}
d48085f765fca838c1d972d2123601997174583dChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian Maeder------------------------------------------------------------------------
d48085f765fca838c1d972d2123601997174583dChristian Maeder-- parse G_mapping (if you modify this, do so for G_hiding, too!)
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder------------------------------------------------------------------------
d48085f765fca838c1d972d2123601997174583dChristian Maeder
3eb7ebab2dd79ac5277f087b18e8f05b9e9f0f9bChristian MaederparseItemsMap :: GenParser Char AnyLogic (G_symb_map_items_list, [Token])
3eb7ebab2dd79ac5277f087b18e8f05b9e9f0f9bChristian MaederparseItemsMap =
3eb7ebab2dd79ac5277f087b18e8f05b9e9f0f9bChristian Maeder do Logic lid <- getState
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder (cs, ps) <- callParser (parse_symb_map_items lid) (language_name lid) "symbol maps"
d976ba42e9d48c289f9c73147669c7e57b7aa98eChristian Maeder `separatedBy` commaT
3eb7ebab2dd79ac5277f087b18e8f05b9e9f0f9bChristian Maeder -- ??? should be plainComma, but does not work for reveal s,t!
3eb7ebab2dd79ac5277f087b18e8f05b9e9f0f9bChristian Maeder return (G_symb_map_items_list lid cs, ps)
3eb7ebab2dd79ac5277f087b18e8f05b9e9f0f9bChristian Maeder
3eb7ebab2dd79ac5277f087b18e8f05b9e9f0f9bChristian Maeder
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederparseMapping :: LogicGraph -> GenParser Char AnyLogic ([G_mapping], [Token])
d976ba42e9d48c289f9c73147669c7e57b7aa98eChristian MaederparseMapping l =
6b1153c560b677f9f5da2a60ee8a10de75ff90c5Christian Maeder do n <- parseLogic
6b1153c560b677f9f5da2a60ee8a10de75ff90c5Christian Maeder do c <- commaT
d976ba42e9d48c289f9c73147669c7e57b7aa98eChristian Maeder (gs, ps) <- parseMapping l
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return (G_logic_translation n : gs, c:ps)
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder <|> return ([G_logic_translation n], [])
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder <|> do (m, ps) <- parseItemsMap
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder do c <- commaT
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder (gs, qs) <- parseMapping l
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder return (G_symb_map m : gs, ps ++ c : qs)
9a44a07ffc79da9852b6319bd6d9df81efe99809Christian Maeder <|> return ([G_symb_map m], ps)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder------------------------------------------------------------------------
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder-- parse G_hiding (copied from above, but code sharing would be better!)
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder------------------------------------------------------------------------
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder
a39a820684c1974350f46593025e0bb279f41bc6Christian MaederparseItemsList :: LogicGraph -> GenParser Char AnyLogic (G_symb_items_list, [Token])
a39a820684c1974350f46593025e0bb279f41bc6Christian MaederparseItemsList l =
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder do Logic lid <- getState
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder (cs, ps) <- callParser (parse_symb_items lid) (language_name lid) "symbols"
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder `separatedBy` plainComma
d48085f765fca838c1d972d2123601997174583dChristian Maeder return (G_symb_items_list lid cs, [])
d48085f765fca838c1d972d2123601997174583dChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian Maeder
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian MaederparseHiding :: LogicGraph -> GenParser Char AnyLogic ([G_hiding], [Token])
e47d29b522739fbf08aac80c6faa447dde113fbcChristian MaederparseHiding l =
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder do n <- parseLogic
d48085f765fca838c1d972d2123601997174583dChristian Maeder do c <- commaT
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder (gs, ps) <- parseHiding l
d48085f765fca838c1d972d2123601997174583dChristian Maeder return (G_logic_projection n : gs, c:ps)
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder <|> return ([G_logic_projection n], [])
d48085f765fca838c1d972d2123601997174583dChristian Maeder <|> do (m, ps) <- parseItemsList l
d48085f765fca838c1d972d2123601997174583dChristian Maeder do c <- commaT
d48085f765fca838c1d972d2123601997174583dChristian Maeder (gs, qs) <- parseHiding l
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder return (G_symb_list m : gs, ps ++ c : qs)
d48085f765fca838c1d972d2123601997174583dChristian Maeder <|> return ([G_symb_list m], ps)
d48085f765fca838c1d972d2123601997174583dChristian Maeder
d48085f765fca838c1d972d2123601997174583dChristian MaederparseRevealing :: LogicGraph -> GenParser Char AnyLogic (G_symb_map_items_list, [Token])
d976ba42e9d48c289f9c73147669c7e57b7aa98eChristian MaederparseRevealing l = undefined
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder------------------------------------------------------------------------
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder-- specs
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder------------------------------------------------------------------------
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder
a39a820684c1974350f46593025e0bb279f41bc6Christian Maederspec :: LogicGraph -> GenParser Char AnyLogic (Annoted SPEC)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maederspec l = do (sps,ps) <- annoParser2 (specA l) `separatedBy` (asKey thenS)
d48085f765fca838c1d972d2123601997174583dChristian Maeder return (case sps of
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder [sp] -> sp
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder otherwise -> emptyAnno (Extension sps (map tokPos ps)))
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian MaederspecA :: LogicGraph -> GenParser Char AnyLogic (Annoted SPEC)
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian MaederspecA l = do (sps,ps) <- annoParser (specB l) `separatedBy` (asKey andS)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return (case sps of
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder [sp] -> sp
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder otherwise -> emptyAnno (Union sps (map tokPos ps)))
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederspecB :: LogicGraph -> GenParser Char AnyLogic SPEC
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederspecB l = do p1 <- asKey localS
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder sp1 <- aSpec l
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder p2 <- asKey withinS
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder sp2 <- annoParser (specB l)
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder return (Local_spec sp1 sp2 (map tokPos [p1,p2]))
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder <|> do sp <- specC l
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder return (item sp) -- ??? what to do with anno?
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder
c9fd6322389afc35c1803a0614f094298bc7cba3Christian MaederspecC :: LogicGraph -> GenParser Char AnyLogic (Annoted SPEC)
a39a820684c1974350f46593025e0bb279f41bc6Christian MaederspecC l = do p1 <- asKey "data"
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder Logic lid <- getState
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder case data_logic lid of
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder Nothing -> fail ("No data logic for " ++ language_name lid)
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder Just (Logic dlid) -> do
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder setState (Logic dlid)
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder sp1 <- groupSpec l
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder setState (Logic lid)
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder sp2 <- specD l
c9fd6322389afc35c1803a0614f094298bc7cba3Christian Maeder return (emptyAnno (Data (Logic dlid)
c9fd6322389afc35c1803a0614f094298bc7cba3Christian Maeder (emptyAnno sp1)
c9fd6322389afc35c1803a0614f094298bc7cba3Christian Maeder (emptyAnno sp2)
c9fd6322389afc35c1803a0614f094298bc7cba3Christian Maeder [tokPos p1]))
3eb7ebab2dd79ac5277f087b18e8f05b9e9f0f9bChristian Maeder <|> do sp <- annoParser (specD l)
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder translation_list l sp
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maedertranslation_list l sp =
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder do sp' <- translation l sp
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder translation_list l sp'
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder <|> return sp
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maedertranslation l sp =
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder do p <- asKey withS
98c47b3c137bdb20c53b6c1d346c0fb48b48d673Christian Maeder (m, ps) <- parseMapping l
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder return (emptyAnno (Translation sp (Renaming m (map tokPos (p:ps)))))
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder <|> do p <- asKey hideS
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder (m, ps) <- parseHiding l
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder return (emptyAnno (Reduction sp (Hidden m (map tokPos (p:ps)))))
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder <|> do p <- asKey revealS
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder (m, ps) <- parseItemsMap
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder return (emptyAnno (Reduction sp (Revealed m (map tokPos (p:ps)))))
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder
a39a820684c1974350f46593025e0bb279f41bc6Christian MaederspecD :: LogicGraph -> GenParser Char AnyLogic SPEC
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder -- do some lookahead for free spec, to avoid clash with free type
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederspecD l = do (p,sp) <- try (do p <- asKey freeS
a39a820684c1974350f46593025e0bb279f41bc6Christian Maeder sp <- groupSpec l
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return (p,sp))
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return (Free_spec (emptyAnno sp) [tokPos p])
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder <|> do (p,sp) <- try (do p <- asKey cofreeS
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder sp <- groupSpec l
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return (p,sp))
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder return (Cofree_spec (emptyAnno sp) [tokPos p])
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder <|> do p <- asKey closedS
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder sp <- groupSpec l
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder return (Closed_spec (emptyAnno sp) [tokPos p])
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder <|> specE l
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder
17889a13fbcd155040fa0323ffe82393d53051fcChristian MaederspecE :: LogicGraph -> GenParser Char AnyLogic SPEC
17889a13fbcd155040fa0323ffe82393d53051fcChristian MaederspecE l = do lookAhead (try (oBraceT >> cBraceT)) -- avoid overlap with group spec
17889a13fbcd155040fa0323ffe82393d53051fcChristian Maeder basicSpec l
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder <|> do lookAhead (oBraceT <|> ((simpleId << annos)
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder `followedWith`
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder (asKey withS <|> asKey hideS
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder <|> asKey revealS <|> asKey andS
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder <|> asKey thenS <|> cBraceT
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder <|> asKey fitS
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder <|> asKey withinS <|> asKey endS
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder <|> oBracketT <|> cBracketT
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder <|> (eof >> return (Token "" nullPos)))
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder ))
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder groupSpec l
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder <|> logicSpec l
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder <|> basicSpec l
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maeder
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaedercallParser p name itemType = do
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder s <- getInput
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder pos <- getPosition
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder (x,rest,pos') <- case p of
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder Nothing -> fail ("no "++itemType++" parser for language "
19f104861f1832b452c9f98e59880d05e865d9bdChristian Maeder ++ name)
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder Just pa -> return (pa pos s)
19f104861f1832b452c9f98e59880d05e865d9bdChristian Maeder setInput rest
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder setPosition pos'
19f104861f1832b452c9f98e59880d05e865d9bdChristian Maeder return x
19f104861f1832b452c9f98e59880d05e865d9bdChristian Maeder
19f104861f1832b452c9f98e59880d05e865d9bdChristian Maeder
19f104861f1832b452c9f98e59880d05e865d9bdChristian MaederbasicSpec :: LogicGraph -> GenParser Char AnyLogic SPEC
19f104861f1832b452c9f98e59880d05e865d9bdChristian MaederbasicSpec l = do Logic lid <- getState
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder bspec <- callParser (parse_basic_spec lid) (language_name lid)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder "basic specification"
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder return (Basic_spec (G_basic_spec lid bspec))
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian MaederlogicSpec :: LogicGraph -> GenParser Char AnyLogic SPEC
62ecb1e7f8fd9573eea8369657de12c7bf9f4f25Christian MaederlogicSpec l = do
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder s1 <- asKey logicS
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder log <- logicName
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder let Logic_name t _ = log
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder s2 <- asKey ":"
adfdcfa67b7f12df6df7292e238c3f9a4b637980Christian Maeder oldlog <- getState
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder let newlog = lookupLogicName log l
62ecb1e7f8fd9573eea8369657de12c7bf9f4f25Christian Maeder logtrans = coercelog newlog oldlog
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder setState newlog
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder sp <- annoParser (specE l)
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst Schulz setState oldlog
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst Schulz let sp1 = Qualified_spec log sp (map tokPos [s1,t,s2])
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst Schulz return (logtrans sp1)
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst Schulz
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst SchulzlookupLogicName :: Logic_name -> LogicGraph -> AnyLogic
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst SchulzlookupLogicName (Logic_name log sublog) lg =
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst Schulz lookupLogic "Parser: " (tokStr log) lg
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst Schulz
70a7281955f0c5e8ab0181166731a5c801ed6cc8Ewaryst Schulz{- a code snippit to lookup the sublogic:
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder case sublog of
d1012ae182d765c4e6986029d210b9e7b48de205Christian Maeder Nothing -> Logic lid
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder Just s ->
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder case find (\sub -> tokStr s `elem` sublogic_names lid sub)
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder (all_sublogics lid) of
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder Nothing -> error ("sublogic "++tokStr s++
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder " in logic "++tokStr log++" unknown")
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder Just sub -> Logic lid -- ??? can we throw away sublogic?
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder-}
09249711700a6acbc40a2e337688b434d7aafa28Christian Maedercoercelog (Logic newlid) (Logic oldlid) =
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder if newlang == oldlang then id
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder else error ("Cannot coerce from "++newlang++" to "++oldlang)
fc8c6570c7b4ee13f375eb607bed2290438573bfChristian Maeder where newlang = language_name newlid
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder oldlang = language_name oldlid
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder -- \sp -> Translation (emptyAnno sp) (Renaming [G_logic_translation (Logic_code...)] [])
adfdcfa67b7f12df6df7292e238c3f9a4b637980Christian Maeder
715ffaf874309df081d1e1cd8e05073fc1227729Christian MaederaSpec l = annoParser2 (spec l)
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder
715ffaf874309df081d1e1cd8e05073fc1227729Christian MaedergroupSpec l = do b <- oBraceT
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski a <- aSpec l
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder c <- cBraceT
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder return (Group a (map tokPos [b, c]))
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder <|>
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder do n <- simpleId
e1839fb37a3a2ccd457464cb0dcc5efd466dbe22Christian Maeder (f,ps) <- fitArgs l
e1839fb37a3a2ccd457464cb0dcc5efd466dbe22Christian Maeder return (Spec_inst n f ps)
e1839fb37a3a2ccd457464cb0dcc5efd466dbe22Christian Maeder
76647324ed70f33b95a881b536d883daccf9568dChristian MaederfitArgs :: LogicGraph -> GenParser Char AnyLogic ([Annoted FIT_ARG],[Pos])
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian MaederfitArgs l = do fas <- many (fitArg l)
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder let (fas1,ps) = unzip fas
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder return (fas1,concat ps)
8134af4b37c4ad27e30d57b6fbfefd0f91ee6d3cChristian Maeder
8134af4b37c4ad27e30d57b6fbfefd0f91ee6d3cChristian MaederfitArg :: LogicGraph -> GenParser Char AnyLogic (Annoted FIT_ARG,[Pos])
8134af4b37c4ad27e30d57b6fbfefd0f91ee6d3cChristian MaederfitArg l = do b <- oBracketT
8134af4b37c4ad27e30d57b6fbfefd0f91ee6d3cChristian Maeder fa <- annoParser (fittingArg l)
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder c <- cBracketT
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder return (fa,[tokPos b,tokPos c])
e1839fb37a3a2ccd457464cb0dcc5efd466dbe22Christian Maeder
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian MaederfittingArg :: LogicGraph -> GenParser Char AnyLogic FIT_ARG
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian MaederfittingArg l = do (an,s) <- try (do an <- annos
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder s <- asKey viewS
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder return (an,s))
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder vn <- simpleId
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder (fa,ps) <- fitArgs l
7de39d39bc1700cc8a9bb9df90b920aad9e18d4aChristian Maeder return (Fit_view vn fa (tokPos s:ps) an)
94b34b35075c9115a22b512fd4ec3fb290f13d59Christian Maeder <|>
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maeder do sp <- aSpec l
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder Logic lid <- getState
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder (symbit,ps) <- option (G_symb_map_items_list lid [],[])
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder (do s <- asKey fitS
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder (m, ps) <- parseItemsMap
61e38a4f194d3adc66646326c938eb9263a2f39bChristian Maeder return (m,[tokPos s]))
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder return (Fit_spec sp symbit ps)
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder
76647324ed70f33b95a881b536d883daccf9568dChristian MaederoptEnd = option Nothing (fmap Just (asKey endS))
61e38a4f194d3adc66646326c938eb9263a2f39bChristian Maeder
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maedergenerics l = do
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder (pa,ps1) <- params l
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder (imp,ps2) <- option ([],[]) (imports l)
d5c415f6373274fed04d83b9322891f3b82e9c26Christian Maeder return (Genericity (Params pa) (Imported imp) (ps1++ps2))
d5c415f6373274fed04d83b9322891f3b82e9c26Christian Maeder
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maederparams :: LogicGraph -> GenParser Char AnyLogic ([Annoted SPEC],[Pos])
5b1f1d57c75562a7af79e8256f4afa07febe921bChristian Maederparams l = do pas <- many (param l)
10b02b2343246df6773585636fe3ddbefa3b6a1bChristian Maeder let (pas1,ps) = unzip pas
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder return (pas1,concat ps)
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maederparam :: LogicGraph -> GenParser Char AnyLogic (Annoted SPEC,[Pos])
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maederparam l = do b <- oBracketT
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder pa <- aSpec l
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder c <- cBracketT
9cb4aa4ea6685489a38f9b609f5dbe5d37f25bc7Christian Maeder return (pa,[tokPos b,tokPos c])
4c3e4edfc4b76a19a0025a8c8aae533ed127f71fChristian Maeder
6b1153c560b677f9f5da2a60ee8a10de75ff90c5Christian Maederimports l = do s <- asKey givenS
6b1153c560b677f9f5da2a60ee8a10de75ff90c5Christian Maeder (sps,ps) <- annoParser (groupSpec l) `separatedBy` commaT
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder return (sps,map tokPos (s:ps))
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder
717686b54b9650402e2ebfbaadf433eab8ba5171Christian MaederlibItem l = -- spec defn
81946e2b3f6dde6167f48769bd02c7a634736856Christian Maeder do s <- asKey specS
5e26bfc8d7b18cf3a3fa7b919b4450fb669f37a5Christian Maeder n <- simpleId
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder g <- generics l
717686b54b9650402e2ebfbaadf433eab8ba5171Christian Maeder e <- asKey equalS
72b9099aeec0762bae4546db3bc4b48721027bf4Christian Maeder a <- aSpec l
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder q <- optEnd
9348e8460498ddfcd9da11cd8b5794c06023e004Christian Maeder return (Syntax.AS_Library.Spec_defn n g a
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder (map tokPos ([s, e] ++ maybeToList q)))
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder <|> -- view defn
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder do s1 <- asKey viewS
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder vn <- simpleId
72909c6c1cfe9702f5910d0a135c8b55729c7917Christian Maeder g <- generics l
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder s2 <- asKey ":"
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder vt <- viewType l
e1839fb37a3a2ccd457464cb0dcc5efd466dbe22Christian Maeder (symbMap,ps) <- option ([],[])
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder (do s <- asKey equalS
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder (m, ps) <- parseMapping l
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder return (m,[s]))
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder q <- optEnd
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder return (Syntax.AS_Library.View_defn vn g vt symbMap
0a39036fa485579a7b7c81cdd44a412392571927Christian Maeder (map tokPos ([s1,s2] ++ ps ++ maybeToList q)))
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder <|> -- download
5a13581acc5a76d392c1dec01657bb3efd4dcf2dChristian Maeder do s1 <- asKey fromS
76647324ed70f33b95a881b536d883daccf9568dChristian Maeder ln <- libName
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maeder s2 <- asKey getS
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maeder (il,ps) <- itemNameOrMap `separatedBy` commaT
q <- optEnd
return (Download_items ln il
(map tokPos ([s1,s2]++ps++ maybeToList q)))
<|> -- logic
do s1 <- asKey logicS
log <- logicName
let Logic_name t _ = log
setState (lookupLogicName log l)
return (Logic_decl log (map tokPos [s1,t]))
viewType l = do sp1 <- annoParser (groupSpec l)
s <- asKey toS
sp2 <- annoParser (groupSpec l)
return (View_type sp1 sp2 [tokPos s])
libName = do libid <- libId
v <- option Nothing (fmap Just version)
return (case v of
Nothing -> Lib_id libid
Just v1 -> Lib_version libid v1)
libId = do pos <- getPosition
path <- scanAnyWords `sepBy1` (string "/")
skip
return (Indirect_link (concat (intersperse "/" path)) [pos])
-- ??? URL need to be added
version = do s <- asKey versionS
pos <- getPosition
n <- many1 digit `sepBy1` (string ".")
skip
return (Version_number n ([tokPos s, pos]))
itemNameOrMap = do i1 <- simpleId
i' <- option Nothing (do
s <- asKey "|->"
i <- simpleId
return (Just (i,s)))
return (case i' of
Nothing -> Item_name i1
Just (i2,s) -> Item_name_map i1 i2 [tokPos s])
library l = do skip
s1 <- asKey libraryS
ln <- libName
an <- annos
ls <- many (annoParser (libItem l))
eof
return (Lib_defn ln ls [tokPos s1] an)
-------------------------------------------------------------
-- Testing
-------------------------------------------------------------
mylogicGraph = (Map.fromList [(language_name CASL,Logic CASL)],
Map.fromList [])
parseSPEC fname =
do input <- readFile fname
case runParser (do x <- spec mylogicGraph
s1<-getInput
return (x,s1))
(Logic CASL) fname input of
Left err -> error (show err)
Right x -> return x
parseLib fname =
do input <- readFile fname
case runParser (do x <- library mylogicGraph
s1<-getInput
return (x,s1))
(Logic CASL) fname input of
Left err -> error (show err)
Right x -> return x
test fname = do
(x,errs) <- parseLib fname
putStrLn (show (printText0_eGA x))
if errs == "" then return ()
else putStrLn ("\nUnread input:\n"++take 20 errs++" ...")