summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbjorn <bjorn@bringert.net>2008-09-25 13:41:07 +0000
committerbjorn <bjorn@bringert.net>2008-09-25 13:41:07 +0000
commitb114cfda7736394a5a38f2c1bf731f08f1501eca (patch)
tree6682094d8ce163583500569bde22fd949c472399
parent13191ac15504efc3a45777fb28d594106582f827 (diff)
Added --output-format=nolr. Minor makeRegular refactoring.
-rw-r--r--src/GF/Compile/Export.hs1
-rw-r--r--src/GF/Infra/Option.hs2
-rw-r--r--src/GF/Speech/CFG.hs7
-rw-r--r--src/GF/Speech/PGFToCFG.hs13
4 files changed, 16 insertions, 7 deletions
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