From 3dacf21a416511e88659d20bbcec284e70b85ec7 Mon Sep 17 00:00:00 2001 From: bringert Date: Mon, 19 Mar 2007 18:03:19 +0000 Subject: Use makeSimpleSRG everywhere and remove makeSRG. Reimplemented top-down filtering in terms of CFRules instead of SRG. Do top-down filtering in makeSimpleSRG. --- src/GF/Speech/TransformCFG.hs | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/GF/Speech/TransformCFG.hs') diff --git a/src/GF/Speech/TransformCFG.hs b/src/GF/Speech/TransformCFG.hs index 37d90fb52..63078ac5c 100644 --- a/src/GF/Speech/TransformCFG.hs +++ b/src/GF/Speech/TransformCFG.hs @@ -227,6 +227,15 @@ removeCycles :: CFRules -> CFRules removeCycles = groupProds . removeCycles_ . ungroupProds where removeCycles_ rs = [r | r@(CFRule c rhs _) <- rs, rhs /= [Cat c]] +-- * Top-down filtering + +-- | Remove categories which are not reachable from the start category. +topDownFilter :: Cat_ -> CFRules -> CFRules +topDownFilter start rules = filter ((`Set.member` keep) . fst) rules + where + rhsCats = [ (c, c') | (c,rs) <- rules, r <- rs, c' <- filterCats (ruleRhs r) ] + uses = reflexiveClosure_ (allCats rules) $ transitiveClosure $ mkRel rhsCats + keep = allRelated uses start -- | Get the sets of mutually recursive non-terminals for a grammar. mutRecCats :: Bool -- ^ If true, all categories will be in some set. -- cgit v1.2.3