summaryrefslogtreecommitdiff
path: root/src/GF/Speech/SRG.hs
diff options
context:
space:
mode:
authorbjorn <bjorn@bringert.net>2008-09-26 09:20:39 +0000
committerbjorn <bjorn@bringert.net>2008-09-26 09:20:39 +0000
commit92c76a626571fd2ccc50641595cbfec9681656dc (patch)
tree6a28e240a0825df7ff57276ef303b15702a2dbb9 /src/GF/Speech/SRG.hs
parent8fa99886b3a47cf58a2777ffb6d98220ee122643 (diff)
Added --output-format=ebnf.
Diffstat (limited to 'src/GF/Speech/SRG.hs')
-rw-r--r--src/GF/Speech/SRG.hs19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/GF/Speech/SRG.hs b/src/GF/Speech/SRG.hs
index f9065dae9..650728be4 100644
--- a/src/GF/Speech/SRG.hs
+++ b/src/GF/Speech/SRG.hs
@@ -10,6 +10,7 @@
----------------------------------------------------------------------
module GF.Speech.SRG (SRG(..), SRGRule(..), SRGAlt(..), SRGItem, SRGSymbol
, SRGNT, CFTerm
+ , ebnfPrinter
, makeSimpleSRG
, makeNonRecursiveSRG
, getSpeechLanguage
@@ -65,9 +66,17 @@ type SRGSymbol = Symbol SRGNT Token
type SRGNT = (Cat, Int)
+ebnfPrinter :: PGF -> CId -> String
+ebnfPrinter pgf cnc = prSRG $ makeSRG id pgf cnc
+
+makeSRG :: (CFG -> CFG) -> PGF -> CId -> SRG
+makeSRG preproces = mkSRG cfgToSRG id
+ where
+ cfgToSRG cfg = [cfRulesToSRGRule rs | (_,rs) <- allRulesGrouped cfg]
+
-- | Create a compact filtered non-left-recursive SRG.
makeSimpleSRG :: PGF -> CId -> SRG
-makeSimpleSRG = mkSRG cfgToSRG preprocess
+makeSimpleSRG = makeSRG preprocess
where
preprocess = traceStats "After mergeIdentical"
. mergeIdentical
@@ -80,7 +89,6 @@ makeSimpleSRG = mkSRG cfgToSRG preprocess
. traceStats "After removeCycles"
. removeCycles
. traceStats "Inital CFG"
- cfgToSRG cfg = [cfRulesToSRGRule rs | (_,rs) <- allRulesGrouped cfg]
traceStats s g = trace ("---- " ++ s ++ ": " ++ stats g {- ++ "\n" ++ prCFRules g ++ "----" -}) g
@@ -165,6 +173,13 @@ ungroupTokens = joinRE . mapRE (symbol (RESymbol . NonTerminal) (REConcat . map
-- * Utilities for building and printing SRGs
--
+prSRG :: SRG -> String
+prSRG = unlines . map prRule . srgRules
+ where
+ prRule (SRGRule c alts) = c ++ " ::= " ++ unwords (intersperse "|" (map prAlt alts))
+ prAlt (SRGAlt _ _ rhs) = prRE prSym rhs
+ prSym = symbol fst (\t -> "\""++ t ++"\"")
+
lookupFM_ :: (Ord key, Show key) => Map key elt -> key -> elt
lookupFM_ fm k = Map.findWithDefault err k fm
where err = error $ "Key not found: " ++ show k