summaryrefslogtreecommitdiff
path: root/src-2.9/GF/GFCC/API.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-05-20 11:47:44 +0000
committeraarne <aarne@cs.chalmers.se>2008-05-20 11:47:44 +0000
commit31bf84122b21efb444aa8d055472e166ffb90783 (patch)
tree1f051909336f1534346bcccde8dda59beab02f64 /src-2.9/GF/GFCC/API.hs
parent74f048dcf41de3540778de54dfa7541fa5b39c46 (diff)
moved all old source code to src-2.9 ; src will be for GF 3 development
Diffstat (limited to 'src-2.9/GF/GFCC/API.hs')
-rw-r--r--src-2.9/GF/GFCC/API.hs140
1 files changed, 140 insertions, 0 deletions
diff --git a/src-2.9/GF/GFCC/API.hs b/src-2.9/GF/GFCC/API.hs
new file mode 100644
index 000000000..c266a5553
--- /dev/null
+++ b/src-2.9/GF/GFCC/API.hs
@@ -0,0 +1,140 @@
+----------------------------------------------------------------------
+-- |
+-- Module : GFCCAPI
+-- Maintainer : Aarne Ranta
+-- Stability : (stable)
+-- Portability : (portable)
+--
+-- > CVS $Date:
+-- > CVS $Author:
+-- > CVS $Revision:
+--
+-- Reduced Application Programmer's Interface to GF, meant for
+-- embedded GF systems. AR 19/9/2007
+-----------------------------------------------------------------------------
+
+module GF.GFCC.API where
+
+import GF.GFCC.Linearize
+import GF.GFCC.Generate
+import GF.GFCC.Macros
+import GF.GFCC.DataGFCC
+import GF.GFCC.CId
+import GF.GFCC.Raw.ConvertGFCC
+import GF.GFCC.Raw.ParGFCCRaw
+import GF.Command.PPrTree
+
+import GF.Data.ErrM
+
+import GF.Parsing.FCFG
+
+--import GF.Data.Operations
+--import GF.Infra.UseIO
+import qualified Data.Map as Map
+import System.Random (newStdGen)
+import System.Directory (doesFileExist)
+
+
+-- This API is meant to be used when embedding GF grammars in Haskell
+-- programs. The embedded system is supposed to use the
+-- .gfcc grammar format, which is first produced by the gf program.
+
+---------------------------------------------------
+-- Interface
+---------------------------------------------------
+
+data MultiGrammar = MultiGrammar {gfcc :: GFCC}
+type Language = String
+type Category = String
+type Tree = Exp
+
+file2grammar :: FilePath -> IO MultiGrammar
+
+linearize :: MultiGrammar -> Language -> Tree -> String
+parse :: MultiGrammar -> Language -> Category -> String -> [Tree]
+
+linearizeAll :: MultiGrammar -> Tree -> [String]
+linearizeAllLang :: MultiGrammar -> Tree -> [(Language,String)]
+
+parseAll :: MultiGrammar -> Category -> String -> [[Tree]]
+parseAllLang :: MultiGrammar -> Category -> String -> [(Language,[Tree])]
+
+generateAll :: MultiGrammar -> Category -> [Tree]
+generateRandom :: MultiGrammar -> Category -> IO [Tree]
+generateAllDepth :: MultiGrammar -> Category -> Maybe Int -> [Tree]
+
+readTree :: MultiGrammar -> String -> Tree
+showTree :: Tree -> String
+
+languages :: MultiGrammar -> [Language]
+categories :: MultiGrammar -> [Category]
+
+startCat :: MultiGrammar -> Category
+
+---------------------------------------------------
+-- Implementation
+---------------------------------------------------
+
+file2grammar f = do
+ gfcc <- file2gfcc f
+ return (MultiGrammar gfcc)
+
+file2gfcc f = do
+ s <- readFileIf f
+ g <- parseGrammar s
+ return $ toGFCC g
+
+linearize mgr lang = GF.GFCC.Linearize.linearize (gfcc mgr) (CId lang)
+
+parse mgr lang cat s =
+ case lookParser (gfcc mgr) (CId lang) of
+ Nothing -> error "no parser"
+ Just pinfo -> case parseFCF "bottomup" pinfo (CId cat) (words s) of
+ Ok x -> x
+ Bad s -> error s
+
+linearizeAll mgr = map snd . linearizeAllLang mgr
+linearizeAllLang mgr t =
+ [(lang,linearThis mgr lang t) | lang <- languages mgr]
+
+parseAll mgr cat = map snd . parseAllLang mgr cat
+
+parseAllLang mgr cat s =
+ [(lang,ts) | lang <- languages mgr, let ts = parse mgr lang cat s, not (null ts)]
+
+generateRandom mgr cat = do
+ gen <- newStdGen
+ return $ genRandom gen (gfcc mgr) (CId cat)
+
+generateAll mgr cat = generate (gfcc mgr) (CId cat) Nothing
+generateAllDepth mgr cat = generate (gfcc mgr) (CId cat)
+
+readTree _ = pTree
+
+showTree = prExp
+
+prIdent :: CId -> String
+prIdent (CId s) = s
+
+abstractName mgr = prIdent (absname (gfcc mgr))
+
+languages mgr = [l | CId l <- cncnames (gfcc mgr)]
+
+categories mgr = [c | CId c <- Map.keys (cats (abstract (gfcc mgr)))]
+
+startCat mgr = lookStartCat (gfcc mgr)
+
+emptyMultiGrammar = MultiGrammar emptyGFCC
+
+------------ for internal use only
+
+linearThis = GF.GFCC.API.linearize
+
+err f g ex = case ex of
+ Ok x -> g x
+ Bad s -> f s
+
+readFileIf f = do
+ b <- doesFileExist f
+ if b then readFile f
+ else putStrLn ("file " ++ f ++ " not found") >> return ""