diff options
| author | bjorn <bjorn@bringert.net> | 2008-09-26 09:20:39 +0000 |
|---|---|---|
| committer | bjorn <bjorn@bringert.net> | 2008-09-26 09:20:39 +0000 |
| commit | 92c76a626571fd2ccc50641595cbfec9681656dc (patch) | |
| tree | 6a28e240a0825df7ff57276ef303b15702a2dbb9 /src/GF/Speech/SRG.hs | |
| parent | 8fa99886b3a47cf58a2777ffb6d98220ee122643 (diff) | |
Added --output-format=ebnf.
Diffstat (limited to 'src/GF/Speech/SRG.hs')
| -rw-r--r-- | src/GF/Speech/SRG.hs | 19 |
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 |
