----------------------------------------------------------------------
-- |
-- Module      : GF.Speech.PrRegExp
--
-- This module prints a grammar as a regular expression.
-----------------------------------------------------------------------------

module GF.Speech.PrRegExp (regexpPrinter,multiRegexpPrinter) where

import GF.Grammar.CFG
import GF.Speech.CFGToFA
import GF.Speech.PGFToCFG
import GF.Speech.RegExp
import PGF

regexpPrinter :: PGF -> CId -> String
regexpPrinter :: PGF -> CId -> String
regexpPrinter PGF
pgf CId
cnc = (String -> String -> String
forall a. [a] -> [a] -> [a]
++String
"\n") (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> String) -> RE String -> String
forall a. (a -> String) -> RE a -> String
prRE String -> String
forall a. a -> a
id (RE String -> String) -> RE String -> String
forall a b. (a -> b) -> a -> b
$ DFA String -> RE String
forall a. Ord a => DFA a -> RE a
dfa2re (DFA String -> RE String) -> DFA String -> RE String
forall a b. (a -> b) -> a -> b
$ CFG -> DFA String
cfgToFA (CFG -> DFA String) -> CFG -> DFA String
forall a b. (a -> b) -> a -> b
$ PGF -> CId -> CFG
pgfToCFG PGF
pgf CId
cnc

multiRegexpPrinter :: PGF -> CId -> String
multiRegexpPrinter :: PGF -> CId -> String
multiRegexpPrinter PGF
pgf CId
cnc = [(String, RE CFSymbol)] -> String
prREs ([(String, RE CFSymbol)] -> String)
-> [(String, RE CFSymbol)] -> String
forall a b. (a -> b) -> a -> b
$ MFA -> [(String, RE CFSymbol)]
mfa2res (MFA -> [(String, RE CFSymbol)]) -> MFA -> [(String, RE CFSymbol)]
forall a b. (a -> b) -> a -> b
$ CFG -> MFA
cfgToMFA (CFG -> MFA) -> CFG -> MFA
forall a b. (a -> b) -> a -> b
$ PGF -> CId -> CFG
pgfToCFG PGF
pgf CId
cnc

prREs :: [(String,RE CFSymbol)] -> String
prREs :: [(String, RE CFSymbol)] -> String
prREs [(String, RE CFSymbol)]
res = [String] -> String
unlines [String
l String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (String -> String) -> RE String -> String
forall a. (a -> String) -> RE a -> String
prRE String -> String
forall a. a -> a
id ((CFSymbol -> String) -> RE CFSymbol -> RE String
forall a b. (a -> b) -> RE a -> RE b
mapRE CFSymbol -> String
showLabel RE CFSymbol
re) | (String
l,RE CFSymbol
re) <- [(String, RE CFSymbol)]
res]
  where showLabel :: CFSymbol -> String
showLabel = (String -> String) -> (String -> String) -> CFSymbol -> String
forall c a t. (c -> a) -> (t -> a) -> Symbol c t -> a
symbol (\String
l -> String
"<" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
l String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
">") String -> String
forall a. a -> a
id

mfa2res :: MFA -> [(String,RE CFSymbol)]
mfa2res :: MFA -> [(String, RE CFSymbol)]
mfa2res (MFA String
_ [(String, DFA CFSymbol)]
dfas) = [(String
l, RE CFSymbol -> RE CFSymbol
forall a. Ord a => RE a -> RE a
minimizeRE (DFA CFSymbol -> RE CFSymbol
forall a. Ord a => DFA a -> RE a
dfa2re DFA CFSymbol
dfa)) | (String
l,DFA CFSymbol
dfa) <- [(String, DFA CFSymbol)]
dfas]