summaryrefslogtreecommitdiff
path: root/src/GF/Canon/CMacros.hs
diff options
context:
space:
mode:
authorbringert <unknown>2004-08-23 07:51:36 +0000
committerbringert <unknown>2004-08-23 07:51:36 +0000
commit65f012d15513814bd2cc4ad74f54edd35ade13fe (patch)
tree089419071773038e8357a6b97a9ec0481df2a338 /src/GF/Canon/CMacros.hs
parent25ffe15333a881022047409a1c12a17dd41d1198 (diff)
Added CFGM format (pm -printer=cfgm) and utf8 conversion for pm.
Diffstat (limited to 'src/GF/Canon/CMacros.hs')
-rw-r--r--src/GF/Canon/CMacros.hs53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/GF/Canon/CMacros.hs b/src/GF/Canon/CMacros.hs
index 37693efa5..4643b1494 100644
--- a/src/GF/Canon/CMacros.hs
+++ b/src/GF/Canon/CMacros.hs
@@ -178,3 +178,56 @@ wordsInTerm trm = filter (not . null) $ case trm of
P t _ -> wo t --- not needed ?
_ -> []
where wo = wordsInTerm
+
+onTokens :: (String -> String) -> Term -> Term
+onTokens f t = case t of
+ K (KS s) -> K (KS (f s))
+ K (KP ss vs) -> K (KP (map f ss) [Var (map f x) (map f y) | Var x y <- vs])
+ _ -> composSafeOp (onTokens f) t
+
+
+-- to define compositional term functions
+
+composSafeOp :: (Term -> Term) -> Term -> Term
+composSafeOp op trm = case composOp (mkMonadic op) trm of
+ Ok t -> t
+ _ -> error "the operation is safe isn't it ?"
+ where
+ mkMonadic f = return . f
+
+composOp :: Monad m => (Term -> m Term) -> Term -> m Term
+composOp co trm =
+ case trm of
+ Con x as ->
+ do
+ as' <- mapM co as
+ return (Con x as')
+ R as ->
+ do
+ let onAss (Ass l t) = liftM (Ass l) (co t)
+ as' <- mapM onAss as
+ return (R as')
+ P a x ->
+ do
+ a' <- co a
+ return (P a' x)
+ T x as ->
+ do
+ let onCas (Cas ps t) = liftM (Cas ps) (co t)
+ as' <- mapM onCas as
+ return (T x as')
+ S a b ->
+ do
+ a' <- co a
+ b' <- co b
+ return (S a' b')
+ C a b ->
+ do
+ a' <- co a
+ b' <- co b
+ return (C a' b')
+ FV as ->
+ do
+ as' <- mapM co as
+ return (FV as')
+ _ -> return trm -- covers Arg, I, LI, K, E