summaryrefslogtreecommitdiff
path: root/src/GF/Compile
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2009-11-07 15:30:57 +0000
committerkrasimir <krasimir@chalmers.se>2009-11-07 15:30:57 +0000
commit2a22325678bac22d16ece1c357e9a9858dc66897 (patch)
tree13c3a79ab813a5ca04d15bc74587f51535677d18 /src/GF/Compile
parent7c513609f03c5719e0a15c61b7d44abc8d6b56d6 (diff)
check grammar should process the definitions in dependency order. This also ensures that the list of parameters for some parameter type is complete
Diffstat (limited to 'src/GF/Compile')
-rw-r--r--src/GF/Compile/CheckGrammar.hs33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/GF/Compile/CheckGrammar.hs b/src/GF/Compile/CheckGrammar.hs
index 213eba760..ed9c67927 100644
--- a/src/GF/Compile/CheckGrammar.hs
+++ b/src/GF/Compile/CheckGrammar.hs
@@ -46,15 +46,17 @@ import Text.PrettyPrint
checkModule :: [SourceModule] -> SourceModule -> Check SourceModule
checkModule ms m@(name,mo) = checkIn (text "checking module" <+> ppIdent name) $ do
checkRestrictedInheritance ms m
- checkErr $ topoSortJments m
- js <- case mtype mo of
- MTConcrete a -> do abs <- checkErr $ lookupModule gr a
- checkCompleteGrammar gr (a,abs) m
- _ -> return (jments mo)
- js <- checkMap (checkInfo gr m) js
- return (name, replaceJudgements mo js)
+ m <- case mtype mo of
+ MTConcrete a -> do let gr = MGrammar (m:ms)
+ abs <- checkErr $ lookupModule gr a
+ checkCompleteGrammar gr (a,abs) m
+ _ -> return m
+ infos <- checkErr $ topoSortJments m
+ foldM updateCheckInfo m infos
where
- gr = MGrammar $ (name,mo):ms
+ updateCheckInfo (name,mo) (i,info) = do
+ info <- checkInfo ms (name,mo) i info
+ return (name,updateModule mo i info)
-- check if restricted inheritance modules are still coherent
-- i.e. that the defs of remaining names don't depend on omitted names
@@ -77,7 +79,7 @@ checkRestrictedInheritance mos (name,mo) = do
nest 2 (vcat [ppIdent f <+> text "on" <+> fsep (map ppIdent is) | (f,is) <- cs]))
allDeps = concatMap (allDependencies (const True) . jments . snd) mos
-checkCompleteGrammar :: SourceGrammar -> SourceModule -> SourceModule -> Check (BinTree Ident Info)
+checkCompleteGrammar :: SourceGrammar -> SourceModule -> SourceModule -> Check SourceModule
checkCompleteGrammar gr (am,abs) (cm,cnc) = do
let jsa = jments abs
let jsc = jments cnc
@@ -88,7 +90,7 @@ checkCompleteGrammar gr (am,abs) (cm,cnc) = do
-- check that all abstract constants are in concrete; build default lin and lincats
jsc <- foldM checkAbs jsc (tree2list jsa)
- return jsc
+ return (cm,replaceJudgements cnc jsc)
where
checkAbs js i@(c,info) =
case info of
@@ -150,8 +152,8 @@ checkCompleteGrammar gr (am,abs) (cm,cnc) = do
-- | General Principle: only Just-values are checked.
-- A May-value has always been checked in its origin module.
-checkInfo :: SourceGrammar -> SourceModule -> Ident -> Info -> Check Info
-checkInfo gr (m,mo) c info = do
+checkInfo :: [SourceModule] -> SourceModule -> Ident -> Info -> Check Info
+checkInfo ms (m,mo) c info = do
checkReservedId c
case info of
AbsCat (Just cont) _ -> mkCheck "category" $
@@ -207,13 +209,18 @@ checkInfo gr (m,mo) c info = do
return (ResOverload os [(y,x) | (x,y) <- tysts'])
ResParam (Just pcs) _ -> chIn "parameter type" $ do
- ts <- checkErr $ lookupParamValues gr m c
+ ts <- checkErr $ liftM concat $ mapM mkPar pcs
return (ResParam (Just pcs) (Just ts))
_ -> return info
where
+ gr = MGrammar ((m,mo) : ms)
chIn cat = checkIn (text "Happened in" <+> text cat <+> ppIdent c <+> ppPosition mo c <> colon)
+ mkPar (f,co) = do
+ vs <- liftM combinations $ mapM (\(_,_,ty) -> allParamValues gr ty) co
+ return $ map (mkApp (QC m f)) vs
+
checkUniq xss = case xss of
x:y:xs
| x == y -> checkError $ text "ambiguous for type" <+>