summaryrefslogtreecommitdiff
path: root/src/GF/Compile
diff options
context:
space:
mode:
authoraarne <unknown>2005-06-10 20:04:00 +0000
committeraarne <unknown>2005-06-10 20:04:00 +0000
commit6a66fc5d71747c1009590e68887a9bbd6f44e598 (patch)
tree13506416fc358d7e05a5c6c1d4d94db609455f50 /src/GF/Compile
parent3f192bd2bb99f827abd20be36fc125c0e6553e80 (diff)
gfe as preprocessing to compiler
Diffstat (limited to 'src/GF/Compile')
-rw-r--r--src/GF/Compile/Compile.hs33
-rw-r--r--src/GF/Compile/MkConcrete.hs34
2 files changed, 53 insertions, 14 deletions
diff --git a/src/GF/Compile/Compile.hs b/src/GF/Compile/Compile.hs
index 9ea0fdf91..d5874d0e2 100644
--- a/src/GF/Compile/Compile.hs
+++ b/src/GF/Compile/Compile.hs
@@ -5,16 +5,16 @@
-- Stability : (stable)
-- Portability : (portable)
--
--- > CVS $Date: 2005/05/30 21:08:14 $
+-- > CVS $Date: 2005/06/10 21:04:01 $
-- > CVS $Author: aarne $
--- > CVS $Revision: 1.40 $
+-- > CVS $Revision: 1.41 $
--
-- The top-level compilation chain from source file to gfc\/gfr.
-----------------------------------------------------------------------------
module GF.Compile.Compile (compileModule, compileEnvShSt, compileOne,
- CompileEnv, TimedCompileEnv
- ) where
+ CompileEnv, TimedCompileEnv,gfGrammarPathVar,pathListOpts,
+ getGFEFiles) where
import GF.Grammar.Grammar
import GF.Infra.Ident
@@ -50,6 +50,7 @@ import GF.Infra.UseIO
import GF.System.Arch
import Control.Monad
+import System.Directory
-- | environment variable for grammar search path
gfGrammarPathVar = "GF_GRAMMAR_PATH"
@@ -335,3 +336,27 @@ writeNewGF m@(i,_) = do
ioeIO $ writeFile file $ prGrammar (MGrammar [m])
ioeIO $ putStrLn $ "wrote file" +++ file
return file
+
+--- this function duplicates a lot of code from compileModule.
+--- It does not really belong here either.
+-- It selects those .gfe files that a grammar depends on and that
+-- are younger than corresponding gf
+
+getGFEFiles :: Options -> FilePath -> IO [FilePath]
+getGFEFiles opts1 file = useIOE [] $ do
+ opts0 <- ioeIO $ getOptionsFromFile file
+ let useFileOpt = maybe False (const True) $ getOptVal opts0 pathList
+ let useLineOpt = maybe False (const True) $ getOptVal opts1 pathList
+ let opts = addOptions opts1 opts0
+ let fpath = justInitPath file
+ ps0 <- ioeIO $ pathListOpts opts fpath
+
+ let ps1 = if (useFileOpt && not useLineOpt)
+ then (map (prefixPathName fpath) ps0)
+ else ps0
+ ps <- ioeIO $ extendPathEnv gfLibraryPath gfGrammarPathVar ps1
+ let file' = if useFileOpt then justFileName file else file -- to find file itself
+ files <- getAllFiles opts ps [] file'
+ efiles <- ioeIO $ filterM doesFileExist [suffixFile "gfe" (unsuffixFile f) | f <- files]
+ es <- ioeIO $ mapM (uncurry selectLater) [(f, init f) | f <- efiles] -- init gfe == gf
+ return $ filter ((=='e') . last) es
diff --git a/src/GF/Compile/MkConcrete.hs b/src/GF/Compile/MkConcrete.hs
index ee01b2232..7d228de39 100644
--- a/src/GF/Compile/MkConcrete.hs
+++ b/src/GF/Compile/MkConcrete.hs
@@ -20,15 +20,20 @@ import GF.Grammar.Grammar (Term(Q,QC)) ---
import GF.Grammar.Macros (composSafeOp, record2subst)
import GF.Compile.ShellState (firstStateGrammar)
import GF.Compile.PGrammar (pTerm)
+import GF.Compile.Compile
import GF.API
import qualified GF.Embed.EmbedAPI as EA
import GF.Data.Operations
import GF.Infra.UseIO
import GF.Infra.Option
+import GF.Infra.ReadFiles
+import GF.System.Arch
+import System.Directory
import Data.Char
import Control.Monad
+import Data.List
-- translate strings into lin rules by parsing in a resource
-- grammar. AR 2/6/2005
@@ -47,12 +52,16 @@ import Control.Monad
-- notice: we use a hand-crafted lexer and parser in order to preserve
-- the layout and comments in the rest of the file.
-
mkConcretes :: [FilePath] -> IO ()
-mkConcretes [] = putStrLn "no files to process"
-mkConcretes files@(file:_) = do
- cont <- liftM lines $ readFileIf file
- let res = getResPath cont
+mkConcretes files = do
+ ress <- mapM getResPath files
+ let grps = groupBy (\a b -> fst a == fst b) $
+ sortBy (\a b -> compare (fst a) (fst b)) $ zip ress files
+ mapM_ mkCncGroups [(r,map snd gs) | gs@((r,_):_) <- grps]
+
+mkCncGroups (res,files) = do
+ putStrLnFlush $ "Going to preprocess examples in " ++ unwords files
+ putStrLn $ "Compiling resource " ++ res
egr <- appIOE $
optFile2grammar (options
[useOptimizer "share",fromSource,beSilent,notEmitCode]) res --- for -mcfg
@@ -60,6 +69,7 @@ mkConcretes files@(file:_) = do
let parser cat = errVal ([],"No parse") .
optParseArgErrMsg (options [newMParser, firstCat cat, beVerbose]) gr
let morpho = isKnownWord gr
+ putStrLn "Building parser"
mapM_ (mkConcrete parser morpho) files
type Parser = String -> String -> ([Tree],String)
@@ -69,13 +79,16 @@ mkConcrete :: Parser -> Morpho -> FilePath -> IO ()
mkConcrete parser morpho file = do
cont <- liftM getExLines $ readFileIf file
let out = suffixFile "gf" $ justModuleName file
- writeFile out ""
+ writeFile out $ "-- File generated by GF from " ++ file
+ appendFile out "\n"
mapM_ (mkCnc out parser morpho) cont
-getResPath :: [String] -> String
-getResPath s = case head (dropWhile (all isSpace) s) of
- '-':'-':'#':path -> reverse (takeWhile (not . (=='=')) (reverse path))
- _ -> error "first line must be --# -resource=<PATH>"
+getResPath :: FilePath -> IO String
+getResPath file = do
+ s <- liftM lines $ readFileIf file
+ return $ case head (dropWhile (all isSpace) s) of
+ '-':'-':'#':path -> reverse (takeWhile (not . (=='=')) (reverse path))
+ _ -> error "first line must be --# -resource=<PATH>"
getExLines :: String -> [Either String String]
getExLines = getl . lines where
@@ -135,3 +148,4 @@ doSubst subst0 trm = prt_ $ subt subst trm where
Q _ c -> maybe t id $ lookup c g
QC _ c -> maybe t id $ lookup c g
_ -> composSafeOp (subt g) t
+