1
0
forked from GitHub/gf-core

Added regexps grammar printer. This is a first step towards recursion-free SRGS.

This commit is contained in:
bringert
2007-06-20 16:08:23 +00:00
parent 91dcc27668
commit 6968004f19
4 changed files with 21 additions and 7 deletions

View File

@@ -52,7 +52,7 @@ type MutRecSets = Map Cat_ MutRecSet
-- --
data MFALabel a = MFASym a | MFASub String data MFALabel a = MFASym a | MFASub String
deriving Eq deriving (Eq,Ord)
data MFA a = MFA (DFA (MFALabel a)) [(String,DFA (MFALabel a))] data MFA a = MFA (DFA (MFALabel a)) [(String,DFA (MFALabel a))]

View File

@@ -8,7 +8,7 @@
-- This module prints a grammar as a regular expression. -- This module prints a grammar as a regular expression.
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
module GF.Speech.PrRegExp (regexpPrinter) where module GF.Speech.PrRegExp (regexpPrinter,multiRegexpPrinter) where
import GF.Conversion.Types import GF.Conversion.Types
import GF.Infra.Ident import GF.Infra.Ident
@@ -20,3 +20,16 @@ import GF.Compile.ShellState (StateGrammar)
regexpPrinter :: Options -> StateGrammar -> String regexpPrinter :: Options -> StateGrammar -> String
regexpPrinter opts s = prRE $ dfa2re $ cfgToFA opts s regexpPrinter opts s = prRE $ dfa2re $ cfgToFA opts s
multiRegexpPrinter :: Options -> StateGrammar -> String
multiRegexpPrinter opts s = prREs $ mfa2res $ cfgToMFA opts s
prREs :: [(String,RE (MFALabel String))] -> String
prREs res = unlines [l ++ " = " ++ prRE (mapRE showLabel re) | (l,re) <- res]
where showLabel (MFASym s) = s
showLabel (MFASub l) = "<" ++ l ++ ">"
mfa2res :: MFA String -> [(String,RE (MFALabel String))]
mfa2res (MFA start dfas) =
[("START",f start)] ++ [(l,f dfa) | (l,dfa) <- dfas]
where f = minimizeRE . dfa2re

View File

@@ -19,14 +19,14 @@ data RE a =
deriving (Eq,Ord,Show) deriving (Eq,Ord,Show)
dfa2re :: (Show a,Ord a) => DFA a -> RE a dfa2re :: (Ord a) => DFA a -> RE a
dfa2re = finalRE . elimStates . modifyTransitions merge . addLoops dfa2re = finalRE . elimStates . modifyTransitions merge . addLoops
. oneFinalState () epsilonRE . mapTransitions RESymbol . oneFinalState () epsilonRE . mapTransitions RESymbol
where addLoops fa = newTransitions [(s,s,nullRE) | (s,_) <- states fa] fa where addLoops fa = newTransitions [(s,s,nullRE) | (s,_) <- states fa] fa
merge es = [(f,t,unionRE ls) merge es = [(f,t,unionRE ls)
| ((f,t),ls) <- buildMultiMap [((f,t),l) | (f,t,l) <- es]] | ((f,t),ls) <- buildMultiMap [((f,t),l) | (f,t,l) <- es]]
elimStates :: (Show a, Ord a) => DFA (RE a) -> DFA (RE a) elimStates :: (Ord a) => DFA (RE a) -> DFA (RE a)
elimStates fa = elimStates fa =
case [s | (s,_) <- states fa, isInternal fa s] of case [s | (s,_) <- states fa, isInternal fa s] of
[] -> fa [] -> fa
@@ -120,10 +120,10 @@ joinRE (RESymbol ss) = ss
-- Debugging -- Debugging
prRE :: Show a => RE a -> String prRE :: RE String -> String
prRE (REUnion []) = "<NULL>" prRE (REUnion []) = "<NULL>"
prRE (REUnion xs) = "(" ++ concat (intersperse " | " (map prRE xs)) ++ ")" prRE (REUnion xs) = "(" ++ concat (intersperse " | " (map prRE xs)) ++ ")"
prRE (REConcat xs) = "(" ++ unwords (map prRE xs) ++ ")" prRE (REConcat xs) = "(" ++ unwords (map prRE xs) ++ ")"
prRE (RERepeat x) = "(" ++ prRE x ++ ")*" prRE (RERepeat x) = "(" ++ prRE x ++ ")*"
prRE (RESymbol s) = show s prRE (RESymbol s) = s

View File

@@ -65,7 +65,7 @@ import GF.Speech.PrSRGS_ABNF
import qualified GF.Speech.SISR as SISR import qualified GF.Speech.SISR as SISR
import GF.Speech.PrSLF import GF.Speech.PrSLF
import GF.Speech.PrFA (faGraphvizPrinter,regularPrinter,faCPrinter) import GF.Speech.PrFA (faGraphvizPrinter,regularPrinter,faCPrinter)
import GF.Speech.PrRegExp (regexpPrinter) import GF.Speech.PrRegExp (regexpPrinter,multiRegexpPrinter)
import GF.Speech.GrammarToVoiceXML (grammar2vxml) import GF.Speech.GrammarToVoiceXML (grammar2vxml)
import GF.Data.Zipper import GF.Data.Zipper
@@ -264,6 +264,7 @@ customGrammarPrinter =
,(strCI "fa_graphviz", faGraphvizPrinter) ,(strCI "fa_graphviz", faGraphvizPrinter)
,(strCI "fa_c", faCPrinter) ,(strCI "fa_c", faCPrinter)
,(strCI "regexp", regexpPrinter) ,(strCI "regexp", regexpPrinter)
,(strCI "regexps", multiRegexpPrinter)
,(strCI "regular", regularPrinter) ,(strCI "regular", regularPrinter)
,(strCI "plbnf", \_ -> prLBNF True) ,(strCI "plbnf", \_ -> prLBNF True)
,(strCI "lbnf", \_ -> prLBNF False) ,(strCI "lbnf", \_ -> prLBNF False)