mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-20 00:22:51 -06:00
type checking pattern bindings
This commit is contained in:
@@ -697,16 +697,26 @@ pattContext env typ p = case p of
|
|||||||
g <- pattContext env typ p
|
g <- pattContext env typ p
|
||||||
return $ (x,typ):g
|
return $ (x,typ):g
|
||||||
|
|
||||||
PAlt p q -> do
|
PAlt p' q -> do
|
||||||
g1 <- pattContext env typ p
|
g1 <- pattContext env typ p'
|
||||||
g2 <- pattContext env typ q
|
g2 <- pattContext env typ q
|
||||||
return $ filter (flip elem g1) g2 -- must be in both
|
let pts = [pt | pt <- g1, notElem pt g2] ++ [pt | pt <- g2, notElem pt g1]
|
||||||
|
checkCond
|
||||||
|
("incompatible bindings of" +++
|
||||||
|
unwords (nub (map (prt . fst) pts))+++
|
||||||
|
"in pattern alterantives" +++ prt p) (null pts)
|
||||||
|
return g1 -- must be g1 == g2
|
||||||
PSeq p q -> do
|
PSeq p q -> do
|
||||||
g1 <- pattContext env typ p
|
g1 <- pattContext env typ p
|
||||||
g2 <- pattContext env typ q
|
g2 <- pattContext env typ q
|
||||||
return $ g1 ++ g2
|
return $ g1 ++ g2
|
||||||
PRep p -> pattContext env typeStr p
|
PRep p' -> do
|
||||||
PNeg p -> pattContext env typeStr p
|
co <- pattContext env typeStr p'
|
||||||
|
if not (null co)
|
||||||
|
then checkWarn ("no variable bound inside * pattern" +++ prt p)
|
||||||
|
>> return []
|
||||||
|
else return []
|
||||||
|
PNeg p' -> pattContext env typ p'
|
||||||
|
|
||||||
_ -> return [] ---- check types!
|
_ -> return [] ---- check types!
|
||||||
where
|
where
|
||||||
|
|||||||
@@ -105,9 +105,10 @@ tryMatch (p,t) = do
|
|||||||
return (concat matches)
|
return (concat matches)
|
||||||
|
|
||||||
(PRep p1, ([],K s, [])) -> checks [
|
(PRep p1, ([],K s, [])) -> checks [
|
||||||
trym (foldr (const (PSeq p1)) (PString "") [1..n]) t' | n <- [0 .. length s]
|
trym (foldr (const (PSeq p1)) (PString "")
|
||||||
]
|
[1..n]) t' | n <- [0 .. length s]
|
||||||
|
] >>
|
||||||
|
return []
|
||||||
_ -> prtBad "no match in case expr for" t
|
_ -> prtBad "no match in case expr for" t
|
||||||
|
|
||||||
isInConstantForm :: Term -> Bool
|
isInConstantForm :: Term -> Bool
|
||||||
|
|||||||
Reference in New Issue
Block a user