diff options
| author | aarne <aarne@cs.chalmers.se> | 2007-09-19 16:48:13 +0000 |
|---|---|---|
| committer | aarne <aarne@cs.chalmers.se> | 2007-09-19 16:48:13 +0000 |
| commit | ef389db5694a52eb9c171fe76b952f37216e4c09 (patch) | |
| tree | cf285b0f746575e5fb210866df5a73c6057405d5 /src/GF/Canon/GFCC/GFCCAPI.hs | |
| parent | aff4aa20c19ccef4ccdbb664d2e989eba36f4446 (diff) | |
started extending GFCC API with parsing
Diffstat (limited to 'src/GF/Canon/GFCC/GFCCAPI.hs')
| -rw-r--r-- | src/GF/Canon/GFCC/GFCCAPI.hs | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/GF/Canon/GFCC/GFCCAPI.hs b/src/GF/Canon/GFCC/GFCCAPI.hs new file mode 100644 index 000000000..e815697d7 --- /dev/null +++ b/src/GF/Canon/GFCC/GFCCAPI.hs @@ -0,0 +1,115 @@ +---------------------------------------------------------------------- +-- | +-- 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.Canon.GFCC.GFCCAPI where + +import GF.Canon.GFCC.DataGFCC +--import GF.Canon.GFCC.GenGFCC +import GF.Canon.GFCC.AbsGFCC +import GF.Canon.GFCC.ParGFCC +import GF.Canon.GFCC.PrintGFCC +import GF.Canon.GFCC.ErrM +--import GF.Data.Operations +--import GF.Infra.UseIO +import qualified Data.Map as Map +import System.Random (newStdGen) +import System.Directory (doesFileExist) +import System + +-- This API is meant to be used when embedding GF grammars in Haskell +-- programs. The embedded system is supposed to use the +-- .gfcm grammar format, which is first produced by the gf program. + +--------------------------------------------------- +-- Interface +--------------------------------------------------- + +type MultiGrammar = 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])] + +readTree :: MultiGrammar -> String -> Tree +showTree :: Tree -> String + +languages :: MultiGrammar -> [Language] +categories :: MultiGrammar -> [Category] + +startCat :: MultiGrammar -> Category + +--------------------------------------------------- +-- Implementation +--------------------------------------------------- + +file2grammar f = + readFileIf f >>= err (error "no parse") (return . mkGFCC) . pGrammar . myLexer + +linearize mgr lang = GF.Canon.GFCC.DataGFCC.linearize mgr (CId lang) + + +parse mgr lang cat s = [] +{- + map tree2exp . + errVal [] . + parseString (stateOptions sgr) sgr cfcat + where + sgr = stateGrammarOfLang mgr (zIdent lang) + cfcat = string2CFCat abs cat + abs = maybe (error "no abstract syntax") prIdent $ abstract mgr +-} + +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)] +-} + +readTree _ = err (const exp0) id . (pExp . myLexer) + +showTree t = printTree t + +languages mgr = [l | CId l <- cncnames mgr] + +categories mgr = [c | CId c <- Map.keys (cats (abstract mgr))] + +startCat mgr = "S" ---- + +------------ for internal use only + +linearThis = GF.Canon.GFCC.GFCCAPI.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 "" |
