diff options
| author | peb <unknown> | 2005-04-16 04:40:48 +0000 |
|---|---|---|
| committer | peb <unknown> | 2005-04-16 04:40:48 +0000 |
| commit | 9e510f5245ac8ee1a7524fbbf49447daaef846d3 (patch) | |
| tree | 1a4f923fa1a4247146d7d0b4caf56021fc0f70a6 /src/GF/Conversion | |
| parent | 9d112935dc072c399ae86be4fa9cc273b479928e (diff) | |
"Committed_by_peb"
Diffstat (limited to 'src/GF/Conversion')
| -rw-r--r-- | src/GF/Conversion/GFC.hs | 49 | ||||
| -rw-r--r-- | src/GF/Conversion/MCFGtoCFG.hs | 32 | ||||
| -rw-r--r-- | src/GF/Conversion/Types.hs | 22 |
3 files changed, 80 insertions, 23 deletions
diff --git a/src/GF/Conversion/GFC.hs b/src/GF/Conversion/GFC.hs index 765fb10e0..3f52ec88d 100644 --- a/src/GF/Conversion/GFC.hs +++ b/src/GF/Conversion/GFC.hs @@ -4,9 +4,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/04/14 18:38:36 $ +-- > CVS $Date: 2005/04/16 05:40:49 $ -- > CVS $Author: peb $ --- > CVS $Revision: 1.4 $ +-- > CVS $Revision: 1.5 $ -- -- All conversions from GFC ----------------------------------------------------------------------------- @@ -15,17 +15,37 @@ module GF.Conversion.GFC (module GF.Conversion.GFC, SGrammar, MGrammar, CGrammar) where +import Option import GFC (CanonGrammar) import Ident (Ident) -import GF.Conversion.Types (CGrammar, MGrammar, SGrammar) +import GF.Conversion.Types (CGrammar, MGrammar, NGrammar, SGrammar) import qualified GF.Conversion.GFCtoSimple as G2S import qualified GF.Conversion.SimpleToFinite as S2Fin import qualified GF.Conversion.RemoveSingletons as RemSing +import qualified GF.Conversion.RemoveErasing as RemEra import qualified GF.Conversion.SimpleToMCFG as S2M import qualified GF.Conversion.MCFGtoCFG as M2C ---------------------------------------------------------------------- +-- * GFC -> MCFG & CFG, using options to decide which conversion is used + +gfc2mcfg2cfg :: Options -> (CanonGrammar, Ident) -> (MGrammar, CGrammar) +gfc2mcfg2cfg opts = \g -> let m = g2m g in (m, m2c m) + where m2c = mcfg2cfg + g2m = case getOptVal opts gfcConversion of + Just "strict" -> simple2mcfg_strict . gfc2simple + Just "finite" -> simple2mcfg_nondet . gfc2finite + Just "finite-strict" -> simple2mcfg_strict . gfc2finite + _ -> simple2mcfg_nondet . gfc2simple + +gfc2mcfg :: Options -> (CanonGrammar, Ident) -> MGrammar +gfc2mcfg opts = fst . gfc2mcfg2cfg opts + +gfc2cfg :: Options -> (CanonGrammar, Ident) -> CGrammar +gfc2cfg opts = snd . gfc2mcfg2cfg opts + +---------------------------------------------------------------------- -- * single step conversions gfc2simple :: (CanonGrammar, Ident) -> SGrammar @@ -37,6 +57,9 @@ simple2finite = S2Fin.convertGrammar removeSingletons :: SGrammar -> SGrammar removeSingletons = RemSing.convertGrammar +gfc2finite :: (CanonGrammar, Ident) -> SGrammar +gfc2finite = removeSingletons . simple2finite . gfc2simple + simple2mcfg_nondet :: SGrammar -> MGrammar simple2mcfg_nondet = S2M.convertGrammarNondet @@ -46,21 +69,15 @@ simple2mcfg_strict = S2M.convertGrammarStrict mcfg2cfg :: MGrammar -> CGrammar mcfg2cfg = M2C.convertGrammar ----------------------------------------------------------------------- --- * GFC -> MCFG +removeErasing :: MGrammar -> NGrammar +removeErasing = RemEra.convertGrammar --- | default conversion: +-- | this function is unnecessary, because of the following equivalence: -- --- - instantiating finite dependencies ('removeSingletons . simple2finite') --- - nondeterministic MCFG conversion ('simple2mcfg_nondet') -gfc2mcfg :: (CanonGrammar, Ident) -> MGrammar -gfc2mcfg = simple2mcfg_nondet . removeSingletons . simple2finite . gfc2simple - ----------------------------------------------------------------------- --- * GFC -> CFG +-- > mcfg2cfg == ne_mcfg2cfg . removeErasing +-- +ne_mcfg2cfg :: NGrammar -> CGrammar +ne_mcfg2cfg = M2C.convertNEGrammar --- | default conversion = default mcfg conversion + trivial cfg conversion -gfc2cfg :: (CanonGrammar, Ident) -> CGrammar -gfc2cfg = mcfg2cfg . gfc2mcfg diff --git a/src/GF/Conversion/MCFGtoCFG.hs b/src/GF/Conversion/MCFGtoCFG.hs index 2b86b633a..236a90aca 100644 --- a/src/GF/Conversion/MCFGtoCFG.hs +++ b/src/GF/Conversion/MCFGtoCFG.hs @@ -4,16 +4,16 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/04/12 10:49:44 $ +-- > CVS $Date: 2005/04/16 05:40:49 $ -- > CVS $Author: peb $ --- > CVS $Revision: 1.2 $ +-- > CVS $Revision: 1.3 $ -- -- Converting MCFG grammars to (possibly overgenerating) CFG ----------------------------------------------------------------------------- module GF.Conversion.MCFGtoCFG - (convertGrammar) where + (convertGrammar, convertNEGrammar) where import GF.System.Tracing import GF.Infra.Print @@ -25,9 +25,12 @@ import GF.Formalism.MCFG import GF.Formalism.CFG import GF.Conversion.Types +---------------------------------------------------------------------- +-- * converting (possibly erasing) MCFG grammars + convertGrammar :: MGrammar -> CGrammar convertGrammar gram = tracePrt "#context-free rules" (prt.length) $ - concatMap convertRule gram + concatMap convertRule gram convertRule :: MRule -> [CRule] convertRule (Rule (Abs cat args (Name fun mprofile)) (Cnc _ _ record)) @@ -45,6 +48,27 @@ argPlaces :: [Symbol (cat, lbl, Int) tok] -> Int -> [Int] argPlaces lin nr = [ place | (nr', place) <- zip linArgs [0..], nr == nr' ] where linArgs = [ nr' | (_, _, nr') <- filterCats lin ] +---------------------------------------------------------------------- +-- * converting nonerasing MCFG grammars + +convertNEGrammar :: NGrammar -> CGrammar +convertNEGrammar gram = tracePrt "#context-free rules" (prt.length) $ + concatMap convertNERule gram + +convertNERule :: NRule -> [CRule] +convertNERule (Rule (Abs ncat args (Name fun mprofile)) (Cnc _ _ record)) + = [ CFRule (CCat (ncat2mcat ncat) lbl) rhs (Name fun profile) | + Lin lbl lin <- record, + let rhs = map (mapSymbol convertNEArg id) lin, + let cprofile = map (Unify . argPlaces lin) [0 .. length args-1], + let profile = mprofile `composeProfiles` cprofile + ] + +convertNEArg :: (NCat, NLabel, Int) -> CCat +convertNEArg (ncat, lbl, _) = CCat (ncat2mcat ncat) lbl + +---------------------------------------------------------------------- + diff --git a/src/GF/Conversion/Types.hs b/src/GF/Conversion/Types.hs index d193f6d67..26203f73c 100644 --- a/src/GF/Conversion/Types.hs +++ b/src/GF/Conversion/Types.hs @@ -4,9 +4,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/04/14 11:42:05 $ +-- > CVS $Date: 2005/04/16 05:40:49 $ -- > CVS $Author: peb $ --- > CVS $Revision: 1.3 $ +-- > CVS $Revision: 1.4 $ -- -- All possible instantiations of different grammar formats used in conversion from GFC ----------------------------------------------------------------------------- @@ -44,6 +44,8 @@ data Name = Name Fun [Profile (SyntaxForest Fun)] name2fun :: Name -> Fun name2fun (Name fun _) = fun +-- * profiles + -- | A profile is a simple representation of a function on a number of arguments. -- We only use lists of profiles data Profile a = Unify [Int] -- ^ The Int's are the argument positions. @@ -116,7 +118,7 @@ type SLinType = LinType SCat Token type SDecl = Decl SCat ---------------------------------------------------------------------- --- * MCFG +-- * erasing MCFG type MGrammar = MCFGrammar MCat Name MLabel Token type MRule = MCFRule MCat Name MLabel Token @@ -144,6 +146,17 @@ isCoercion (Name fun [Unify [0]]) = Ident.isWildIdent fun isCoercion _ = False ---------------------------------------------------------------------- +-- * nonerasing MCFG + +type NGrammar = MCFGrammar NCat Name NLabel Token +type NRule = MCFRule NCat Name NLabel Token +data NCat = NCat MCat [MLabel] deriving (Eq, Ord, Show) +type NLabel = MLabel + +ncat2mcat :: NCat -> MCat +ncat2mcat (NCat mcat _) = mcat + +---------------------------------------------------------------------- -- * CFG type CGrammar = CFGrammar CCat Name Token @@ -160,6 +173,9 @@ instance Print MCat where concat [ prt path ++ "=" ++ prt term ++ ";" | (path, term) <- constrs ] ++ "}" +instance Print NCat where + prt (NCat cat labels) = prt cat ++ prt labels + instance Print CCat where prt (CCat cat label) = prt cat ++ prt label |
