ParseTerm.hs revision ecb2c1b15ed2dbca1cba391a8f4de65c60952d6b
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens ElknerModule : $Header$
228124cdf2560445e7f1b5312476935b51887463Kristina SojakovaDescription : parser for HasCASL kinds, types, terms, patterns and equations
228124cdf2560445e7f1b5312476935b51887463Kristina SojakovaCopyright : (c) Christian Maeder and Uni Bremen 2002-2005
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu ProdescuLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
228124cdf2560445e7f1b5312476935b51887463Kristina SojakovaMaintainer : Christian.Maeder@dfki.de
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina SojakovaStability : provisional
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina SojakovaPortability : portable
b3bacd257ffcdd346b70ab690f03b28ad5f33fdcKristina Sojakovaparser for HasCASL kinds, types, terms, patterns and equations
e7cedce0d43b62593b8d5d552bdc36eb5ba73409Kristina Sojakova-- * key sign tokens
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina Sojakova-- | a colon not followed by a question mark
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina SojakovacolT :: AParser st Token
0737dd44f9a47bb91233ffdb7a03bc657dfc7c5eKristina SojakovacolT = asKey colonS
c35969f341eb137848e9c0874503bed8c419cbd2Kristina Sojakova-- | a colon immediately followed by a question mark
e7cedce0d43b62593b8d5d552bdc36eb5ba73409Kristina SojakovaqColonT :: AParser st Token
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina SojakovaqColonT = asKey colonQuMark
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina Sojakova-- * parser for bracketed lists
0737dd44f9a47bb91233ffdb7a03bc657dfc7c5eKristina Sojakova-- | a generic bracket parser
e7cedce0d43b62593b8d5d552bdc36eb5ba73409Kristina SojakovabracketParser :: AParser st a -> AParser st Token -> AParser st Token
228124cdf2560445e7f1b5312476935b51887463Kristina Sojakova -> AParser st Token -> ([a] -> Range -> b) -> AParser st b
0737dd44f9a47bb91233ffdb7a03bc657dfc7c5eKristina SojakovabracketParser parser op cl sep k = do
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova (ts, ps) <- option ([], []) $ separatedBy parser sep
3c0bf20712a0f21aaedc0a9a9c8376bc1e90e799Kristina Sojakova return $ k ts $ toPos o ps c
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova-- | parser for square brackets
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovamkBrackets :: AParser st a -> ([a] -> Range -> b) -> AParser st b
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovamkBrackets p c = bracketParser p oBracketT cBracketT anComma c
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova-- | parser for braces
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian MaedermkBraces :: AParser st a -> ([a] -> Range -> b) -> AParser st b
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian MaedermkBraces p c = bracketParser p oBraceT cBraceT anComma c
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder-- | parse a simple class name or the type universe as kind
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovaparseClassId :: AParser st Kind
4f3a84cb1b7e55ce38df8f4ac71d06b574b23cb1mscodescuparseClassId = fmap ClassKind classId
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder-- | do 'parseClassId' or a kind in parenthessis
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian MaederparseSimpleKind :: AParser st Kind
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovaparseSimpleKind = parseClassId <|> (oParenT >> kind << cParenT)
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova-- | do 'parseSimpleKind' and check for an optional 'Variance'
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian MaederparseExtKind :: AParser st (Variance, Kind)
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovaparseExtKind = bind (,) variance parseSimpleKind
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder-- | parse a (right associative) function kind for a given argument kind
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian MaederarrowKind :: (Variance, Kind) -> AParser st Kind
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian MaederarrowKind (v, k) = do
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder a <- asKey funS
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova return $ FunKind v k k2 $ tokPos a
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder-- | parse a function kind but reject an extended kind
e7cedce0d43b62593b8d5d552bdc36eb5ba73409Kristina Sojakovakind :: AParser st Kind
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder k1@(v, k) <- parseExtKind
53d7a124a59889b9de5c6ffa856a5e697b043c90Kristina Sojakova arrowKind k1 <|> case v of
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina Sojakova InVar -> return k
ea8e98e298f33f9362293f392c8fb192722b8904Eugen Kuksa _ -> unexpected "variance of kind"
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina Sojakova-- | parse a function kind but accept an extended kind
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina SojakovaextKind :: AParser st (Variance, Kind)
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina Sojakova k1 <- parseExtKind
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder do k <- arrowKind k1
f20841e0b3d9311fd39f2615e43538214f720dd5Kristina Sojakova return (InVar, k)
b3bacd257ffcdd346b70ab690f03b28ad5f33fdcKristina Sojakova-- * type variables
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maedervariance :: AParser st Variance
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina Sojakovavariance = let l = [CoVar, ContraVar] in
e7cedce0d43b62593b8d5d552bdc36eb5ba73409Kristina Sojakova choice (map ( \ v -> asKey (show v) >> return v) l) <|> return InVar
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova-- a (simple) type variable with a 'Variance'
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovaextVar :: AParser st Id -> AParser st (Id, Variance)
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovaextVar vp = bind (,) vp variance
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova-- several 'extVar' with a 'Kind'
2eb5f647dafdbb3a16675dd47256f9641ea234ebKristina SojakovatypeVars :: AParser st [TypeArg]
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova (ts, ps) <- extVar typeVar `separatedBy` anComma
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova typeKind ts ps
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovaallIsInVar :: [(Id, Variance)] -> Bool
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina SojakovaallIsInVar = all ( \ (_, v) -> case v of
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina Sojakova-- 'parseType' a 'Downset' starting with 'lessT'
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina SojakovatypeKind :: [(Id, Variance)] -> [Token]
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina Sojakova -> AParser st [TypeArg]
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina SojakovatypeKind vs ps = do
2eb5f647dafdbb3a16675dd47256f9641ea234ebKristina Sojakova if allIsInVar vs then do
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina Sojakova (v, k) <- extKind
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder return $ makeTypeArgs vs ps v (VarKind k) $ tokPos c
99c3239092cab05eaca2f021e5edef2eab00ba01Christian Maeder return $ makeTypeArgs vs ps InVar (VarKind k) $ tokPos c
ea8e98e298f33f9362293f392c8fb192722b8904Eugen Kuksa t <- parseType
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina Sojakova return $ makeTypeArgs vs ps InVar (Downset t) $ tokPos l
da16798d538221b43043890083523e5a04540f2eChristian Maeder <|> return (makeTypeArgs vs ps InVar MissingKind nullRange)
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina Sojakova-- | add the 'Kind' to all 'extVar' and yield a 'TypeArg'
f20841e0b3d9311fd39f2615e43538214f720dd5Kristina SojakovamakeTypeArgs :: [(Id, Variance)] -> [Token]
f20841e0b3d9311fd39f2615e43538214f720dd5Kristina Sojakova -> Variance -> VarKind -> Range -> [TypeArg]
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina SojakovamakeTypeArgs ts ps vv vk qs =
88e08f20c80fea4b7892bbb5e70c5002f7c1da18Christian Maeder zipWith (mergeVariance Comma vv vk) (init ts)
88e08f20c80fea4b7892bbb5e70c5002f7c1da18Christian Maeder (map tokPos ps)
b9e7c27252b02c6e444fb5555dcf191dfaf3065bKristina Sojakova ++ [mergeVariance Other vv vk (last ts) qs]
53d7a124a59889b9de5c6ffa856a5e697b043c90Kristina Sojakova mergeVariance c v k (t, InVar) q = TypeArg t v k rStar 0 c q
e7cedce0d43b62593b8d5d552bdc36eb5ba73409Kristina Sojakova mergeVariance c _ k (t, v) q = TypeArg t v k rStar 0 c q
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder-- | a single 'TypeArg' (parsed by 'typeVars')
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina SojakovasingleTypeArg :: AParser st TypeArg
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina SojakovasingleTypeArg = do
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder as <- typeVars
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova [a] -> return a
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova _ -> unexpected "list of type arguments"
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder-- | a 'singleTypeArg' put in parentheses
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina SojakovaparenTypeArg :: AParser st (TypeArg, [Token])
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina SojakovaparenTypeArg = do
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder a <- singleTypeArg
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina Sojakova return (a, [o, p])
ea8e98e298f33f9362293f392c8fb192722b8904Eugen Kuksa-- | a 'singleTypeArg' possibly put in parentheses
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina SojakovatypeArg :: AParser st (TypeArg, [Token])
85ae7717e4102529f83a3e487d0a308a56dc8fc7Kristina Sojakova a <- singleTypeArg
e8dd447a2aa5fbac10668749dfe4142c05ec3d7dKristina Sojakova return (a, [])
f5e136145332e265f82919a1c36d5bf35e568251Christian Maeder <|> parenTypeArg
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian Maeder-- | a 'singleTypeArg' put in parentheses as 'TypePattern'
66c6e29ddfa36396c7ebfc02d01d8d7e6c26976cChristian MaedertypePatternArg :: AParser st TypePattern
<|> placeS <?> "id/literal")