diff --git a/src/compiler/GF/Command/Importing.hs b/src/compiler/GF/Command/Importing.hs index 7fedbf05d..f9c04efd7 100644 --- a/src/compiler/GF/Command/Importing.hs +++ b/src/compiler/GF/Command/Importing.hs @@ -6,7 +6,7 @@ import PGF2.Transactions import GF.Compile import GF.Compile.Multi (readMulti) import GF.Compile.GetGrammar (getBNFCRules, getEBNFRules) -import GF.Grammar (SourceGrammar) -- for cc command +import GF.Grammar (ModuleName,SourceGrammar) -- for cc command import GF.Grammar.BNFC import GF.Grammar.EBNF import GF.Grammar.CFG @@ -67,8 +67,8 @@ importPGF opts Nothing f | otherwise = fmap Just (readPGF f) importPGF opts (Just pgf) f = fmap Just (modifyPGF pgf (mergePGF f)) -importSource :: Options -> [FilePath] -> IO SourceGrammar -importSource opts files = fmap (snd.snd) (batchCompile opts files) +importSource :: Options -> [FilePath] -> IO (ModuleName,SourceGrammar) +importSource opts files = fmap snd (batchCompile opts files) -- for different cf formats importCF opts files get convert = impCF diff --git a/src/compiler/GF/Infra/Option.hs b/src/compiler/GF/Infra/Option.hs index c44c69a70..a2af18188 100644 --- a/src/compiler/GF/Infra/Option.hs +++ b/src/compiler/GF/Infra/Option.hs @@ -4,7 +4,7 @@ module GF.Infra.Option -- *** Option types Options, Flags(..), - Mode(..), Phase(..), Verbosity(..), + Mode(..), Phase(..), Verbosity(..), RetainMode(..), OutputFormat(..), SISRFormat(..), Optimization(..), CFGTransform(..), HaskellOption(..), Dump(..), Pass(..), Recomp(..), @@ -146,6 +146,9 @@ data Pass = Source | Rebuild | Extend | Rename | TypeCheck | Refresh | Optimize data Recomp = AlwaysRecomp | RecompIfNewer | NeverRecomp deriving (Show,Eq,Ord) +data RetainMode = RetainAll | RetainSource | RetainCompiled + deriving Show + data Flags = Flags { optMode :: Mode, optStopAfterPhase :: Phase, @@ -164,7 +167,7 @@ data Flags = Flags { optDocumentRoot :: Maybe FilePath, -- For --server mode optRecomp :: Recomp, optProbsFile :: Maybe FilePath, - optRetainResource :: Bool, + optRetainResource :: RetainMode, optName :: Maybe String, optPreprocessors :: [String], optEncoding :: Maybe String, @@ -185,7 +188,7 @@ data Flags = Flags { optPlusAsBind :: Bool, optJobs :: Maybe (Maybe Int) } - deriving (Show) + deriving Show newtype Options = Options (Flags -> Flags) @@ -274,7 +277,7 @@ defaultFlags = Flags { optDocumentRoot = Nothing, optRecomp = RecompIfNewer, optProbsFile = Nothing, - optRetainResource = False, + optRetainResource = RetainCompiled, optName = Nothing, optPreprocessors = [], @@ -352,7 +355,8 @@ optDescr = "(default) Recompile from source if the source is newer than the .gfo file.", Option [] ["gfo","no-recomp"] (NoArg (recomp NeverRecomp)) "Never recompile from source, if there is already .gfo file.", - Option [] ["retain"] (NoArg (set $ \o -> o { optRetainResource = True })) "Retain opers.", + Option [] ["retain"] (NoArg (set $ \o -> o { optRetainResource = RetainAll })) "Retain the source and well as the compiled grammar.", + Option [] ["resource"] (NoArg (set $ \o -> o { optRetainResource = RetainSource })) "Load the source grammar as a resource only.", Option [] ["probs"] (ReqArg probsFile "file.probs") "Read probabilities from file.", Option ['n'] ["name"] (ReqArg name "NAME") (unlines ["Use NAME as the name of the output. This is used in the output file names, ", diff --git a/src/compiler/GF/Infra/SIO.hs b/src/compiler/GF/Infra/SIO.hs index 1ff6827c7..629eaccd3 100644 --- a/src/compiler/GF/Infra/SIO.hs +++ b/src/compiler/GF/Infra/SIO.hs @@ -11,8 +11,8 @@ module GF.Infra.SIO( getCPUTime,getCurrentDirectory,getLibraryDirectory, newStdGen,print,putStr,putStrLn, -- ** Specific to GF - importGrammar,importSource, - putStrLnFlush,runInterruptibly,lazySIO, + importGrammar,importSource, link, + putStrLnFlush,runInterruptibly, modifyPGF, checkoutPGF, -- * Restricted accesss to arbitrary (potentially unsafe) IO operations -- | If the environment variable GF_RESTRICTED is defined, these @@ -30,7 +30,6 @@ import GF.System.Catch(try) import System.Process(system) import System.Environment(getEnv) import Control.Concurrent.Chan(newChan,writeChan,getChanContents) -import GF.Infra.Concurrency(lazyIO) import GF.Infra.UseIO(Output(..)) import GF.Data.Operations(ErrorMonad(..)) import qualified System.CPUTime as IO(getCPUTime) @@ -39,6 +38,7 @@ import qualified System.Random as IO(newStdGen) import qualified GF.Infra.UseIO as IO(getLibraryDirectory) import qualified GF.System.Signal as IO(runInterruptibly) import qualified GF.Command.Importing as GF(importGrammar, importSource) +import qualified GF.Compile as GF(link) import qualified Control.Monad.Fail as Fail import qualified PGF2.Transactions as PGFT import Control.Exception @@ -130,10 +130,10 @@ getCurrentDirectory = lift0 IO.getCurrentDirectory getLibraryDirectory = lift0 . IO.getLibraryDirectory newStdGen = lift0 IO.newStdGen runInterruptibly = lift1 IO.runInterruptibly -lazySIO = lift1 lazyIO importGrammar pgf opts files = lift0 $ GF.importGrammar pgf opts files importSource opts files = lift0 $ GF.importSource opts files +link opts pgf src = lift0 $ GF.link opts pgf src modifyPGF gr t = lift0 (PGFT.modifyPGF gr t) checkoutPGF gr b = lift0 (PGFT.checkoutPGF gr b) diff --git a/src/compiler/GF/Interactive.hs b/src/compiler/GF/Interactive.hs index 0cbe23faf..67b56637f 100644 --- a/src/compiler/GF/Interactive.hs +++ b/src/compiler/GF/Interactive.hs @@ -169,11 +169,6 @@ execute1' s0 = system_command ws = do lift $ restrictedSystem $ unwords ws ; continue - - {-"eh":w:_ -> do - cs <- readFile w >>= return . map words . lines - gfenv' <- foldM (flip (process False benv)) gfenv cs - loopNewCPU gfenv' -} execute_history [w] = do execute . lines =<< lift (restricted (readFile w)) continue @@ -349,13 +344,14 @@ fetchCommand gfenv = do importInEnv :: Options -> [FilePath] -> ShellM () importInEnv opts files = do pgf0 <- gets multigrammar - if flag optRetainResource opts - then do src <- lift $ importSource opts files - pgf <- lift . lazySIO $ importPGF pgf0 -- duplicates some work, better to link src - modify $ \ gfenv -> gfenv {retain=True, pgfenv = (src,pgf)} - else do pgf1 <- lift $ importPGF pgf0 - modify $ \ gfenv->gfenv { retain=False, - pgfenv = (emptyGrammar,pgf1) } + case flag optRetainResource opts of + RetainAll -> do src <- lift $ importSource opts files + pgf <- lift $ link opts pgf0 src + modify $ \gfenv -> gfenv{pgfenv = (snd src,Just pgf)} + RetainSource -> do src <- lift $ importSource opts files + modify $ \gfenv -> gfenv{pgfenv = (snd src,snd (pgfenv gfenv))} + RetainCompiled -> do pgf <- lift $ importPGF pgf0 + modify $ \gfenv -> gfenv{pgfenv = (emptyGrammar,pgf)} where importPGF pgf0 = do let opts' = addOptions (setOptimization OptCSE False) opts @@ -373,23 +369,20 @@ tryGetLine = do Left (e :: SomeException) -> return "q" Right l -> return l -prompt env - | retain env = "> " - | otherwise = case multigrammar env of - Just pgf -> abstractName pgf ++ "> " - Nothing -> "> " +prompt env = case multigrammar env of + Just pgf -> abstractName pgf ++ "> " + Nothing -> "> " type CmdEnv = (Grammar,Maybe PGF) data GFEnv = GFEnv { startOpts :: Options, - retain :: Bool, -- grammar was imported with -retain flag pgfenv :: CmdEnv, commandenv :: CommandEnv ShellM, history :: [String] } -emptyGFEnv opts = GFEnv opts False emptyCmdEnv emptyCommandEnv [] +emptyGFEnv opts = GFEnv opts emptyCmdEnv emptyCommandEnv [] emptyCmdEnv = (emptyGrammar,Nothing)