forked from GitHub/gf-core
Handled renaming external SRG categories centrally.
This commit is contained in:
@@ -242,6 +242,11 @@ catRules gr c = Set.toList $ Map.findWithDefault Set.empty c (cfgRules gr)
|
|||||||
catSetRules :: CFG -> Set Cat -> [CFRule]
|
catSetRules :: CFG -> Set Cat -> [CFRule]
|
||||||
catSetRules gr cs = allRules $ filterCFGCats (`Set.member` cs) gr
|
catSetRules gr cs = allRules $ filterCFGCats (`Set.member` cs) gr
|
||||||
|
|
||||||
|
mapCFGCats :: (Cat -> Cat) -> CFG -> CFG
|
||||||
|
mapCFGCats f cfg = mkCFG (f (cfgStartCat cfg))
|
||||||
|
(Set.map f (cfgExternalCats cfg))
|
||||||
|
[CFRule (f lhs) (map (mapSymbol f id) rhs) t | CFRule lhs rhs t <- allRules cfg]
|
||||||
|
|
||||||
onCFG :: (Map Cat (Set CFRule) -> Map Cat (Set CFRule)) -> CFG -> CFG
|
onCFG :: (Map Cat (Set CFRule) -> Map Cat (Set CFRule)) -> CFG -> CFG
|
||||||
onCFG f cfg = cfg { cfgRules = f (cfgRules cfg) }
|
onCFG f cfg = cfg { cfgRules = f (cfgRules cfg) }
|
||||||
|
|
||||||
|
|||||||
@@ -44,10 +44,8 @@ prJSGF sisr srg
|
|||||||
comment "Generated by GF" $$
|
comment "Generated by GF" $$
|
||||||
text ("grammar " ++ srgName srg ++ ";")
|
text ("grammar " ++ srgName srg ++ ";")
|
||||||
lang = maybe empty text (srgLanguage srg)
|
lang = maybe empty text (srgLanguage srg)
|
||||||
mainCat = rule True "MAIN" [prCat (externalCat (srgStartCat srg))]
|
mainCat = rule True "MAIN" [prCat (srgStartCat srg)]
|
||||||
prRule (SRGRule cat rhs)
|
prRule (SRGRule cat rhs) = rule (isExternalCat srg cat) cat (map prAlt rhs)
|
||||||
| isExternalCat srg cat = rule True (externalCat cat) (map prAlt rhs)
|
|
||||||
| otherwise = rule False cat (map prAlt rhs)
|
|
||||||
prAlt (SRGAlt mp n rhs) = sep [initTag, p (prItem sisr n rhs), finalTag]
|
prAlt (SRGAlt mp n rhs) = sep [initTag, p (prItem sisr n rhs), finalTag]
|
||||||
where initTag | isEmpty t = empty
|
where initTag | isEmpty t = empty
|
||||||
| otherwise = text "<NULL>" <+> t
|
| otherwise = text "<NULL>" <+> t
|
||||||
@@ -55,9 +53,6 @@ prJSGF sisr srg
|
|||||||
finalTag = tag sisr (profileFinalSISR n)
|
finalTag = tag sisr (profileFinalSISR n)
|
||||||
p = if isEmpty initTag && isEmpty finalTag then id else parens
|
p = if isEmpty initTag && isEmpty finalTag then id else parens
|
||||||
|
|
||||||
externalCat :: Cat -> Cat
|
|
||||||
externalCat c = c ++ "_cat"
|
|
||||||
|
|
||||||
prCat :: Cat -> Doc
|
prCat :: Cat -> Doc
|
||||||
prCat c = char '<' <> text c <> char '>'
|
prCat c = char '<' <> text c <> char '>'
|
||||||
|
|
||||||
|
|||||||
@@ -96,17 +96,12 @@ stats g = "Categories: " ++ show (countCats g)
|
|||||||
makeNonRecursiveSRG :: PGF
|
makeNonRecursiveSRG :: PGF
|
||||||
-> CId -- ^ Concrete syntax name.
|
-> CId -- ^ Concrete syntax name.
|
||||||
-> SRG
|
-> SRG
|
||||||
makeNonRecursiveSRG pgf cnc =
|
makeNonRecursiveSRG = mkSRG mkRules
|
||||||
SRG { srgName = prCId cnc,
|
where
|
||||||
srgStartCat = start,
|
mkRules cfg = [SRGRule l [SRGAlt Nothing dummyCFTerm (dfaToSRGItem dfa)] | (l,dfa) <- dfas]
|
||||||
srgExternalCats = cfgExternalCats cfg,
|
where
|
||||||
srgLanguage = getSpeechLanguage pgf cnc,
|
MFA _ dfas = cfgToMFA cfg
|
||||||
srgRules = rs }
|
dfaToSRGItem = mapRE dummySRGNT . minimizeRE . dfa2re
|
||||||
where
|
|
||||||
cfg = pgfToCFG pgf cnc
|
|
||||||
MFA start dfas = cfgToMFA cfg
|
|
||||||
rs = [SRGRule l [SRGAlt Nothing dummyCFTerm (dfaToSRGItem dfa)] | (l,dfa) <- dfas]
|
|
||||||
where dfaToSRGItem = mapRE dummySRGNT . minimizeRE . dfa2re
|
|
||||||
dummyCFTerm = CFMeta (mkCId "dummy")
|
dummyCFTerm = CFMeta (mkCId "dummy")
|
||||||
dummySRGNT = mapSymbol (\c -> (c,0)) id
|
dummySRGNT = mapSymbol (\c -> (c,0)) id
|
||||||
|
|
||||||
@@ -114,16 +109,19 @@ makeSRG :: (CFG -> CFG)
|
|||||||
-> PGF
|
-> PGF
|
||||||
-> CId -- ^ Concrete syntax name.
|
-> CId -- ^ Concrete syntax name.
|
||||||
-> SRG
|
-> SRG
|
||||||
makeSRG preprocess pgf cnc =
|
makeSRG preprocess = mkSRG mkRules
|
||||||
SRG { srgName = prCId cnc,
|
|
||||||
srgStartCat = cfgStartCat cfg,
|
|
||||||
srgExternalCats = cfgExternalCats cfg,
|
|
||||||
srgLanguage = getSpeechLanguage pgf cnc,
|
|
||||||
srgRules = rs }
|
|
||||||
where
|
where
|
||||||
cfg = pgfToCFG pgf cnc
|
mkRules = map cfRulesToSRGRule . snd . unzip . allRulesGrouped . preprocess
|
||||||
(_,cfgRules) = unzip $ allRulesGrouped $ preprocess cfg
|
|
||||||
rs = map cfRulesToSRGRule cfgRules
|
mkSRG :: (CFG -> [SRGRule]) -> PGF -> CId -> SRG
|
||||||
|
mkSRG mkRules pgf cnc =
|
||||||
|
SRG { srgName = prCId cnc,
|
||||||
|
srgStartCat = cfgStartCat cfg,
|
||||||
|
srgExternalCats = cfgExternalCats cfg,
|
||||||
|
srgLanguage = getSpeechLanguage pgf cnc,
|
||||||
|
srgRules = mkRules cfg }
|
||||||
|
where cfg = renameExternal $ pgfToCFG pgf cnc
|
||||||
|
renameExternal cfg' = mapCFGCats (\c -> if c `Set.member` cfgExternalCats cfg' then c ++ "_cat" else c) 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")
|
||||||
|
|||||||
@@ -32,19 +32,15 @@ srgsXmlNonRecursivePrinter pgf cnc = prSrgsXml Nothing $ makeNonRecursiveSRG pgf
|
|||||||
prSrgsXml :: Maybe SISRFormat -> SRG -> String
|
prSrgsXml :: Maybe SISRFormat -> SRG -> String
|
||||||
prSrgsXml sisr srg = showXMLDoc (optimizeSRGS xmlGr)
|
prSrgsXml sisr srg = showXMLDoc (optimizeSRGS xmlGr)
|
||||||
where
|
where
|
||||||
xmlGr = grammar sisr (externalCat (srgStartCat srg)) (srgLanguage srg) $
|
xmlGr = grammar sisr (srgStartCat srg) (srgLanguage srg) $
|
||||||
[meta "description"
|
[meta "description"
|
||||||
("SRGS XML speech recognition grammar for " ++ srgName srg ++ "."),
|
("SRGS XML speech recognition grammar for " ++ srgName srg ++ "."),
|
||||||
meta "generator" "Grammatical Framework"]
|
meta "generator" "Grammatical Framework"]
|
||||||
++ map ruleToXML (srgRules srg)
|
++ map ruleToXML (srgRules srg)
|
||||||
ruleToXML (SRGRule cat alts)
|
ruleToXML (SRGRule cat alts) = Tag "rule" ([("id",cat)]++pub) (prRhs alts)
|
||||||
| isExternalCat srg cat = Tag "rule" [("id",externalCat cat),("scope","public")] (prRhs alts)
|
where pub = if isExternalCat srg cat then [("scope","public")] else []
|
||||||
| otherwise = Tag "rule" [("id",cat)] (prRhs alts)
|
|
||||||
prRhs rhss = [oneOf (map (mkProd sisr) rhss)]
|
prRhs rhss = [oneOf (map (mkProd sisr) rhss)]
|
||||||
|
|
||||||
externalCat :: Cat -> Cat
|
|
||||||
externalCat c = c ++ "_cat"
|
|
||||||
|
|
||||||
mkProd :: Maybe SISRFormat -> SRGAlt -> XML
|
mkProd :: Maybe SISRFormat -> SRGAlt -> XML
|
||||||
mkProd sisr (SRGAlt mp n rhs) = Tag "item" [] (ti ++ [x] ++ tf)
|
mkProd sisr (SRGAlt mp n rhs) = Tag "item" [] (ti ++ [x] ++ tf)
|
||||||
where x = mkItem sisr n rhs
|
where x = mkItem sisr n rhs
|
||||||
|
|||||||
Reference in New Issue
Block a user