mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-12 06:19:33 -06:00
72 lines
3.0 KiB
Haskell
72 lines
3.0 KiB
Haskell
----------------------------------------------------------------------
|
|
-- |
|
|
-- Maintainer : PL
|
|
-- Stability : (stable)
|
|
-- Portability : (portable)
|
|
--
|
|
-- > CVS $Date: 2005/08/11 14:11:46 $
|
|
-- > CVS $Author: peb $
|
|
-- > CVS $Revision: 1.1 $
|
|
--
|
|
-- Converting/Printing different grammar formalisms in Haskell-readable format
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
module GF.Conversion.Haskell where
|
|
|
|
import GF.Formalism.GCFG
|
|
import GF.Formalism.SimpleGFC
|
|
import GF.Formalism.MCFG
|
|
import GF.Formalism.CFG
|
|
import GF.Formalism.Utilities
|
|
import GF.Conversion.Types
|
|
import GF.Data.Operations ((++++), (+++++))
|
|
import GF.Infra.Print
|
|
|
|
import Data.List (intersperse)
|
|
|
|
-- | SimpleGFC to Haskell
|
|
prtSGrammar :: SGrammar -> String
|
|
prtSGrammar rules = "-- Simple GFC grammar as a Haskell file" ++++
|
|
"-- Autogenerated from the Grammatical Framework" +++++
|
|
"import GF.Formalism.GCFG" ++++
|
|
"import GF.Formalism.SimpleGFC" ++++
|
|
"import GF.Formalism.Utilities" ++++
|
|
"import GF.Canon.AbsGFC (CIdent(..), Label(..))" ++++
|
|
"import GF.Infra.Ident (Ident(..))" +++++
|
|
"grammar :: SimpleGrammar Ident (NameProfile Ident) String" ++++
|
|
"grammar = \n\t[ " ++
|
|
concat (intersperse "\n\t, " (map show rules)) ++ "\n\t]\n\n"
|
|
|
|
-- | MCFG to Haskell
|
|
prtMGrammar :: MGrammar -> String
|
|
prtMGrammar rules = "-- Multiple context-free grammar as a Haskell file" ++++
|
|
"-- Autogenerated from the Grammatical Framework" +++++
|
|
"import GF.Formalism.GCFG" ++++
|
|
"import GF.Formalism.MCFG" ++++
|
|
"import GF.Formalism.Utilities" +++++
|
|
"grammar :: MCFGrammar String (NameProfile String) String String" ++++
|
|
"grammar = \n\t[ " ++
|
|
concat (intersperse "\n\t, " (map prtMRule rules)) ++ "\n\t]\n\n"
|
|
where prtMRule (Rule (Abs cat cats (Name fun profiles)) (Cnc lcat lcats lins))
|
|
= show (Rule (Abs (prt cat) (map prt cats) (Name (prt fun) (map cnvProfile profiles)))
|
|
(Cnc (map prt lcat) (map (map prt) lcats) (map cnvLin lins)))
|
|
cnvLin (Lin lbl syms) = Lin (prt lbl) (map (mapSymbol prtMArg id) syms)
|
|
prtMArg (cat, lbl, nr) = (prt cat, prt lbl, nr)
|
|
|
|
-- | CFG to Haskell
|
|
prtCGrammar :: CGrammar -> String
|
|
prtCGrammar rules = "-- Context-free grammar as a Haskell file" ++++
|
|
"-- autogenerated from the Grammatical Framework" +++++
|
|
"import GF.Formalism.CFG" ++++
|
|
"import GF.Formalism.Utilities" ++++
|
|
"\ngrammar :: CFGrammar String (NameProfile String) String" ++++
|
|
"grammar = \n\t[ " ++
|
|
concat (intersperse "\n\t, " (map prtCRule rules)) ++ "\n\t]\n\n"
|
|
where prtCRule (CFRule cat syms (Name fun profiles))
|
|
= show (CFRule (prt cat) (map (mapSymbol prt id) syms)
|
|
(Name (prt fun) (map cnvProfile profiles)))
|
|
|
|
cnvProfile (Unify args) = Unify args
|
|
cnvProfile (Constant forest) = Constant (fmap prt forest)
|