summaryrefslogtreecommitdiff
path: root/src/GF/Conversion/GFC.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/GF/Conversion/GFC.hs')
-rw-r--r--src/GF/Conversion/GFC.hs49
1 files changed, 33 insertions, 16 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