1
0
forked from GitHub/gf-core

Removed cycles when building SRGs, to avoid getting left-recursive grammars.

This commit is contained in:
bringert
2006-04-13 14:47:37 +00:00
parent c5d0416996
commit dbfef31538
2 changed files with 5 additions and 3 deletions

View File

@@ -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.

View File

@@ -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