summaryrefslogtreecommitdiff
path: root/src/GF/Compile/CheckGrammar.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/GF/Compile/CheckGrammar.hs')
-rw-r--r--src/GF/Compile/CheckGrammar.hs22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/GF/Compile/CheckGrammar.hs b/src/GF/Compile/CheckGrammar.hs
index 3b3e9eaa6..33db87e37 100644
--- a/src/GF/Compile/CheckGrammar.hs
+++ b/src/GF/Compile/CheckGrammar.hs
@@ -512,6 +512,10 @@ inferLType gr trm = case trm of
PString _ -> True
PInt _ -> True
PFloat _ -> True
+ PSeq p q -> isConstPatt p && isConstPatt q
+ PAlt p q -> isConstPatt p && isConstPatt q
+ PRep p -> isConstPatt p
+ PAs _ p -> isConstPatt p
_ -> False
inferPatt p = case p of
@@ -664,7 +668,7 @@ checkLType env trm typ0 = do
pattContext :: LTEnv -> Type -> Patt -> Check Context
pattContext env typ p = case p of
PV x -> return [(x,typ)]
- PP q c ps | q /= cPredef || prt c == "CC" -> do ---- why this /=? AR 6/1/2006
+ PP q c ps | q /= cPredef -> do ---- why this /=? AR 6/1/2006
t <- checkErr $ lookupResType cnc q c
(cont,v) <- checkErr $ typeFormCnc t
checkCond ("wrong number of arguments for constructor in" +++ prt p)
@@ -683,7 +687,21 @@ pattContext env typ p = case p of
checkEqLType env typ t (patt2term p')
pattContext env typ p'
- _ -> return [] ----
+ PAs x p -> do
+ g <- pattContext env typ p
+ return $ (x,typ):g
+
+ PAlt p q -> do
+ g1 <- pattContext env typ p
+ g2 <- pattContext env typ q
+ return $ filter (flip elem g1) g2 -- must be in both
+ PSeq p q -> do
+ g1 <- pattContext env typ p
+ g2 <- pattContext env typ q
+ return $ g1 ++ g2
+ PRep p -> pattContext env typeStr p
+
+ _ -> return [] ---- check types!
where
cnc = env