mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 19:42:50 -06:00
SRG conversion: print CFG when a unknown cat is found in renameCats. Do filtering in ebnf printer.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user