1
0
forked from GitHub/gf-core

SRG conversion: print CFG when a unknown cat is found in renameCats. Do filtering in ebnf printer.

This commit is contained in:
bjorn
2008-09-30 09:32:16 +00:00
parent 8716e48c21
commit 41c95825f3
5 changed files with 17 additions and 10 deletions

View File

@@ -24,7 +24,7 @@ width :: Int
width = 75 width = 75
gslPrinter :: PGF -> CId -> String gslPrinter :: PGF -> CId -> String
gslPrinter pgf cnc = renderStyle st $ prGSL $ makeSimpleSRG pgf cnc gslPrinter pgf cnc = renderStyle st $ prGSL $ makeNonLeftRecursiveSRG pgf cnc
where st = style { lineLength = width } where st = style { lineLength = width }
prGSL :: SRG -> Doc prGSL :: SRG -> Doc

View File

@@ -32,7 +32,7 @@ width = 75
jsgfPrinter :: Maybe SISRFormat jsgfPrinter :: Maybe SISRFormat
-> PGF -> PGF
-> CId -> String -> CId -> String
jsgfPrinter sisr pgf cnc = renderStyle st $ prJSGF sisr $ makeSimpleSRG pgf cnc jsgfPrinter sisr pgf cnc = renderStyle st $ prJSGF sisr $ makeNonLeftRecursiveSRG pgf cnc
where st = style { lineLength = width } where st = style { lineLength = width }
prJSGF :: Maybe SISRFormat -> SRG -> Doc prJSGF :: Maybe SISRFormat -> SRG -> Doc

View File

@@ -13,7 +13,7 @@ module GF.Speech.SRG (SRG(..), SRGRule(..), SRGAlt(..), SRGItem, SRGSymbol
, ebnfPrinter , ebnfPrinter
, nonLeftRecursivePrinter , nonLeftRecursivePrinter
, regularPrinter , regularPrinter
, makeSimpleSRG , makeNonLeftRecursiveSRG
, makeNonRecursiveSRG , makeNonRecursiveSRG
, getSpeechLanguage , getSpeechLanguage
, isExternalCat , isExternalCat
@@ -69,13 +69,19 @@ type SRGNT = (Cat, Int)
ebnfPrinter :: Maybe SISRFormat -> PGF -> CId -> String ebnfPrinter :: Maybe SISRFormat -> PGF -> CId -> String
ebnfPrinter sisr pgf cnc = prSRG sisr $ makeSRG id pgf cnc ebnfPrinter sisr pgf cnc = prSRG sisr $ makeSRG preprocess pgf cnc
where
preprocess = mergeIdentical
. topDownFilter
. bottomUpFilter
nonLeftRecursivePrinter :: Maybe SISRFormat -> PGF -> CId -> String nonLeftRecursivePrinter :: Maybe SISRFormat -> PGF -> CId -> String
nonLeftRecursivePrinter sisr pgf cnc = prSRG sisr $ makeSRG removeLeftRecursion pgf cnc nonLeftRecursivePrinter sisr pgf cnc = prSRG sisr $ makeNonLeftRecursiveSRG pgf cnc
regularPrinter :: PGF -> CId -> String regularPrinter :: PGF -> CId -> String
regularPrinter pgf cnc = prSRG Nothing $ makeSRG makeRegular pgf cnc regularPrinter pgf cnc = prSRG Nothing $ makeSRG makeRegular pgf cnc
where
preprocess = makeRegular
makeSRG :: (CFG -> CFG) -> PGF -> CId -> SRG makeSRG :: (CFG -> CFG) -> PGF -> CId -> SRG
makeSRG = mkSRG cfgToSRG makeSRG = mkSRG cfgToSRG
@@ -83,8 +89,8 @@ makeSRG = mkSRG cfgToSRG
cfgToSRG cfg = [cfRulesToSRGRule rs | (_,rs) <- allRulesGrouped cfg] cfgToSRG cfg = [cfRulesToSRGRule rs | (_,rs) <- allRulesGrouped cfg]
-- | Create a compact filtered non-left-recursive SRG. -- | Create a compact filtered non-left-recursive SRG.
makeSimpleSRG :: PGF -> CId -> SRG makeNonLeftRecursiveSRG :: PGF -> CId -> SRG
makeSimpleSRG = makeSRG preprocess makeNonLeftRecursiveSRG = makeSRG preprocess
where where
preprocess = traceStats "After mergeIdentical" preprocess = traceStats "After mergeIdentical"
. mergeIdentical . mergeIdentical
@@ -130,10 +136,11 @@ mkSRG mkRules preprocess pgf cnc =
renameCats :: String -> CFG -> CFG renameCats :: String -> CFG -> CFG
renameCats prefix cfg = mapCFGCats renameCat cfg renameCats prefix cfg = mapCFGCats renameCat cfg
where renameCat c | isExternal c = c ++ "_cat" where renameCat c | isExternal c = c ++ "_cat"
| otherwise = Map.findWithDefault (error ("renameCats: " ++ c)) c names | otherwise = Map.findWithDefault (badCat c) c names
isExternal c = c `Set.member` cfgExternalCats cfg isExternal c = c `Set.member` cfgExternalCats cfg
catsByPrefix = buildMultiMap [(takeWhile (/='_') cat, cat) | cat <- allCats cfg, not (isExternal cat)] catsByPrefix = buildMultiMap [(takeWhile (/='_') cat, cat) | cat <- allCats cfg, not (isExternal cat)]
names = Map.fromList [(c,pref++"_"++show i) | (pref,cs) <- catsByPrefix, (c,i) <- zip cs [1..]] names = Map.fromList [(c,pref++"_"++show i) | (pref,cs) <- catsByPrefix, (c,i) <- zip cs [1..]]
badCat c = error ("GF.Speech.SRG.renameCats: " ++ c ++ "\n" ++ prCFG cfg)
getSpeechLanguage :: PGF -> CId -> Maybe String getSpeechLanguage :: PGF -> CId -> Maybe String
getSpeechLanguage pgf cnc = fmap (replace '_' '-') $ lookConcrFlag pgf cnc (mkCId "language") getSpeechLanguage pgf cnc = fmap (replace '_' '-') $ lookConcrFlag pgf cnc (mkCId "language")

View File

@@ -38,7 +38,7 @@ width = 75
srgsAbnfPrinter :: Maybe SISRFormat srgsAbnfPrinter :: Maybe SISRFormat
-> PGF -> CId -> String -> PGF -> CId -> String
srgsAbnfPrinter sisr pgf cnc = showDoc $ prABNF sisr $ makeSimpleSRG pgf cnc srgsAbnfPrinter sisr pgf cnc = showDoc $ prABNF sisr $ makeNonLeftRecursiveSRG pgf cnc
srgsAbnfNonRecursivePrinter :: PGF -> CId -> String srgsAbnfNonRecursivePrinter :: PGF -> CId -> String
srgsAbnfNonRecursivePrinter pgf cnc = showDoc $ prABNF Nothing $ makeNonRecursiveSRG pgf cnc srgsAbnfNonRecursivePrinter pgf cnc = showDoc $ prABNF Nothing $ makeNonRecursiveSRG pgf cnc

View File

@@ -23,7 +23,7 @@ import qualified Data.Map as Map
srgsXmlPrinter :: Maybe SISRFormat srgsXmlPrinter :: Maybe SISRFormat
-> PGF -> CId -> String -> PGF -> CId -> String
srgsXmlPrinter sisr pgf cnc = prSrgsXml sisr $ makeSimpleSRG pgf cnc srgsXmlPrinter sisr pgf cnc = prSrgsXml sisr $ makeNonLeftRecursiveSRG pgf cnc
srgsXmlNonRecursivePrinter :: PGF -> CId -> String srgsXmlNonRecursivePrinter :: PGF -> CId -> String
srgsXmlNonRecursivePrinter pgf cnc = prSrgsXml Nothing $ makeNonRecursiveSRG pgf cnc srgsXmlNonRecursivePrinter pgf cnc = prSrgsXml Nothing $ makeNonRecursiveSRG pgf cnc