summaryrefslogtreecommitdiff
path: root/src/GF/Devel/OptimizeGF.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2007-10-10 20:29:10 +0000
committeraarne <aarne@cs.chalmers.se>2007-10-10 20:29:10 +0000
commit697cf5f440a4ad9c1308b4e257347200076a8f9b (patch)
treed63cef3e7b7a53b81e24b6d56903db51043c8051 /src/GF/Devel/OptimizeGF.hs
parent0fdb2dbc48f4dec187168981b04ef20eef5034b9 (diff)
tuning gf optimization
Diffstat (limited to 'src/GF/Devel/OptimizeGF.hs')
-rw-r--r--src/GF/Devel/OptimizeGF.hs28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/GF/Devel/OptimizeGF.hs b/src/GF/Devel/OptimizeGF.hs
index ccf5ffe56..d095d3ae7 100644
--- a/src/GF/Devel/OptimizeGF.hs
+++ b/src/GF/Devel/OptimizeGF.hs
@@ -15,7 +15,8 @@
-- following advice of Josef Svenningsson
-----------------------------------------------------------------------------
-module GF.Devel.OptimizeGF (shareModule,unshareModule) where
+module GF.Devel.OptimizeGF (
+ optModule,unshareModule,unsubexpModule,unoptModule) where
import GF.Grammar.Grammar
import GF.Grammar.Lookup
@@ -30,11 +31,14 @@ import Data.Map (Map)
import qualified Data.Map as Map
import Data.List
-shareModule :: (Ident, SourceModInfo) -> (Ident, SourceModInfo)
-shareModule = subexpModule . processModule optim
+optModule :: (Ident, SourceModInfo) -> (Ident, SourceModInfo)
+optModule = subexpModule . processModule optim
+
+unoptModule :: SourceGrammar -> (Ident, SourceModInfo) -> (Ident, SourceModInfo)
+unoptModule gr = unshareModule gr . unsubexpModule
unshareModule :: SourceGrammar -> (Ident, SourceModInfo) -> (Ident, SourceModInfo)
-unshareModule gr = processModule (const (unoptim gr)) . unsubexpModule
+unshareModule gr = processModule (const (unoptim gr))
processModule ::
(Ident -> Term -> Term) -> (Ident, SourceModInfo) -> (Ident, SourceModInfo)
@@ -107,8 +111,9 @@ replace old new trm = case trm of
values :: Term -> Term
values t = case t of
- T ty [(ps,t)] -> T ty [(ps,values t)] -- don't destroy parametrization
- T (TComp ty) cs -> V ty [values t | (_, t) <- cs]
+ T ty [(ps,t)] -> T ty [(ps,values t)] -- don't destroy parametrization
+ T (TComp ty) cs -> V ty [values t | (_, t) <- cs]
+ T (TTyped ty) cs -> V ty [values t | (_, t) <- cs] ---- why are these left?
_ -> C.composSafeOp values t
@@ -166,7 +171,7 @@ subexpModule (mo,m) = errVal (mo,m) $ case m of
unsubexpModule :: SourceModule -> SourceModule
unsubexpModule mo@(i,m) = case m of
- M.ModMod (M.Module mt@(M.MTConcrete _) st fs me ops js) | hasSub ljs ->
+ M.ModMod (M.Module mt st fs me ops js) | hasSub ljs ->
(i, M.ModMod (M.Module mt st fs me ops
(rebuild (map unparInfo ljs))))
where ljs = tree2list js
@@ -176,10 +181,12 @@ unsubexpModule mo@(i,m) = case m of
hasSub ljs = not $ null [c | (c,ResOper _ _) <- ljs]
unparInfo (c,info) = case info of
CncFun xs (Yes t) m -> [(c, CncFun xs (Yes (unparTerm t)) m)]
- ResOper _ _ -> [] ----
+ ResOper (Yes (EInt 8)) _ -> [] -- subexp-generated opers
+ ResOper pty (Yes t) -> [(c, ResOper pty (Yes (unparTerm t)))]
_ -> [(c,info)]
unparTerm t = case t of
- Q m c -> errVal t $ liftM unparTerm $ lookupResDef gr m c
+ Q m c@(IC ('A':'\'':'\'':_)) -> --- name convention of subexp opers
+ errVal t $ liftM unparTerm $ lookupResDef gr m c
_ -> C.composSafeOp unparTerm t
gr = M.MGrammar [mo]
rebuild = buildTree . concat
@@ -210,7 +217,8 @@ addSubexpConsts mo tree lins = do
list = Map.toList tree
- oper id trm = (ident id, ResOper Nope (Yes trm))
+ oper id trm = (ident id, ResOper (Yes (EInt 8)) (Yes trm))
+ --- impossible type encoding generated opers
getSubtermsMod :: Ident -> [(Ident,Info)] -> TermM (Map Term (Int,Int))
getSubtermsMod mo js = do