mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 11:42:49 -06:00
Added --output-format=ebnf.
This commit is contained in:
@@ -14,6 +14,7 @@ import GF.Speech.SRGS_ABNF
|
|||||||
import GF.Speech.SRGS_XML
|
import GF.Speech.SRGS_XML
|
||||||
import GF.Speech.JSGF
|
import GF.Speech.JSGF
|
||||||
import GF.Speech.GSL
|
import GF.Speech.GSL
|
||||||
|
import GF.Speech.SRG (ebnfPrinter)
|
||||||
import GF.Speech.VoiceXML
|
import GF.Speech.VoiceXML
|
||||||
import GF.Speech.SLF
|
import GF.Speech.SLF
|
||||||
import GF.Speech.PrRegExp
|
import GF.Speech.PrRegExp
|
||||||
@@ -37,6 +38,7 @@ exportPGF opts fmt pgf =
|
|||||||
FmtProlog -> multi "pl" grammar2prolog
|
FmtProlog -> multi "pl" grammar2prolog
|
||||||
FmtProlog_Abs -> multi "pl" grammar2prolog_abs
|
FmtProlog_Abs -> multi "pl" grammar2prolog_abs
|
||||||
FmtBNF -> single "bnf" bnfPrinter
|
FmtBNF -> single "bnf" bnfPrinter
|
||||||
|
FmtEBNF -> single "ebnf" ebnfPrinter
|
||||||
FmtNoLR -> single "bnf" nonLeftRecursivePrinter
|
FmtNoLR -> single "bnf" nonLeftRecursivePrinter
|
||||||
FmtRegular -> single "bnf" regularPrinter
|
FmtRegular -> single "bnf" regularPrinter
|
||||||
FmtFCFG -> single "fcfg" fcfgPrinter
|
FmtFCFG -> single "fcfg" fcfgPrinter
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ data OutputFormat = FmtPGF
|
|||||||
| FmtProlog
|
| FmtProlog
|
||||||
| FmtProlog_Abs
|
| FmtProlog_Abs
|
||||||
| FmtBNF
|
| FmtBNF
|
||||||
|
| FmtEBNF
|
||||||
| FmtRegular
|
| FmtRegular
|
||||||
| FmtNoLR
|
| FmtNoLR
|
||||||
| FmtFCFG
|
| FmtFCFG
|
||||||
@@ -458,6 +459,7 @@ outputFormats =
|
|||||||
("prolog", FmtProlog),
|
("prolog", FmtProlog),
|
||||||
("prolog_abs", FmtProlog_Abs),
|
("prolog_abs", FmtProlog_Abs),
|
||||||
("bnf", FmtBNF),
|
("bnf", FmtBNF),
|
||||||
|
("ebnf", FmtEBNF),
|
||||||
("regular", FmtRegular),
|
("regular", FmtRegular),
|
||||||
("nolr", FmtNoLR),
|
("nolr", FmtNoLR),
|
||||||
("fcfg", FmtFCFG),
|
("fcfg", FmtFCFG),
|
||||||
|
|||||||
@@ -14,13 +14,13 @@ import GF.Speech.RegExp
|
|||||||
import PGF
|
import PGF
|
||||||
|
|
||||||
regexpPrinter :: PGF -> CId -> String
|
regexpPrinter :: PGF -> CId -> String
|
||||||
regexpPrinter pgf cnc = (++"\n") $ prRE $ dfa2re $ cfgToFA $ pgfToCFG pgf cnc
|
regexpPrinter pgf cnc = (++"\n") $ prRE id $ dfa2re $ cfgToFA $ pgfToCFG pgf cnc
|
||||||
|
|
||||||
multiRegexpPrinter :: PGF -> CId -> String
|
multiRegexpPrinter :: PGF -> CId -> String
|
||||||
multiRegexpPrinter pgf cnc = prREs $ mfa2res $ cfgToMFA $ pgfToCFG pgf cnc
|
multiRegexpPrinter pgf cnc = prREs $ mfa2res $ cfgToMFA $ pgfToCFG pgf cnc
|
||||||
|
|
||||||
prREs :: [(String,RE CFSymbol)] -> String
|
prREs :: [(String,RE CFSymbol)] -> String
|
||||||
prREs res = unlines [l ++ " = " ++ prRE (mapRE showLabel re) | (l,re) <- res]
|
prREs res = unlines [l ++ " = " ++ prRE id (mapRE showLabel re) | (l,re) <- res]
|
||||||
where showLabel = symbol (\l -> "<" ++ l ++ ">") id
|
where showLabel = symbol (\l -> "<" ++ l ++ ">") id
|
||||||
|
|
||||||
mfa2res :: MFA -> [(String,RE CFSymbol)]
|
mfa2res :: MFA -> [(String,RE CFSymbol)]
|
||||||
|
|||||||
@@ -130,14 +130,14 @@ symbolsRE (RESymbol x) = [x]
|
|||||||
|
|
||||||
-- Debugging
|
-- Debugging
|
||||||
|
|
||||||
prRE :: RE String -> String
|
prRE :: (a -> String) -> RE a -> String
|
||||||
prRE = prRE' 0
|
prRE = prRE' 0
|
||||||
|
|
||||||
prRE' _ (REUnion []) = "<NULL>"
|
prRE' _ _ (REUnion []) = "<NULL>"
|
||||||
prRE' n (REUnion xs) = p n 1 (concat (intersperse " | " (map (prRE' 1) xs)))
|
prRE' n f (REUnion xs) = p n 1 (concat (intersperse " | " (map (prRE' 1 f) xs)))
|
||||||
prRE' n (REConcat xs) = p n 2 (unwords (map (prRE' 2) xs))
|
prRE' n f (REConcat xs) = p n 2 (unwords (map (prRE' 2 f) xs))
|
||||||
prRE' n (RERepeat x) = p n 3 (prRE' 3 x) ++ "*"
|
prRE' n f (RERepeat x) = p n 3 (prRE' 3 f x) ++ "*"
|
||||||
prRE' _ (RESymbol s) = s
|
prRE' _ f (RESymbol s) = f s
|
||||||
|
|
||||||
p n m s | n >= m = "(" ++ s ++ ")"
|
p n m s | n >= m = "(" ++ s ++ ")"
|
||||||
| True = s
|
| True = s
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
module GF.Speech.SRG (SRG(..), SRGRule(..), SRGAlt(..), SRGItem, SRGSymbol
|
module GF.Speech.SRG (SRG(..), SRGRule(..), SRGAlt(..), SRGItem, SRGSymbol
|
||||||
, SRGNT, CFTerm
|
, SRGNT, CFTerm
|
||||||
|
, ebnfPrinter
|
||||||
, makeSimpleSRG
|
, makeSimpleSRG
|
||||||
, makeNonRecursiveSRG
|
, makeNonRecursiveSRG
|
||||||
, getSpeechLanguage
|
, getSpeechLanguage
|
||||||
@@ -65,9 +66,17 @@ type SRGSymbol = Symbol SRGNT Token
|
|||||||
type SRGNT = (Cat, Int)
|
type SRGNT = (Cat, Int)
|
||||||
|
|
||||||
|
|
||||||
|
ebnfPrinter :: PGF -> CId -> String
|
||||||
|
ebnfPrinter pgf cnc = prSRG $ makeSRG id pgf cnc
|
||||||
|
|
||||||
|
makeSRG :: (CFG -> CFG) -> PGF -> CId -> SRG
|
||||||
|
makeSRG preproces = mkSRG cfgToSRG id
|
||||||
|
where
|
||||||
|
cfgToSRG cfg = [cfRulesToSRGRule rs | (_,rs) <- allRulesGrouped cfg]
|
||||||
|
|
||||||
-- | Create a compact filtered non-left-recursive SRG.
|
-- | Create a compact filtered non-left-recursive SRG.
|
||||||
makeSimpleSRG :: PGF -> CId -> SRG
|
makeSimpleSRG :: PGF -> CId -> SRG
|
||||||
makeSimpleSRG = mkSRG cfgToSRG preprocess
|
makeSimpleSRG = makeSRG preprocess
|
||||||
where
|
where
|
||||||
preprocess = traceStats "After mergeIdentical"
|
preprocess = traceStats "After mergeIdentical"
|
||||||
. mergeIdentical
|
. mergeIdentical
|
||||||
@@ -80,7 +89,6 @@ makeSimpleSRG = mkSRG cfgToSRG preprocess
|
|||||||
. traceStats "After removeCycles"
|
. traceStats "After removeCycles"
|
||||||
. removeCycles
|
. removeCycles
|
||||||
. traceStats "Inital CFG"
|
. traceStats "Inital CFG"
|
||||||
cfgToSRG cfg = [cfRulesToSRGRule rs | (_,rs) <- allRulesGrouped cfg]
|
|
||||||
|
|
||||||
traceStats s g = trace ("---- " ++ s ++ ": " ++ stats g {- ++ "\n" ++ prCFRules g ++ "----" -}) g
|
traceStats s g = trace ("---- " ++ s ++ ": " ++ stats g {- ++ "\n" ++ prCFRules g ++ "----" -}) g
|
||||||
|
|
||||||
@@ -165,6 +173,13 @@ ungroupTokens = joinRE . mapRE (symbol (RESymbol . NonTerminal) (REConcat . map
|
|||||||
-- * Utilities for building and printing SRGs
|
-- * Utilities for building and printing SRGs
|
||||||
--
|
--
|
||||||
|
|
||||||
|
prSRG :: SRG -> String
|
||||||
|
prSRG = unlines . map prRule . srgRules
|
||||||
|
where
|
||||||
|
prRule (SRGRule c alts) = c ++ " ::= " ++ unwords (intersperse "|" (map prAlt alts))
|
||||||
|
prAlt (SRGAlt _ _ rhs) = prRE prSym rhs
|
||||||
|
prSym = symbol fst (\t -> "\""++ t ++"\"")
|
||||||
|
|
||||||
lookupFM_ :: (Ord key, Show key) => Map key elt -> key -> elt
|
lookupFM_ :: (Ord key, Show key) => Map key elt -> key -> elt
|
||||||
lookupFM_ fm k = Map.findWithDefault err k fm
|
lookupFM_ fm k = Map.findWithDefault err k fm
|
||||||
where err = error $ "Key not found: " ++ show k
|
where err = error $ "Key not found: " ++ show k
|
||||||
|
|||||||
Reference in New Issue
Block a user