summaryrefslogtreecommitdiff
path: root/src/GF/Speech/SRG.hs
diff options
context:
space:
mode:
authorbringert <bringert@cs.chalmers.se>2006-12-15 16:09:58 +0000
committerbringert <bringert@cs.chalmers.se>2006-12-15 16:09:58 +0000
commit215bf61115a1b78c6466830c89574091459bebdb (patch)
tree0c54ecb6ae408f316fea227ca6e202930fab5929 /src/GF/Speech/SRG.hs
parent1e1401472fdc55ba8f208baa7f07e2a4a3cb906c (diff)
Towards smaller SRGs when lots of variants are used.
Diffstat (limited to 'src/GF/Speech/SRG.hs')
-rw-r--r--src/GF/Speech/SRG.hs23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/GF/Speech/SRG.hs b/src/GF/Speech/SRG.hs
index 9082fa1f4..b27c5ad56 100644
--- a/src/GF/Speech/SRG.hs
+++ b/src/GF/Speech/SRG.hs
@@ -23,7 +23,7 @@ module GF.Speech.SRG (SRG(..), SRGRule(..), SRGAlt(..),
makeSimpleSRG, makeSRG
, lookupFM_, prtS
, topDownFilter
- , EBnfSRGAlt(..), EBnfSRGItem(..)
+ , EBnfSRGAlt(..), EBnfSRGItem
, ebnfSRGAlts
) where
@@ -38,6 +38,8 @@ import GF.Conversion.Types
import GF.Infra.Print
import GF.Speech.TransformCFG
import GF.Speech.Relation
+import GF.Speech.FiniteState
+import GF.Speech.RegExp
import GF.Infra.Option
import GF.Probabilistic.Probabilistic (Probs)
@@ -173,18 +175,25 @@ allSRGCats SRG { rules = rs } = [c | SRGRule c _ _ <- rs]
data EBnfSRGAlt = EBnfSRGAlt (Maybe Double) Name EBnfSRGItem
deriving (Eq,Show)
-data EBnfSRGItem =
- EBnfOneOf [EBnfSRGItem]
- | EBnfSeq [EBnfSRGItem]
- | EBnfSymbol (Symbol SRGNT Token)
- deriving (Eq,Show)
+type EBnfSRGItem = RE (Symbol SRGNT Token)
+
ebnfSRGAlts :: [SRGAlt] -> [EBnfSRGAlt]
ebnfSRGAlts alts = [EBnfSRGAlt p n (ebnfSRGItem sss)
| ((p,n),sss) <- buildMultiMap [((p,n),ss) | SRGAlt p n ss <- alts]]
ebnfSRGItem :: [[Symbol SRGNT Token]] -> EBnfSRGItem
-ebnfSRGItem sss = EBnfOneOf (map (EBnfSeq . map EBnfSymbol) sss)
+ebnfSRGItem = dfa2re . mkSRGFA
+
+mkSRGFA :: [[Symbol SRGNT Token]] -> DFA (Symbol SRGNT Token)
+mkSRGFA = minimize . dfa2nfa . foldr addString (newFA ())
+
+addString :: [a] -> DFA a -> DFA a
+addString xs fa = addFinalState (last sts0) $ newTransitions ts fa'
+ where (fa',ss) = newStates (replicate (length xs) ()) fa
+ sts0 = startState fa : sts1
+ sts1 = map fst ss
+ ts = zip3 sts0 sts1 xs
--
-- * Utilities for building and printing SRGs