MorphParser.hs revision 2cb6df4f21c52732336579a79f7e5d28299b3500
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovimport Common.AnnoParser (commentLine)
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovimport qualified Data.Map as Map
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov-- | plain string parser with skip
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovpkeyword :: String -> CharParser st ()
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovpkeyword s = keywordNotFollowedBy s (alphaNum <|> char '/') >> return ()
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovkeywordNotFollowedBy :: String -> CharParser st Char -> CharParser st String
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovkeywordNotFollowedBy s c = skips $ try $ string s << notFollowedBy c
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovskips :: CharParser st a -> CharParser st a
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovskips = (<< skipMany
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov (forget space <|> forget commentLine <|> nestCommentOut <?> ""))
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovqString :: CharParser st String
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovqString = skips stringLit
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparensP :: CharParser st a -> CharParser st a
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparensP = between (skipChar '(') (skipChar ')')
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovbracesP :: CharParser st a -> CharParser st a
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovbracesP = between (skipChar '{') (skipChar '}')
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovbracketsP :: CharParser st a -> CharParser st a
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovbracketsP = between (skipChar '[') (skipChar ']')
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovcommaP :: CharParser st ()
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovcommaP = skipChar ',' >> return ()
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovsepByComma :: CharParser st a -> CharParser st [a]
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovsepByComma p = sepBy1 p commaP
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovskipChar :: Char -> CharParser st ()
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovskipChar = forget . skips . char
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseWithEq :: String -> CharParser st String
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseWithEq s = do
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov qString >>= return
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseSym :: CharParser st Symbol
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Symbol"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov sb <- parseWithEq "symBase"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov sm <- parseWithEq "symModule"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov sn <- parseWithEq "symName"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return $ Symbol sb sm sn
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovparse1Context :: CharParser st CONTEXT
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovparse1Context = do
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov e <- parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar ')'
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return [(v, e)]
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseExp :: CharParser st EXP
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Type" >> return Type
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Var"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov fmap Var qString
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Const"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov fmap Const parseSym
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Appl"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar '('
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov ex <- parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar ')'
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov exl <- bracketsP $ option [] $ sepByComma parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return $ Appl ex exl
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Func"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov exl <- bracketsP $ option [] $ sepByComma parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar '('
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov ex <- parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar ')'
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return $ Func exl ex
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov ty <- choice $ map (\ ty -> pkeyword ty >> return ty)
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov ["Pi", "Lamb"]
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov c <- bracketsP $ option [] $ sepByComma parse1Context
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar '('
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov e <- parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar ')'
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return $ (case ty of
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov "Lamb" -> Lamb
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov _ -> error $ "Pi or Lamb expected.\n") (concat c) e
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseDef :: CharParser st DEF
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Def"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "getSym"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov sym <- parseSym
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "getType"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov tp <- parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "getValue"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov val <- do pkeyword "Nothing" >> return Nothing
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov <|> do pkeyword "Just"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar '('
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov e <- parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov option () $ skipChar ')'
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return $ Just e
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return $ Def sym tp val
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseSignature :: CharParser st Sign
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseSignature = do
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Sign"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov sb <- parseWithEq "sigBase"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov sm <- parseWithEq "sigModule"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "getDefs"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov sd <- bracketsP $ option [] $ sepByComma parseDef
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return $ Sign sb sm sd
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseMorphType :: CharParser st MorphType
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseMorphType = do
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov choice $ map (\ t -> pkeyword (show t) >> return t)
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov [Definitional, Postulated, Unknown ]
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovparse1Map :: CharParser st (Symbol, EXP)
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatovparse1Map = do
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov s <- parseSym
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov e <- parseExp
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return (s, e)
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseMap :: CharParser st (Map.Map Symbol EXP)
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "fromList"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov fmap Map.fromList $ bracketsP $ option [] $ sepByComma parse1Map
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseMorphism :: CharParser st Morphism
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia IgnatovparseMorphism = do
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov skips $ manyTill anyChar (string "=")
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "Morphism"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov mb <- parseWithEq "morphBase"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov mm <- parseWithEq "morphModule"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov mn <- parseWithEq "morphName"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "source"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov s <- parseSignature
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "target"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov t <- parseSignature
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "morphType"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov mt <- parseMorphType
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov pkeyword "symMap"
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov sm <- parseMap
2cb6df4f21c52732336579a79f7e5d28299b3500Iulia Ignatov return $ Morphism mb mm mn s t mt sm