diff options
| author | aarne <unknown> | 2005-05-30 20:08:14 +0000 |
|---|---|---|
| committer | aarne <unknown> | 2005-05-30 20:08:14 +0000 |
| commit | 3a3342a0f96ba33d0df745b87f700b9998c86f4f (patch) | |
| tree | 65b80ed0a88f823ed680b76c06ad0c518f94f612 /src/GF/Compile | |
| parent | 5bf9a7fe706e4e2d45f148dddf591c34ed1b72b3 (diff) | |
restricted inheritance almost implemented
Diffstat (limited to 'src/GF/Compile')
| -rw-r--r-- | src/GF/Compile/Compile.hs | 6 | ||||
| -rw-r--r-- | src/GF/Compile/Extend.hs | 18 | ||||
| -rw-r--r-- | src/GF/Compile/GrammarToCanon.hs | 6 | ||||
| -rw-r--r-- | src/GF/Compile/MkResource.hs | 19 | ||||
| -rw-r--r-- | src/GF/Compile/Rebuild.hs | 10 |
5 files changed, 31 insertions, 28 deletions
diff --git a/src/GF/Compile/Compile.hs b/src/GF/Compile/Compile.hs index e2b835273..9ea0fdf91 100644 --- a/src/GF/Compile/Compile.hs +++ b/src/GF/Compile/Compile.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/05/27 11:37:57 $ +-- > CVS $Date: 2005/05/30 21:08:14 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.39 $ +-- > CVS $Revision: 1.40 $ -- -- The top-level compilation chain from source file to gfc\/gfr. ----------------------------------------------------------------------------- @@ -221,7 +221,7 @@ makeSourceModule opts env@(k,gr,can) mo@(i,mi) = case mi of ModMod m -> case mtype m of MTReuse c -> do - sm <- ioeErr $ makeReuse gr i (extends m) c + sm <- ioeErr $ makeReuse gr i (extend m) c let mo2 = (i, ModMod sm) mos = modules gr --- putp " type checking reused" $ ioeErr $ showCheckModule mos mo2 diff --git a/src/GF/Compile/Extend.hs b/src/GF/Compile/Extend.hs index b519bf2fd..ae87b3e71 100644 --- a/src/GF/Compile/Extend.hs +++ b/src/GF/Compile/Extend.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/05/30 18:39:43 $ +-- > CVS $Date: 2005/05/30 21:08:14 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.17 $ +-- > CVS $Revision: 1.18 $ -- -- AR 14\/5\/2003 -- 11\/11 -- @@ -37,10 +37,10 @@ extendModule ms (name,mod) = case mod of ModMod m | mstatus m == MSIncomplete && isModCnc m -> return (name,mod) ModMod m -> do - mod' <- foldM extOne m (extends m) + mod' <- foldM extOne m (extend m) return (name,ModMod mod') where - extOne mod@(Module mt st fs es ops js) n = do + extOne mod@(Module mt st fs es ops js) (n,cond) = do (m0,isCompl) <- do m <- lookupModMod (MGrammar ms) n @@ -51,18 +51,20 @@ extendModule ms (name,mod) = case mod of ---- return (m, if (isCompleteModule m) then True else not (isCompleteModule mod)) -- build extension in a way depending on whether the old module is complete - js1 <- extendMod isCompl n name (jments m0) js + js1 <- extendMod isCompl (n, isInherited cond) name (jments m0) js -- if incomplete, throw away extension information - let me' = if isCompl then es else (filter (/=n) es) + let me' = if isCompl then es else (filter ((/=n) . fst) es) return $ Module mt st fs me' ops js1 -- | When extending a complete module: new information is inserted, -- and the process is interrupted if unification fails. -- If the extended module is incomplete, its judgements are just copied. -extendMod :: Bool -> Ident -> Ident -> BinTree Ident Info -> BinTree Ident Info -> +extendMod :: Bool -> (Ident,Ident -> Bool) -> Ident -> + BinTree Ident Info -> BinTree Ident Info -> Err (BinTree Ident Info) -extendMod isCompl name base old new = foldM try new $ tree2list old where +extendMod isCompl (name,cond) base old new = foldM try new $ tree2list old where + try t i@(c,_) | not (cond c) = return t try t i@(c,_) = errIn ("constant" +++ prt c) $ tryInsert (extendAnyInfo isCompl name base) indirIf t i indirIf = if isCompl then indirInfo name else id diff --git a/src/GF/Compile/GrammarToCanon.hs b/src/GF/Compile/GrammarToCanon.hs index affdffb7e..e69113a21 100644 --- a/src/GF/Compile/GrammarToCanon.hs +++ b/src/GF/Compile/GrammarToCanon.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/05/30 18:39:43 $ +-- > CVS $Date: 2005/05/30 21:08:14 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.19 $ +-- > CVS $Revision: 1.20 $ -- -- Code generator from optimized GF source code to GFC. ----------------------------------------------------------------------------- @@ -78,7 +78,7 @@ redModInfo (c,info) = do where redExtOpen m = do e' <- case extends m of - es -> mapM redIdent es + es -> mapM (liftM inheritAll . redIdent) es os' <- mapM (\o -> case o of OQualif q _ i -> liftM (OSimple q) (redIdent i) _ -> prtBad "cannot translate unqualified open in" c) $ opens m diff --git a/src/GF/Compile/MkResource.hs b/src/GF/Compile/MkResource.hs index 3ba67d49e..10831b5c6 100644 --- a/src/GF/Compile/MkResource.hs +++ b/src/GF/Compile/MkResource.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/05/30 18:39:44 $ +-- > CVS $Date: 2005/05/30 21:08:14 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.13 $ +-- > CVS $Revision: 1.14 $ -- -- Compile a gfc module into a "reuse" gfr resource, interface, or instance. ----------------------------------------------------------------------------- @@ -27,7 +27,7 @@ import Control.Monad -- | extracting resource r from abstract + concrete syntax. -- AR 21\/8\/2002 -- 22\/6\/2003 for GF with modules -makeReuse :: SourceGrammar -> Ident -> [Ident] -> +makeReuse :: SourceGrammar -> Ident -> [(Ident,MInclude Ident)] -> MReuseType Ident -> Err SourceRes makeReuse gr r me mrc = do flags <- return [] --- no flags are passed: they would not make sense @@ -47,7 +47,7 @@ makeReuse gr r me mrc = do ModMod m -> case mtype m of MTAbstract -> liftM ((,) (opens m)) $ mkResDefs True False gr r c me - (extends m) (jments m) emptyBinTree + (extend m) (jments m) emptyBinTree _ -> prtBad "expected abstract to be the type of" c _ -> prtBad "expected abstract to be the type of" c @@ -65,7 +65,7 @@ makeReuse gr r me mrc = do ModMod m' -> return $ jments m' _ -> prtBad "expected abstract to be the type of" a liftM ((,) (opens m)) $ - mkResDefs hasT True gr r a me (extends m) jmsA (jments m) + mkResDefs hasT True gr r a me (extend m) jmsA (jments m) _ -> prtBad "expected concrete to be the type of" c _ -> prtBad "expected concrete to be the type of" c @@ -73,7 +73,8 @@ makeReuse gr r me mrc = do -- | the first Boolean indicates if the type needs be given -- the second Boolean indicates if the definition needs be given mkResDefs :: Bool -> Bool -> - SourceGrammar -> Ident -> Ident -> [Ident] -> [Ident] -> + SourceGrammar -> Ident -> Ident -> + [(Ident,MInclude Ident)] -> [(Ident,MInclude Ident)] -> BinTree Ident Info -> BinTree Ident Info -> Err (BinTree Ident Info) mkResDefs hasT isC gr r a mext maext abs cnc = mapMTree (mkOne a maext) abs where @@ -98,7 +99,7 @@ mkResDefs hasT isC gr r a mext maext abs cnc = mapMTree (mkOne a maext) abs wher AnyInd b n -> do mo <- lookupModMod gr n info' <- lookupInfo mo f - mkOne n (extends mo) (f,info') + mkOne n (extend mo) (f,info') look cnc f = do info <- lookupTree prt f cnc @@ -109,13 +110,13 @@ mkResDefs hasT isC gr r a mext maext abs cnc = mapMTree (mkOne a maext) abs wher AnyInd _ n -> do mo <- lookupModMod gr n t <- look (jments mo) f - redirTyp False n (extends mo) t + redirTyp False n (extend mo) t _ -> prtBad "not enough information to reuse" f -- type constant qualifications changed from abstract to resource redirTyp always a mae ty = case ty of Q _ c | always -> return $ Q r c - Q n c | n == a || [n] == mae -> return $ Q r c ---- FIX for non-singleton exts + Q n c | n == a || [n] == map fst mae -> return $ Q r c ---- FIX for non-singleton exts _ -> composOp (redirTyp always a mae) ty -- | no reuse for functions of HO\/dep types diff --git a/src/GF/Compile/Rebuild.hs b/src/GF/Compile/Rebuild.hs index 2e7bdd65d..fd7d4cd88 100644 --- a/src/GF/Compile/Rebuild.hs +++ b/src/GF/Compile/Rebuild.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/05/30 18:39:44 $ +-- > CVS $Date: 2005/05/30 21:08:14 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.13 $ +-- > CVS $Revision: 1.14 $ -- -- Rebuild a source module from incomplete and its with-instance. ----------------------------------------------------------------------------- @@ -45,7 +45,7 @@ rebuildModule ms mo@(i,mi) = do m1 <- lookupModMod gr i0 testErr (isModRes m1) ("interface expected instead of" +++ prt i0) m' <- do - js' <- extendMod False i0 i (jments m1) (jments m) + js' <- extendMod False (i0,const True) i (jments m1) (jments m) --- to avoid double inclusions, in instance I of I0 = J0 ** ... case extends m of [] -> return $ replaceJudgements m js' @@ -72,8 +72,8 @@ rebuildModule ms mo@(i,mi) = do ++ [oQualif i i | i <- map snd insts] ---- ++ [oSimple i | i <- map snd insts] ---- ---- ++ [oSimple ext] ---- to encode dependence - --- check if me is incomplete - return $ ModMod $ Module mt0 stat' fs me ops1 js + --- check if me is incomplete; --- why inherit all forced by syntax + return $ ModMod $ Module mt0 stat' fs (map inheritAll me) ops1 js ---- (mapTree (qualifInstanceInfo insts) js) -- not needed _ -> return mi |
