1
0
forked from GitHub/gf-core

Added top-down filtering to the GSL printer.

This commit is contained in:
bringert
2006-04-13 13:33:35 +00:00
parent 293a0eb988
commit aa309abecf
3 changed files with 19 additions and 4 deletions

View File

@@ -33,7 +33,7 @@ import Data.Char (toUpper,toLower)
gslPrinter :: Ident -- ^ Grammar name
-> Options -> Maybe Probs -> CGrammar -> String
gslPrinter name opts probs cfg = prGSL srg ""
where srg = makeSimpleSRG name opts probs $ rmPunctCFG cfg
where srg = topDownFilter $ makeSimpleSRG name opts probs $ rmPunctCFG cfg
prGSL :: SRG -> ShowS
prGSL (SRG{grammarName=name,startCat=start,origStartCat=origStart,rules=rs})

View File

@@ -13,7 +13,7 @@
-----------------------------------------------------------------------------
module GF.Speech.Relation (Rel, mkRel
, isRelatedTo
, allRelated , isRelatedTo
, transitiveClosure
, reflexiveClosure, reflexiveClosure_
, symmetricClosure

View File

@@ -20,17 +20,19 @@
module GF.Speech.SRG (SRG(..), SRGRule(..), SRGAlt(..),
makeSimpleSRG, makeSRG
, lookupFM_, prtS) where
, lookupFM_, prtS
, topDownFilter) where
import GF.Data.Operations
import GF.Data.Utilities
import GF.Infra.Ident
import GF.Formalism.CFG
import GF.Formalism.Utilities (Symbol(..), NameProfile(..)
, Profile, SyntaxForest)
, Profile, SyntaxForest, filterCats)
import GF.Conversion.Types
import GF.Infra.Print
import GF.Speech.TransformCFG
import GF.Speech.Relation
import GF.Infra.Option
import GF.Probabilistic.Probabilistic (Probs)
@@ -38,6 +40,8 @@ import Data.List
import Data.Maybe (fromMaybe)
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Set (Set)
import qualified Data.Set as Set
data SRG = SRG { grammarName :: String -- ^ grammar name
, startCat :: String -- ^ start category name
@@ -127,6 +131,17 @@ mkCatNames :: String -- ^ Category name prefix
mkCatNames prefix origNames = Map.fromList (zip origNames names)
where names = [prefix ++ "_" ++ show x | x <- [0..]]
-- | Remove categories which are not reachable from the start category.
topDownFilter :: SRG -> SRG
topDownFilter srg@(SRG { startCat = start, rules = rs }) = srg { rules = rs' }
where
rs' = [ r | r@(SRGRule c _ _) <- rs, c `Set.member` keep]
rhsCats = [ (c,c') | r@(SRGRule c _ ps) <- rs,
SRGAlt _ _ ss <- ps,
c' <- filterCats ss]
keep = allRelated (transitiveClosure $ mkRel rhsCats) start
--
-- * Utilities for building and printing SRGs
--