From dbfef31538e1bb96cdfe8f17884559fdf6ad680f Mon Sep 17 00:00:00 2001 From: bringert Date: Thu, 13 Apr 2006 14:47:37 +0000 Subject: [PATCH] Removed cycles when building SRGs, to avoid getting left-recursive grammars. --- src/GF/Speech/SRG.hs | 2 +- src/GF/Speech/TransformCFG.hs | 6 ++++-- 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