forked from GitHub/gf-core
45 lines
1.3 KiB
Haskell
45 lines
1.3 KiB
Haskell
module GF.Compile.Export where
|
|
|
|
import PGF.CId
|
|
import PGF.Data (PGF(..))
|
|
import PGF.Raw.Print (printTree)
|
|
import PGF.Raw.Convert (fromPGF)
|
|
import GF.Compile.GFCCtoHaskell
|
|
import GF.Compile.GFCCtoJS
|
|
import GF.Infra.Option
|
|
import GF.Speech.CFG
|
|
import GF.Speech.PGFToCFG
|
|
import GF.Speech.SRGS_XML
|
|
import GF.Speech.JSGF
|
|
import GF.Speech.VoiceXML
|
|
import GF.Text.UTF8
|
|
|
|
-- top-level access to code generation
|
|
|
|
prPGF :: OutputFormat
|
|
-> PGF
|
|
-> String -- ^ Output name, for example used for generated Haskell
|
|
-- module name.
|
|
-> String
|
|
prPGF fmt gr name = case fmt of
|
|
FmtPGF -> printPGF gr
|
|
FmtJavaScript -> pgf2js gr
|
|
FmtHaskell -> grammar2haskell gr name
|
|
FmtHaskell_GADT -> grammar2haskellGADT gr name
|
|
FmtBNF -> prCFG $ pgfToCFG gr (outputConcr gr)
|
|
FmtSRGS_XML -> srgsXmlPrinter Nothing gr (outputConcr gr)
|
|
FmtJSGF -> jsgfPrinter Nothing gr (outputConcr gr)
|
|
FmtVoiceXML -> grammar2vxml gr (outputConcr gr)
|
|
|
|
|
|
|
|
-- | Get the name of the concrete syntax to generate output from.
|
|
-- FIXME: there should be an option to change this.
|
|
outputConcr :: PGF -> CId
|
|
outputConcr pgf = case cncnames pgf of
|
|
[] -> error "No concrete syntax."
|
|
cnc:_ -> cnc
|
|
|
|
printPGF :: PGF -> String
|
|
printPGF = encodeUTF8 . printTree . fromPGF
|