summaryrefslogtreecommitdiff
path: root/src-3.0/GF/Devel/Compile/GFC.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-05-21 09:26:44 +0000
committeraarne <aarne@cs.chalmers.se>2008-05-21 09:26:44 +0000
commit055c0d0d5a5bb0dc75904fe53df7f2e4f5732a8f (patch)
tree0e63fb68c69c8f6ad0f78893c63420f0a3600e1c /src-3.0/GF/Devel/Compile/GFC.hs
parent915a1de71783ab8446b1af9e72c7ba7dfbc12d3f (diff)
GF/src is now for 2.9, and the new sources are in src-3.0 - keep it this way until the release of GF 3
Diffstat (limited to 'src-3.0/GF/Devel/Compile/GFC.hs')
-rw-r--r--src-3.0/GF/Devel/Compile/GFC.hs72
1 files changed, 72 insertions, 0 deletions
diff --git a/src-3.0/GF/Devel/Compile/GFC.hs b/src-3.0/GF/Devel/Compile/GFC.hs
new file mode 100644
index 000000000..f60ec9380
--- /dev/null
+++ b/src-3.0/GF/Devel/Compile/GFC.hs
@@ -0,0 +1,72 @@
+module GF.Devel.Compile.GFC (mainGFC) where
+-- module Main where
+
+import GF.Devel.Compile.Compile
+import GF.Devel.Compile.GFtoGFCC
+import GF.Devel.PrintGFCC
+import GF.GFCC.OptimizeGFCC
+import GF.GFCC.CheckGFCC
+import GF.GFCC.DataGFCC
+import GF.GFCC.Raw.ParGFCCRaw
+import GF.GFCC.Raw.ConvertGFCC
+import GF.Devel.UseIO
+import GF.Infra.Option
+import GF.GFCC.API
+import GF.Data.ErrM
+
+mainGFC :: [String] -> IO ()
+mainGFC xx = do
+ let (opts,fs) = getOptions "-" xx
+ case opts of
+ _ | oElem (iOpt "help") opts -> putStrLn usageMsg
+ _ | oElem (iOpt "-make") opts -> do
+ gr <- batchCompile opts fs
+ let name = justModuleName (last fs)
+ let (abs,gc0) = mkCanon2gfcc opts name gr
+ gc1 <- checkGFCCio gc0
+ let gc = if oElem (iOpt "noopt") opts then gc1 else optGFCC gc1
+ let target = targetName opts abs
+ let gfccFile = target ++ ".gfcc"
+ writeFile gfccFile (printGFCC gc)
+ putStrLn $ "wrote file " ++ gfccFile
+ mapM_ (alsoPrint opts target gc) printOptions
+
+ -- gfc -o target.gfcc source_1.gfcc ... source_n.gfcc
+ _ | all ((==".gfcc") . takeExtensions) fs -> do
+ gfccs <- mapM file2gfcc fs
+ let gfcc = foldl1 unionGFCC gfccs
+ let abs = printCId $ absname gfcc
+ let target = targetName opts abs
+ let gfccFile = target ++ ".gfcc"
+ writeFile gfccFile (printGFCC gfcc)
+ putStrLn $ "wrote file " ++ gfccFile
+ mapM_ (alsoPrint opts target gfcc) printOptions
+
+ _ -> do
+ mapM_ (batchCompile opts) (map return fs)
+ putStrLn "Done."
+
+targetName opts abs = case getOptVal opts (aOpt "target") of
+ Just n -> n
+ _ -> abs
+
+---- TODO: nicer and richer print options
+
+alsoPrint opts abs gr (opt,name) = do
+ if oElem (iOpt opt) opts
+ then do
+ let outfile = name
+ let output = prGFCC opt gr
+ writeFile outfile output
+ putStrLn $ "wrote file " ++ outfile
+ else return ()
+
+printOptions = [
+ ("haskell","GSyntax.hs"),
+ ("haskell_gadt","GSyntax.hs"),
+ ("js","grammar.js"),
+ ("jsref","grammarReference.js")
+ ]
+
+usageMsg =
+ "usage: gfc (-h | --make (-noopt) (-target=PREFIX) (-js | -jsref | -haskell | -haskell_gadt)) (-src) FILES"