summaryrefslogtreecommitdiff
path: root/src/GF/Compile/CheckGrammar.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2006-01-13 13:47:15 +0000
committeraarne <aarne@cs.chalmers.se>2006-01-13 13:47:15 +0000
commit90c7caa788cff71121bebf54cf21f23318cb46c7 (patch)
treeb40ab160fce650c29c24934dfc3fd12438b61a3c /src/GF/Compile/CheckGrammar.hs
parentacd24331af16964c6f3dad549ce43e44130b1284 (diff)
type checking pattern bindings
Diffstat (limited to 'src/GF/Compile/CheckGrammar.hs')
-rw-r--r--src/GF/Compile/CheckGrammar.hs20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/GF/Compile/CheckGrammar.hs b/src/GF/Compile/CheckGrammar.hs
index c55873409..1daf4fd62 100644
--- a/src/GF/Compile/CheckGrammar.hs
+++ b/src/GF/Compile/CheckGrammar.hs
@@ -697,16 +697,26 @@ pattContext env typ p = case p of
g <- pattContext env typ p
return $ (x,typ):g
- PAlt p q -> do
- g1 <- pattContext env typ p
+ PAlt p' q -> do
+ g1 <- pattContext env typ p'
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
g1 <- pattContext env typ p
g2 <- pattContext env typ q
return $ g1 ++ g2
- PRep p -> pattContext env typeStr p
- PNeg p -> pattContext env typeStr p
+ PRep p' -> do
+ 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!
where