summaryrefslogtreecommitdiff
path: root/src/GF/Canon/MkGFC.hs
diff options
context:
space:
mode:
authoraarne <unknown>2003-09-22 13:16:55 +0000
committeraarne <unknown>2003-09-22 13:16:55 +0000
commitb1402e8bd6a68a891b00a214d6cf184d66defe19 (patch)
tree90372ac4e53dce91cf949dbf8e93be06f1d9e8bd /src/GF/Canon/MkGFC.hs
Founding the newly structured GF2.0 cvs archive.
Diffstat (limited to 'src/GF/Canon/MkGFC.hs')
-rw-r--r--src/GF/Canon/MkGFC.hs121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/GF/Canon/MkGFC.hs b/src/GF/Canon/MkGFC.hs
new file mode 100644
index 000000000..d7641ca21
--- /dev/null
+++ b/src/GF/Canon/MkGFC.hs
@@ -0,0 +1,121 @@
+module MkGFC where
+
+import GFC
+import AbsGFC
+import qualified Abstract as A
+import PrGrammar
+
+import Ident
+import Operations
+import qualified Modules as M
+
+prCanonModInfo :: CanonModule -> String
+prCanonModInfo = prt . info2mod
+
+canon2grammar :: Canon -> CanonGrammar
+canon2grammar (Gr modules) = M.MGrammar $ map mod2info modules where
+ mod2info m = case m of
+ Mod mt e os flags defs ->
+ let defs' = buildTree $ map def2info defs
+ (a,mt') = case mt of
+ MTAbs a -> (a,M.MTAbstract)
+ MTRes a -> (a,M.MTResource)
+ MTCnc a x -> (a,M.MTConcrete x)
+ in (a,M.ModMod (M.Module mt' flags (ee e) (oo os) defs'))
+ ee (Ext m) = Just m
+ ee _ = Nothing
+ oo (Opens ms) = map M.OSimple ms
+ oo _ = []
+
+grammar2canon :: CanonGrammar -> Canon
+grammar2canon (M.MGrammar modules) = Gr $ map info2mod modules
+
+info2mod m = case m of
+ (a, M.ModMod (M.Module mt flags me os defs)) ->
+ let defs' = map info2def $ tree2list defs
+ mt' = case mt of
+ M.MTAbstract -> MTAbs a
+ M.MTResource -> MTRes a
+ M.MTConcrete x -> MTCnc a x
+ in
+ Mod mt' (gfcE me) (gfcO os) flags defs'
+ where
+ gfcE = maybe NoExt Ext
+ gfcO os = if null os then NoOpens else Opens [m | M.OSimple m <- os]
+
+
+-- these translations are meant to be trivial
+
+defs2infos = sorted2tree . map def2info
+
+def2info d = case d of
+ AbsDCat c cont fs -> (c,AbsCat (trCont cont) (trFs fs))
+ AbsDFun c ty df -> (c,AbsFun (trExp ty) (trExp df))
+ ResDPar c df -> (c,ResPar df)
+ ResDOper c ty df -> (c,ResOper ty df)
+ CncDCat c ty df pr -> (c, CncCat ty df pr)
+ CncDFun f c xs li pr -> (f, CncFun c xs li pr)
+ AnyDInd c b m -> (c, AnyInd (b == Canon) m)
+
+-- from file to internal
+
+trCont cont = [(x,trExp t) | Decl x t <- cont]
+
+trFs = map trQIdent
+
+trExp t = case t of
+ EProd x a b -> A.Prod x (trExp a) (trExp b)
+ EAbs x b -> A.Abs x (trExp b)
+ EApp f a -> A.App (trExp f) (trExp a)
+ EEq _ -> A.Eqs [] ---- eqs
+ _ -> trAt t
+ where
+ trAt (EAtom t) = case t of
+ AC c -> (uncurry A.Q) $ trQIdent c
+ AD c -> (uncurry A.QC) $ trQIdent c
+ AV v -> A.Vr v
+ AM i -> A.Meta $ A.MetaSymb $ fromInteger i
+ AT s -> A.Sort $ prt s
+ AS s -> A.K s
+ AI i -> A.EInt $ fromInteger i
+
+trQIdent (CIQ m c) = (m,c)
+
+-- from internal to file
+
+infos2defs = map info2def . tree2list
+
+info2def d = case d of
+ (c,AbsCat cont fs) -> AbsDCat c (rtCont cont) (rtFs fs)
+ (c,AbsFun ty df) -> AbsDFun c (rtExp ty) (rtExp df)
+ (c,ResPar df) -> ResDPar c df
+ (c,ResOper ty df) -> ResDOper c ty df
+ (c,CncCat ty df pr) -> CncDCat c ty df pr
+ (f,CncFun c xs li pr) -> CncDFun f c xs li pr
+ (c,AnyInd b m) -> AnyDInd c (if b then Canon else NonCan) m
+
+rtCont cont = [Decl (rtIdent x) (rtExp t) | (x,t) <- cont]
+
+rtFs = map rtQIdent
+
+rtExp t = case t of
+ A.Prod x a b -> EProd (rtIdent x) (rtExp a) (rtExp b)
+ A.Abs x b -> EAbs (rtIdent x) (rtExp b)
+ A.App f a -> EApp (rtExp f) (rtExp a)
+ A.Eqs _ -> EEq [] ---- eqs
+ _ -> EAtom $ rtAt t
+ where
+ rtAt t = case t of
+ A.Q m c -> AC $ rtQIdent (m,c)
+ A.QC m c -> AD $ rtQIdent (m,c)
+ A.Vr v -> AV v
+ A.Meta i -> AM $ toInteger $ A.metaSymbInt i
+ A.Sort "Type" -> AT SType
+ A.K s -> AS s
+ A.EInt i -> AI $ toInteger i
+ _ -> error $ "MkGFC.rt not defined for" +++ show t
+
+rtQIdent (m,c) = CIQ (rtIdent m) (rtIdent c)
+rtIdent x
+ | isWildIdent x = identC "h_" --- needed in declarations
+ | otherwise = identC $ prt x ---