summaryrefslogtreecommitdiff
path: root/src/GF/CF/CanonToCF.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-06-25 16:43:48 +0000
committeraarne <aarne@cs.chalmers.se>2008-06-25 16:43:48 +0000
commitb96b36f43de3e2f8b58d5f539daa6f6d47f25870 (patch)
tree0992334be13cec6538a1dea22fbbf26ad6bdf224 /src/GF/CF/CanonToCF.hs
parentfe367412e0aeb4ad5c02de68e6eca382e0f96984 (diff)
removed src for 2.9
Diffstat (limited to 'src/GF/CF/CanonToCF.hs')
-rw-r--r--src/GF/CF/CanonToCF.hs214
1 files changed, 0 insertions, 214 deletions
diff --git a/src/GF/CF/CanonToCF.hs b/src/GF/CF/CanonToCF.hs
deleted file mode 100644
index 80ce2e79d..000000000
--- a/src/GF/CF/CanonToCF.hs
+++ /dev/null
@@ -1,214 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : CanonToCF
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/11/14 16:03:41 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.15 $
---
--- AR 27\/1\/2000 -- 3\/12\/2001 -- 8\/6\/2003
------------------------------------------------------------------------------
-
-module GF.CF.CanonToCF (canon2cf) where
-
-import GF.System.Tracing -- peb 8/6-04
-
-import GF.Data.Operations
-import GF.Infra.Option
-import GF.Infra.Ident
-import GF.Canon.AbsGFC
-import GF.Grammar.LookAbs (allBindCatsOf)
-import GF.Canon.GFC
-import GF.Grammar.Values (isPredefCat,cPredefAbs)
-import GF.Grammar.PrGrammar
-import GF.Canon.CMacros
-import qualified GF.Infra.Modules as M
-import GF.CF.CF
-import GF.CF.CFIdent
-import GF.UseGrammar.Morphology
-import GF.Data.Trie2
-import Data.List (nub,partition)
-import Control.Monad
-
--- | The main function: for a given cnc module 'm', build the CF grammar with all the
--- rules coming from modules that 'm' extends. The categories are qualified by
--- the abstract module name 'a' that 'm' is of.
--- The ign argument tells what rules not to generate a parser for.
-canon2cf :: Options -> (Ident -> Bool) -> CanonGrammar -> Ident -> Err CF
-canon2cf opts ign gr c = tracePrt "#size of CF" (err id (show.length.rulesOfCF)) $ do -- peb 8/6-04
- let ms = M.allExtends gr c
- a <- M.abstractOfConcrete gr c
- let cncs = [m | (n, M.ModMod m) <- M.modules gr, elem n ms]
- let mms = [(a, tree2list (M.jments m)) | m <- cncs]
- cnc <- liftM M.jments $ M.lookupModMod gr c
- rules0 <- liftM concat $ mapM (uncurry (cnc2cfCond opts ign cnc)) mms
- let bindcats = map snd $ allBindCatsOf gr
- let rules = filter (not . isCircularCF) rules0 ---- temporarily here
- let grules = groupCFRules rules
- let predef = mkCFPredef opts bindcats grules
- return $ CF predef
-
-cnc2cfCond :: Options -> (Ident -> Bool) -> BinTree Ident Info ->
- Ident -> [(Ident,Info)] -> Err [CFRule]
-cnc2cfCond opts ign cnc m gr =
- liftM concat $
- mapM lin2cf [(m,fun,cat,args,lin) |
- (fun, CncFun cat args lin _) <- gr, notign fun, is fun]
- where
- is f = isInBinTree f cnc
- notign = not . ign
-
-type IFun = Ident
-type ICat = CIdent
-
--- | all CF rules corresponding to a linearization rule
-lin2cf :: (Ident, IFun, ICat, [ArgVar], Term) -> Err [CFRule]
-lin2cf (m,fun,cat,args,lin) = errIn ("building CF rule for" +++ prt fun) $ do
- let rhss0 = allLinBranches lin -- :: [([Label], Term)]
- rhss1 <- mapM (mkCFItems m) rhss0 -- :: [([Label], [[PreCFItem]])]
- mapM (mkCfRules m fun cat args) rhss1 >>= return . nub . concat
-
--- | making sequences of CF items from every branch in a linearization
-mkCFItems :: Ident -> ([Label], Term) -> Err ([Label], [[PreCFItem]])
-mkCFItems m (labs,t) = do
- items <- term2CFItems m t
- return (labs, items)
-
--- | making CF rules from sequences of CF items
-mkCfRules :: Ident -> IFun -> ICat -> [ArgVar] -> ([Label], [[PreCFItem]]) -> Err [CFRule]
-mkCfRules m fun cat args (lab, itss) = mapM mkOneRule itss
- where
- mkOneRule its = do
- let nonterms = zip [0..] [(pos,d,v) | PNonterm _ pos d v <- its]
- profile = mkProfile nonterms
- cfcat = labels2CFCat (redirectIdent m cat) lab
- cffun = CFFun (AC (CIQ m fun), profile)
- cfits = map precf2cf its
- return (cffun,(cfcat,cfits))
- mkProfile nonterms = map mkOne args
- where
- mkOne (A c i) = mkOne (AB c 0 i)
- mkOne (AB _ b i) = (map mkB [0..b-1], [k | (k,(j,_,True)) <- nonterms, j==i])
- where
- mkB x = [k | (k,(j, [LV y], False)) <- nonterms, j == i, y == x]
-
--- | intermediate data structure of CFItems with information for profiles
-data PreCFItem =
- PTerm RegExp -- ^ like ordinary Terminal
- | PNonterm CIdent Integer [Label] Bool -- ^ cat, position, part\/bind, whether arg
- deriving Eq
-
-precf2cf :: PreCFItem -> CFItem
-precf2cf (PTerm r) = CFTerm r
-precf2cf (PNonterm cm _ ls True) = CFNonterm (labels2CFCat cm ls)
-precf2cf (PNonterm _ _ _ False) = CFNonterm catVarCF
-
-
--- | the main job in translating linearization rules into sequences of cf items
-term2CFItems :: Ident -> Term -> Err [[PreCFItem]]
-term2CFItems m t = errIn "forming cf items" $ case t of
- S c _ -> t2c c
-
- T _ cc -> do
- its <- mapM t2c [t | Cas _ t <- cc]
- tryMkCFTerm (concat its)
- V _ cc -> do
- its <- mapM t2c [t | t <- cc]
- tryMkCFTerm (concat its)
-
- C t1 t2 -> do
- its1 <- t2c t1
- its2 <- t2c t2
- return [x ++ y | x <- its1, y <- its2]
-
- FV ts -> do
- its <- mapM t2c ts
- tryMkCFTerm (concat its)
-
- P (S c _) _ -> t2c c --- w-around for bug in Compute? AR 31/1/2006
-
- P arg s -> extrR arg s
-
- K (KS s) -> return [[PTerm (RegAlts [s]) | not (null s)]]
-
- E -> return [[]]
-
- K (KP d vs) -> do
- let its = [PTerm (RegAlts [s]) | s <- d]
- let itss = [[PTerm (RegAlts [s]) | s <- t] | Var t _ <- vs]
- tryMkCFTerm (its : itss)
-
- _ -> return [] ---- prtBad "no cf for" t ----
-
- where
-
- t2c = term2CFItems m
-
- -- optimize the number of rules by a factorization
- tryMkCFTerm :: [[PreCFItem]] -> Err [[PreCFItem]]
- tryMkCFTerm ii@(its:itss) | all (\x -> length x == length its) itss =
- case mapM mkOne (counterparts ii) of
- Ok tt -> return [tt]
- _ -> return ii
- where
- mkOne cfits = case mapM mkOneTerm cfits of
- Ok tt -> return $ PTerm (RegAlts (concat (nub tt)))
- _ -> mkOneNonTerm cfits
- mkOneTerm (PTerm (RegAlts t)) = return t
- mkOneTerm _ = Bad ""
- mkOneNonTerm (n@(PNonterm _ _ _ _) : cc) =
- if all (== n) cc
- then return n
- else Bad ""
- mkOneNonTerm _ = Bad ""
- counterparts ll = [map (!! i) ll | i <- [0..length (head ll) - 1]]
- tryMkCFTerm itss = return itss
-
- extrR arg lab = case (arg0,labs) of
- (Arg (A cat pos), [(LV _)]) -> return [[PNonterm (cIQ cat) pos labs False]]
- (Arg (AB cat b pos), [(LV _)]) -> return [[PNonterm (cIQ cat) pos labs False]]
- (Arg (A cat pos), _) -> return [[PNonterm (cIQ cat) pos labs True]]
- (Arg (AB cat b pos), _) -> return [[PNonterm (cIQ cat) pos labs True]]
- ---- ??
- _ -> prtBad "cannot extract record field from" arg
- where
- (arg0,labs) = headProj arg [lab]
-
- headProj r ls = case r of
- P r0 l0 -> headProj r0 (l0:ls)
- S r0 _ -> headProj r0 ls
- _ -> (r,ls)
- cIQ c = if isPredefCat c then CIQ cPredefAbs c else CIQ m c
-
-mkCFPredef :: Options -> [Ident] -> [CFRuleGroup] -> ([CFRuleGroup],CFPredef)
-mkCFPredef opts binds rules = (ruls, \s -> preds0 s ++ look s) where
- (ruls,preds) = if oElem lexerByNeed opts -- option -cflexer
- then predefLexer rules
- else (rules,emptyTrie)
- preds0 s =
- [(cat, metaCFFun) | TM _ _ <- [s], cat <- cats] ++
- [(cat, varCFFun x) | TV x <- [s], cat <- catVarCF : bindcats] ++
- [(cfCatString, stringCFFun t) | TL t <- [s]] ++
- [(cfCatInt, intCFFun t) | TI t <- [s]] ++
- [(cfCatFloat, floatCFFun t) | TF t <- [s]]
- cats = nub [c | (_,rs) <- rules, (_,(_,its)) <- rs, CFNonterm c <- its]
- bindcats = [c | c <- cats, elem (cfCat2Ident c) binds]
- look = concatMap snd . map (trieLookup preds) . wordsCFTok --- for TC tokens
-
---- TODO: integrate with morphology
---- predefLexer :: [CFRuleGroup] -> ([CFRuleGroup],BinTree (CFTok,[(CFCat, CFFun)]))
-predefLexer groups = (reverse ruls, tcompile preds) where
- (ruls,preds) = foldr mkOne ([],[]) groups
- mkOne group@(cat,rules) (rs,ps) = (rule:rs,pre ++ ps) where
- (rule,pre) = case partition isLexical rules of
- ([],_) -> (group,[])
- (ls,rest) -> ((cat,rest), concatMap mkLexRule ls)
- isLexical (f,(c,its)) = case its of
- [CFTerm (RegAlts ws)] -> True
- _ -> False
- mkLexRule r = case r of
- (fun,(cat,[CFTerm (RegAlts ws)])) -> [(w, [(cat,fun)]) | w <- ws]
- _ -> []