From f1fd6260e02a4f041907e4616655f55da7e2aeba Mon Sep 17 00:00:00 2001 From: aarne Date: Sat, 24 May 2008 09:16:59 +0000 Subject: [PATCH] support for source gr and i -retain in GFI env --- src-3.0/GF/Command/Importing.hs | 15 +++++++++++++-- src-3.0/GF/Grammar/Grammar.hs | 3 +++ src-3.0/GFI.hs | 19 +++++++++++++++---- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src-3.0/GF/Command/Importing.hs b/src-3.0/GF/Command/Importing.hs index 868ca02b6..f200ba7c4 100644 --- a/src-3.0/GF/Command/Importing.hs +++ b/src-3.0/GF/Command/Importing.hs @@ -1,9 +1,11 @@ -module GF.Command.Importing (importGrammar) where +module GF.Command.Importing (importGrammar, importSource) where import GF.Compile import GF.GFCC.DataGFCC import GF.GFCC.API +import GF.Grammar.Grammar (SourceGrammar) -- for cc command + import GF.Infra.UseIO import GF.Infra.Option import GF.Data.ErrM @@ -25,4 +27,13 @@ importGrammar mgr0 opts files = ".gfcc" -> do gfcc2 <- mapM file2gfcc files >>= return . foldl1 unionGFCC let gfcc3 = unionGFCC (gfcc mgr0) gfcc2 - return $ MultiGrammar gfcc3 \ No newline at end of file + return $ MultiGrammar gfcc3 + +importSource :: SourceGrammar -> Options -> [FilePath] -> IO SourceGrammar +importSource src0 opts files = do + src <- appIOE $ batchCompile opts files + case src of + Ok gr -> return gr + Bad msg -> do + putStrLn msg + return src0 diff --git a/src-3.0/GF/Grammar/Grammar.hs b/src-3.0/GF/Grammar/Grammar.hs index f451d0b27..9771a56dd 100644 --- a/src-3.0/GF/Grammar/Grammar.hs +++ b/src-3.0/GF/Grammar/Grammar.hs @@ -15,6 +15,7 @@ ----------------------------------------------------------------------------- module GF.Grammar.Grammar (SourceGrammar, + emptySourceGrammar, SourceModInfo, SourceModule, SourceAbs, @@ -64,6 +65,8 @@ import qualified Data.ByteString.Char8 as BS -- | grammar as presented to the compiler type SourceGrammar = MGrammar Ident Info +emptySourceGrammar = MGrammar [] + type SourceModInfo = ModInfo Ident Info type SourceModule = (Ident, SourceModInfo) diff --git a/src-3.0/GFI.hs b/src-3.0/GFI.hs index 0761ace5f..ceb7fa6f9 100644 --- a/src-3.0/GFI.hs +++ b/src-3.0/GFI.hs @@ -5,6 +5,8 @@ import GF.Command.Importing import GF.Command.Commands import GF.GFCC.API +import GF.Grammar.Grammar (SourceGrammar,emptySourceGrammar) -- for cc command + import GF.Infra.UseIO import GF.Infra.Option ---- Haskell's option lib import GF.System.Readline (fetchCommand) @@ -19,7 +21,7 @@ mainGFI :: [String] -> IO () mainGFI xx = do putStrLn welcome env <- importInEnv emptyMultiGrammar xx - loop (GFEnv env [] 0) + loop (GFEnv emptySourceGrammar env [] 0) return () loop :: GFEnv -> IO GFEnv @@ -29,10 +31,18 @@ loop gfenv0 = do let gfenv = gfenv0 {history = s : history gfenv0} case words s of - -- special commands, working on GFEnv + -- special commands, requiring source grammar in env "i":args -> do - env1 <- importInEnv (multigrammar env) args - loopNewCPU $ gfenv {commandenv = env1} + let (opts,files) = getOptions "-" args + case opts of + _ | oElem (iOpt "retain") opts -> do + src <- importSource (sourcegrammar gfenv) opts files + loopNewCPU $ gfenv {sourcegrammar = src} + + -- other special commands, working on GFEnv + _ -> do + env1 <- importInEnv (multigrammar env) args + loopNewCPU $ gfenv {commandenv = env1} "e":_ -> loopNewCPU $ gfenv {commandenv=env{multigrammar=emptyMultiGrammar}} "ph":_ -> mapM_ putStrLn (reverse (history gfenv0)) >> loopNewCPU gfenv "q":_ -> putStrLn "See you." >> return gfenv @@ -79,6 +89,7 @@ prompt env = absname ++ "> " where n -> n data GFEnv = GFEnv { + sourcegrammar :: SourceGrammar, -- gfo grammar -retain commandenv :: CommandEnv, history :: [String], cputime :: Integer