summaryrefslogtreecommitdiff
path: root/src/GF/Conversion/Prolog.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/GF/Conversion/Prolog.hs')
-rw-r--r--src/GF/Conversion/Prolog.hs205
1 files changed, 0 insertions, 205 deletions
diff --git a/src/GF/Conversion/Prolog.hs b/src/GF/Conversion/Prolog.hs
deleted file mode 100644
index b930cb476..000000000
--- a/src/GF/Conversion/Prolog.hs
+++ /dev/null
@@ -1,205 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Maintainer : PL
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/09/14 09:51:18 $
--- > CVS $Author: peb $
--- > CVS $Revision: 1.4 $
---
--- Converting/Printing different grammar formalisms in Prolog-readable format
------------------------------------------------------------------------------
-
-
-module GF.Conversion.Prolog (prtSGrammar, prtSMulti, prtSHeader, prtSRule,
- prtMGrammar, prtMMulti, prtMHeader, prtMRule,
- prtCGrammar, prtCMulti, prtCHeader, prtCRule) 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 qualified GF.Conversion.GFC as Cnv
-
-import GF.Data.Operations ((++++), (+++++))
-import GF.Infra.Print
-import qualified GF.Infra.Modules as Mod
-import qualified GF.Infra.Option as Option
-import GF.Data.Operations (okError)
-import GF.Canon.AbsGFC (Flag(..))
-import GF.Canon.GFC (CanonGrammar)
-import GF.Infra.Ident (Ident(..))
-
-import Data.Maybe (maybeToList, listToMaybe)
-import Data.Char (isLower, isAlphaNum)
-
-import GF.System.Tracing
-
-----------------------------------------------------------------------
--- | printing multiple languages at the same time
-
-prtSMulti, prtMMulti, prtCMulti :: Option.Options -> CanonGrammar -> String
-prtSMulti = prtMulti prtSHeader prtSRule Cnv.gfc2simple "gfc_"
-prtMMulti = prtMulti prtMHeader prtMRule Cnv.gfc2mcfg "mcfg_"
-prtCMulti = prtMulti prtCHeader prtCRule Cnv.gfc2cfg "cfg_"
-
--- code and ideas stolen from GF.CFGM.PrintCFGrammar
-
-prtMulti prtHeader prtRule conversion prefix opts gr
- = prtHeader ++++ unlines
- [ "\n\n" ++ prtLine ++++
- "%% Language module: " ++ prtQ langmod +++++
- unlines (map (prtRule langmod) rules) |
- lang <- maybe [] (Mod.allConcretes gr) (Mod.greatestAbstract gr),
- let Mod.ModMod (Mod.Module{Mod.flags=fs}) = okError (Mod.lookupModule gr lang),
- let cnvopts = Option.Opts $ map Option.gfcConversion $ getFlag fs "conversion",
- let rules = conversion cnvopts (gr, lang),
- let langmod = (let IC lg = lang in prefix ++ lg) ]
-
-getFlag :: [Flag] -> String -> [String]
-getFlag fs x = [v | Flg (IC k) (IC v) <- fs, k == x]
-
-----------------------------------------------------------------------
--- | SimpleGFC to Prolog
---
--- assumes that the profiles in the Simple GFC names are trivial
-prtSGrammar :: SGrammar -> String
-prtSGrammar rules = prtSHeader +++++ unlines (map (prtSRule "") rules)
-
-prtSHeader :: String
-prtSHeader = prtLine ++++
- "%% Simple GFC grammar in Prolog-readable format" ++++
- "%% Autogenerated from the Grammatical Framework" +++++
- "%% The following predicate is defined:" ++++
- "%% \t rule(Fun, Cat, c(Cat,...), LinTerm)"
-
-prtSRule :: String -> SRule -> String
-prtSRule lang (Rule (Abs cat cats (Name fun _prof)) (Cnc _ _ mterm))
- = (if null lang then "" else prtQ lang ++ " : ") ++
- prtFunctor "rule" [plfun, plcat, plcats, plcnc] ++ "."
- where plfun = prtQ fun
- plcat = prtSDecl cat
- plcats = prtFunctor "c" (map prtSDecl cats)
- plcnc = "\n\t" ++ prtSTerm (maybe Empty id mterm)
-
-prtSTerm (Arg n c p) = prtFunctor "arg" [prtQ c, prt (n+1), prtSPath p]
--- prtSTerm (c :^ []) = prtQ c
-prtSTerm (c :^ ts) = prtOper "^" (prtQ c) (prtPList (map prtSTerm ts))
-prtSTerm (Rec rec) = prtFunctor "rec" [prtPList [ prtOper "=" (prtQ l) (prtSTerm t) | (l, t) <- rec ]]
-prtSTerm (Tbl tbl) = prtFunctor "tbl" [prtPList [ prtOper "=" (prtSTerm p) (prtSTerm t) | (p, t) <- tbl ]]
-prtSTerm (Variants ts) = prtFunctor "variants" [prtPList (map prtSTerm ts)]
-prtSTerm (t1 :++ t2) = prtOper "+" (prtSTerm t1) (prtSTerm t2)
-prtSTerm (Token t) = prtFunctor "tok" [prtQ t]
-prtSTerm (Empty) = "empty"
-prtSTerm (term :. lbl) = prtOper "*" (prtSTerm term) (prtQ lbl)
-prtSTerm (term :! sel) = prtOper "/" (prtSTerm term) (prtSTerm sel)
--- prtSTerm (Wildcard) = "wildcard"
--- prtSTerm (Var var) = prtFunctor "var" [prtQ var]
-
-prtSPath (Path path) = prtPList (map (either prtQ prtSTerm) path)
-
-prtSDecl (Decl var typ) | var == anyVar = prtSAbsType typ
- | otherwise = "_" ++ prtVar var ++ ":" ++ prtSAbsType typ
-
-
-prtSAbsType ([] ::--> typ) = prtSFOType typ
-prtSAbsType (args ::--> typ) = prtOper ":->" (prtPList (map prtSFOType args)) (prtSFOType typ)
-
-prtSFOType (cat ::@ args) = prtFunctor (prtQ cat) (map prtSTTerm args)
-
-prtSTTerm (con :@ args) = prtFunctor (prtQ con) (map prtSTTerm args)
-prtSTTerm (TVar var) = "_" ++ prtVar var
-
-----------------------------------------------------------------------
--- | MCFG to Prolog
-prtMGrammar :: MGrammar -> String
-prtMGrammar rules = prtMHeader +++++ unlines (map (prtMRule "") rules)
-
-prtMHeader :: String
-prtMHeader = prtLine ++++
- "%% Multiple context-free grammar in Prolog-readable format" ++++
- "%% Autogenerated from the Grammatical Framework" +++++
- "%% The following predicate is defined:" ++++
- "%% \t rule(Profile, Cat, c(Cat,...), [Lbl=Symbols,...])"
-
-prtMRule :: String -> MRule -> String
-prtMRule lang (Rule (Abs cat cats name) (Cnc _lcat _lcats lins))
- = (if null lang then "" else prtQ lang ++ " : ") ++
- prtFunctor "rule" [plname, plcat, plcats, pllins] ++ "."
- where plname = prtName name
- plcat = prtQ cat
- plcats = prtFunctor "c" (map prtQ cats)
- pllins = "\n\t[ " ++ prtSep "\n\t, " (map prtMLin lins) ++ " ]"
-
-prtMLin (Lin lbl lin) = prtOper "=" (prtQ lbl) (prtPList (map prtMSymbol lin))
-
-prtMSymbol (Cat (cat, lbl, nr)) = prtFunctor "arg" [prtQ cat, show (nr+1), prtQ lbl]
-prtMSymbol (Tok tok) = prtFunctor "tok" [prtQ tok]
-
-----------------------------------------------------------------------
--- | CFG to Prolog
-prtCGrammar :: CGrammar -> String
-prtCGrammar rules = prtCHeader +++++ unlines (map (prtCRule "") rules)
-
-prtCHeader :: String
-prtCHeader = prtLine ++++
- "%% Context-free grammar in Prolog-readable format" ++++
- "%% Autogenerated from the Grammatical Framework" +++++
- "%% The following predicate is defined:" ++++
- "%% \t rule(Profile, Cat, [Symbol,...])"
-
-prtCRule :: String -> CRule -> String
-prtCRule lang (CFRule cat syms name)
- = (if null lang then "" else prtQ lang ++ " : ") ++
- prtFunctor "cfgrule" [plname, plcat, plsyms] ++ "."
- where plname = prtName name
- plcat = prtQ cat
- plsyms = prtPList (map prtCSymbol syms)
-
-prtCSymbol (Cat cat) = prtFunctor "cat" [prtQ cat]
-prtCSymbol (Tok tok) = prtFunctor "tok" [prtQ tok]
-
-----------------------------------------------------------------------
--- profiles, quoted strings and more
-
-prtFunctor f xs = f ++ if null xs then "" else "(" ++ prtSep ", " xs ++ ")"
-prtPList xs = "[" ++ prtSep ", " xs ++ "]"
-prtOper f x y = "(" ++ x ++ " " ++ f ++ " " ++ y ++ ")"
-
-prtName name@(Name fun profiles)
- | name == coercionName = "1"
- | and (zipWith (==) profiles (map (Unify . return) [0..])) = prtQ fun
- | otherwise = prtFunctor (prtQ fun) (map prtProfile profiles)
-
-prtProfile (Unify []) = " ? "
-prtProfile (Unify args) = foldr1 (prtOper "=") (map (show . succ) args)
-prtProfile (Constant forest) = prtForest forest
-
-prtForest (FMeta) = " ? "
-prtForest (FNode fun [fs]) = prtFunctor (prtQ fun) (map prtForest fs)
-prtForest (FNode fun fss) = prtPList [ prtFunctor (prtQ fun) (map prtForest fs) |
- fs <- fss ]
-
-prtQ atom = prtQStr (prt atom)
-
-prtQStr atom@(x:xs)
- | isLower x && all isAlphaNumUnder xs = atom
- where isAlphaNumUnder '_' = True
- isAlphaNumUnder x = isAlphaNum x
-prtQStr atom = "'" ++ concatMap esc (prt atom) ++ "'"
- where esc '\'' = "\\'"
- esc '\n' = "\\n"
- esc '\t' = "\\t"
- esc c = [c]
-
-prtVar var = reprime (prt var)
- where reprime "" = ""
- reprime ('\'' : cs) = "_0" ++ reprime cs
- reprime (c:cs) = c : reprime cs
-
-prtLine = replicate 70 '%'
-
-