summaryrefslogtreecommitdiff
path: root/src/GF
diff options
context:
space:
mode:
authorbringert <bringert@cs.chalmers.se>2006-04-13 14:47:37 +0000
committerbringert <bringert@cs.chalmers.se>2006-04-13 14:47:37 +0000
commitdbfef31538e1bb96cdfe8f17884559fdf6ad680f (patch)
tree52d8364e2f11498c25d1a4bf916aec95fdd519ef /src/GF
parentc5d0416996eb05fd820c569a177abaf09268ed15 (diff)
Removed cycles when building SRGs, to avoid getting left-recursive grammars.
Diffstat (limited to 'src/GF')
-rw-r--r--src/GF/Speech/SRG.hs2
-rw-r--r--src/GF/Speech/TransformCFG.hs6
2 files changed, 5 insertions, 3 deletions
diff --git a/src/GF/Speech/SRG.hs b/src/GF/Speech/SRG.hs
index 8080b941f..03204d888 100644
--- a/src/GF/Speech/SRG.hs
+++ b/src/GF/Speech/SRG.hs
@@ -74,7 +74,7 @@ makeSimpleSRG :: Ident -- ^ Grammar name
-> CGrammar -- ^ A context-free grammar
-> SRG
makeSimpleSRG
- = makeSRG_ (removeLeftRecursion . removeIdenticalRules . removeEmptyCats)
+ = makeSRG_ (removeLeftRecursion . removeIdenticalRules . removeEmptyCats . removeCycles)
-- | Create a SRG preserving the names, profiles and probabilities of the
-- input grammar. The returned grammar may be left-recursive.
diff --git a/src/GF/Speech/TransformCFG.hs b/src/GF/Speech/TransformCFG.hs
index a1feaa420..acb78f82d 100644
--- a/src/GF/Speech/TransformCFG.hs
+++ b/src/GF/Speech/TransformCFG.hs
@@ -100,8 +100,7 @@ removeLeftRecursion rs = removeDirectLeftRecursions $ map handleProds rs
[CFRule ai (beta ++ alpha) n | CFRule _ beta _ <- lookup' aj rs]
handleProd r = [r]
-removeDirectLeftRecursions :: [(Cat_,[CFRule_])] -- ^ All productions for a category
- -> CFRules
+removeDirectLeftRecursions :: CFRules -> CFRules
removeDirectLeftRecursions = concat . flip evalState 0 . mapM removeDirectLeftRecursion
removeDirectLeftRecursion :: (Cat_,[CFRule_]) -- ^ All productions for a category
@@ -124,6 +123,9 @@ isDirectLeftRecursive :: CFRule_ -> Bool
isDirectLeftRecursive (CFRule c (Cat c':_) _) = c == c'
isDirectLeftRecursive _ = False
+removeCycles :: CFRules -> CFRules
+removeCycles = groupProds . removeCycles_ . ungroupProds
+ where removeCycles_ rs = [r | r@(CFRule c rhs n) <- rs, rhs /= [Cat c]]
--
-- * CFG rule utilities