ParseTerm.hs revision a4edb47c12ef090dbb8a5eaaed73006ad534e680
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseModule : $Header$
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseCopyright : (c) Christian Maeder and Uni Bremen 2002-2004
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseLicence : similar to LGPL, see HetCATS/LICENCE.txt or LIZENZ.txt
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseMaintainer : hets@tzi.de
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseStability : provisional
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosePortability : portable
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose parser for HasCASL kinds, types, terms, patterns and equations
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- * key sign tokens
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | keywords for the variance of kinds
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseplusT, minusT :: AParser Token
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseplusT = asKey plusS
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseminusT = asKey minusS
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | a keyword string not followed by a question mark
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosenoQuMark :: String -> AParser Token
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosenoQuMark s = try $ asKey s << notFollowedBy (char '?')
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | a colon not followed by a question mark
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosecolT :: AParser Token
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosecolT = noQuMark colonS
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | a colon immediately followed by a question mark
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseqColonT :: AParser Token
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseqColonT = asKey (colonS++quMark)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- * parser for bracketed lists
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | a generic bracket parser
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosebracketParser :: AParser a -> AParser Token -> AParser Token -> AParser Token
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose -> ([a] -> [Pos] -> b) -> AParser b
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosebracketParser parser op cl sep k =
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose (ts, ps) <- option ([], []) (parser `separatedBy` sep)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (k ts (toPos o ps c))
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | parser for square brackets
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosemkBrackets :: AParser a -> ([a] -> [Pos] -> b) -> AParser b
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosemkBrackets p c = bracketParser p oBracketT cBracketT anComma c
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | parser for braces
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosemkBraces :: AParser a -> ([a] -> [Pos] -> b) -> AParser b
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosemkBraces p c = bracketParser p oBraceT cBraceT anComma c
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | parse a simple class name or the type universe as kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseparseClassId :: AParser Kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseparseClassId = fmap (\c -> if showId c "" == "Type"
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose then Universe [posOfId c]
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose else ClassKind c MissingKind) classId
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | do 'parseClassId' or a downset or an intersection kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseparseSimpleKind :: AParser Kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseparseSimpleKind = parseClassId
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do o <- oParenT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose (cs, ps) <- kind `separatedBy` anComma
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose c <- cParenT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (if isSingle cs then head cs else
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose Intersection cs (toPos o ps c))
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do o <- oBraceT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose i <- pToken scanHCWords
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose j <- asKey (tokStr i)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose t <- parseType
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose p <- cBraceT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (Downset (Just i) t MissingKind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose (map tokPos [o,d,j,l,p]))
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | do 'parseSimpleKind' and check for an optional 'Variance'
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseparseExtKind :: AParser Kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseparseExtKind = do k <- parseSimpleKind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do s <- plusT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (ExtKind k CoVar [tokPos s])
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do m <- minusT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (ExtKind k ContraVar [tokPos m])
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose <|> return k
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | parse a (right associative) function kind for a given argument kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosearrowKind :: Kind -> AParser Kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosearrowKind k1 =
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do a <- asKey funS
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (FunKind k1 k2 $ [tokPos a])
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | parse a function kind but reject an extended kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bosekind :: AParser Kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do k1 <- parseExtKind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose arrowKind k1 <|> case k1 of
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ExtKind _ CoVar _ -> unexpected "co-variance of kind"
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ExtKind _ ContraVar _ -> unexpected "contra-variance of kind"
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ExtKind k InVar _ -> return k
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose _ -> return k1
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | parse a function kind but accept an extended kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseextKind :: AParser Kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do k1 <- parseExtKind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose arrowKind k1 <|> return k1
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- * type variables
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- a (simple) type variable with a 'Variance'
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseextTypeVar :: AParser (TypeId, Variance, Pos)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BoseextTypeVar = do t <- typeVar
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do a <- plusT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (t, CoVar, tokPos a)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do a <- minusT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (t, ContraVar, tokPos a)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose <|> return (t, InVar, nullPos)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- several 'extTypeVar' with a 'Kind'
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosetypeVars :: AParser [TypeArg]
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosetypeVars = do (ts, ps) <- extTypeVar `separatedBy` anComma
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do c <- colT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose if let isInVar(_, InVar, _) = True
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose isInVar(_,_,_) = False
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose in all isInVar ts then
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do k <- extKind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (makeTypeArgs ts ps [tokPos c] k)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose else do k <- kind
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return (makeTypeArgs ts ps [tokPos c] k)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose <|> typeDownset ts ps
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose <|> return (makeTypeArgs ts ps [] star)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- 'parseType' a 'Downset' starting with 'lessT'
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosetypeDownset :: [(TypeId, Variance, Pos)] -> [Token] -> AParser [TypeArg]
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosetypeDownset vs ps =
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose do l <- lessT
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose t <- parseType
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose return $ makeTypeArgs vs ps [tokPos l]
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose (Downset Nothing t MissingKind [])
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | add the 'Kind' to all 'extTypeVar' and yield a 'TypeArg'
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosemakeTypeArgs :: [(TypeId, Variance, Pos)] -> [Token]
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose -> [Pos] -> Kind -> [TypeArg]
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosemakeTypeArgs ts ps qs k =
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose zipWith (mergeVariance Comma k) (init ts)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose (map ((:[]). tokPos) ps)
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose ++ [mergeVariance Other k (last ts) qs]
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose where mergeVariance c (ExtKind e InVar _) (t, v, p) q =
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose TypeArg t (ExtKind e v [p]) c q
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose mergeVariance c e (t, _, _) p =
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose TypeArg t e c p
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | a single 'TypeArg' (parsed by 'typeVars')
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosesingleTypeArg :: AParser TypeArg
885386b7e3f1c3e74b354576b98a092b0835d64eSumit BosesingleTypeArg = do as <- typeVars
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose [a] -> return a
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose _ -> unexpected "list of type arguments"
885386b7e3f1c3e74b354576b98a092b0835d64eSumit Bose-- | a 'singleTypArg' put in parentheses
<|> placeS <?> "id/literal" )