diff --git a/src/GF/Compile/Export.hs b/src/GF/Compile/Export.hs index 36a001c51..d36fe2634 100644 --- a/src/GF/Compile/Export.hs +++ b/src/GF/Compile/Export.hs @@ -37,6 +37,7 @@ exportPGF opts fmt pgf = FmtProlog -> multi "pl" grammar2prolog FmtProlog_Abs -> multi "pl" grammar2prolog_abs FmtBNF -> single "bnf" bnfPrinter + FmtNoLR -> single "bnf" nonLeftRecursivePrinter FmtRegular -> single "bnf" regularPrinter FmtFCFG -> single "fcfg" fcfgPrinter FmtSRGS_XML -> single "grxml" (srgsXmlPrinter sisr) diff --git a/src/GF/Infra/Option.hs b/src/GF/Infra/Option.hs index b6c25a8fe..bf530ff4e 100644 --- a/src/GF/Infra/Option.hs +++ b/src/GF/Infra/Option.hs @@ -88,6 +88,7 @@ data OutputFormat = FmtPGF | FmtProlog_Abs | FmtBNF | FmtRegular + | FmtNoLR | FmtFCFG | FmtSRGS_XML | FmtSRGS_XML_NonRec @@ -458,6 +459,7 @@ outputFormats = ("prolog_abs", FmtProlog_Abs), ("bnf", FmtBNF), ("regular", FmtRegular), + ("nolr", FmtNoLR), ("fcfg", FmtFCFG), ("srgs_xml", FmtSRGS_XML), ("srgs_xml_nonrec", FmtSRGS_XML_NonRec), diff --git a/src/GF/Speech/CFG.hs b/src/GF/Speech/CFG.hs index 5b2a0f2ca..b8857a288 100644 --- a/src/GF/Speech/CFG.hs +++ b/src/GF/Speech/CFG.hs @@ -190,14 +190,13 @@ makeSimpleRegular = makeRegular . topDownFilter . bottomUpFilter . removeCycles -- Use the transformation algorithm from \"Regular Approximation of Context-free -- Grammars through Approximation\", Mohri and Nederhof, 2000 --- to create an over-generating regular frammar for a context-free +-- to create an over-generating regular grammar for a context-free -- grammar makeRegular :: CFG -> CFG makeRegular g = g { cfgRules = groupProds $ concatMap trSet (mutRecCats True g) } where trSet cs | allXLinear cs rs = rs - | otherwise = concatMap handleCat csl - where csl = Set.toList cs - rs = catSetRules g cs + | otherwise = concatMap handleCat (Set.toList cs) + where rs = catSetRules g cs handleCat c = [CFRule c' [] (mkCFTerm (c++"-empty"))] -- introduce A' -> e ++ concatMap (makeRightLinearRules c) (catRules g c) where c' = newCat c diff --git a/src/GF/Speech/PGFToCFG.hs b/src/GF/Speech/PGFToCFG.hs index d52c8807c..6b834d1a4 100644 --- a/src/GF/Speech/PGFToCFG.hs +++ b/src/GF/Speech/PGFToCFG.hs @@ -4,7 +4,8 @@ -- -- Approximates PGF grammars with context-free grammars. ---------------------------------------------------------------------- -module GF.Speech.PGFToCFG (bnfPrinter, regularPrinter, fcfgPrinter, pgfToCFG) where +module GF.Speech.PGFToCFG (bnfPrinter, nonLeftRecursivePrinter, regularPrinter, + fcfgPrinter, pgfToCFG) where import PGF.CId import PGF.Data as PGF @@ -21,10 +22,16 @@ import Data.Set (Set) import qualified Data.Set as Set bnfPrinter :: PGF -> CId -> String -bnfPrinter pgf cnc = prCFG $ pgfToCFG pgf cnc +bnfPrinter = toBNF id + +nonLeftRecursivePrinter :: PGF -> CId -> String +nonLeftRecursivePrinter = toBNF removeLeftRecursion regularPrinter :: PGF -> CId -> String -regularPrinter pgf cnc = prCFG $ makeSimpleRegular $ pgfToCFG pgf cnc +regularPrinter = toBNF makeRegular + +toBNF :: (CFG -> CFG) -> PGF -> CId -> String +toBNF f pgf cnc = prCFG $ f $ pgfToCFG pgf cnc -- FIXME: move this somewhere else fcfgPrinter :: PGF -> CId -> String