Do top-down and bottom-up filtering together to a fixed point.

This commit is contained in:
bringert
2007-03-20 21:59:36 +00:00
parent c2dd74f33e
commit 4d369e096f
2 changed files with 5 additions and 7 deletions

View File

@@ -96,8 +96,7 @@ makeSimpleSRG opt s =
l = fmap (replace '_' '-') $ getOptVal opts speechLanguage
(cats,cfgRules) = unzip $ preprocess $ cfgToCFRules s
preprocess = removeLeftRecursion origStart
. bottomUpFilter
. topDownFilter origStart
. fix (topDownFilter origStart . bottomUpFilter)
. removeIdenticalRules
. removeCycles
names = mkCatNames name cats

View File

@@ -93,12 +93,10 @@ removeCycles :: CFRules -> CFRules
removeCycles = groupProds . removeCycles_ . ungroupProds
where removeCycles_ rs = [r | r@(CFRule c rhs _) <- rs, rhs /= [Cat c]]
-- | Removes productions which use categories which have no productions
-- | Removes productions which use categories which have no productions.
-- Only does one pass through the grammar.
bottomUpFilter :: CFRules -> CFRules
bottomUpFilter = fix removeEmptyCats'
where
removeEmptyCats' :: CFRules -> CFRules
removeEmptyCats' rs = k'
bottomUpFilter rs = k'
where
keep = filter (not . null . snd) rs
allCats = nub [c | (_,r) <- rs, CFRule _ rhs _ <- r, Cat c <- rhs]
@@ -106,6 +104,7 @@ bottomUpFilter = fix removeEmptyCats'
k' = map (\ (c,xs) -> (c, filter (not . anyUsedBy emptyCats) xs)) keep
-- | Removes categories which are not reachable from the start category.
-- Only does one pass through the grammar.
topDownFilter :: Cat_ -> CFRules -> CFRules
topDownFilter start rules = filter ((`Set.member` keep) . fst) rules
where