summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-05-24 09:16:59 +0000
committeraarne <aarne@cs.chalmers.se>2008-05-24 09:16:59 +0000
commit0db611a9abfb31c76933a455da946cf2194ded7b (patch)
treef7548438d460ec72bfe1d74fd8673dfa3183c7d6
parent5a386209ddf005f5a090f3668cfe246c3df22057 (diff)
support for source gr and i -retain in GFI env
-rw-r--r--src-3.0/GF/Command/Importing.hs15
-rw-r--r--src-3.0/GF/Grammar/Grammar.hs3
-rw-r--r--src-3.0/GFI.hs19
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