summaryrefslogtreecommitdiff
path: root/src-3.0/GFC.hs
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@chalmers.se>2008-05-22 14:39:16 +0000
committerkr.angelov <kr.angelov@chalmers.se>2008-05-22 14:39:16 +0000
commitd8cabf026390f0f69a4e9b3a503f0ea5538ff362 (patch)
treeb317a33333ae524b9de127bfca8675a35c78f078 /src-3.0/GFC.hs
parentebbc0a3e806f2df19a74b3f7a1d3575476c3237b (diff)
move GFC and GFI
Diffstat (limited to 'src-3.0/GFC.hs')
-rw-r--r--src-3.0/GFC.hs67
1 files changed, 67 insertions, 0 deletions
diff --git a/src-3.0/GFC.hs b/src-3.0/GFC.hs
new file mode 100644
index 000000000..9273117b7
--- /dev/null
+++ b/src-3.0/GFC.hs
@@ -0,0 +1,67 @@
+module GFC (mainGFC) where
+-- module Main where
+
+import GF.Compile
+import GF.Devel.PrintGFCC
+import GF.GFCC.CId
+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
+
+import System.FilePath
+
+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
+ gfcc <- appIOE (compileToGFCC opts fs) >>= err fail return
+ let gfccFile = targetNameGFCC opts (absname gfcc)
+ outputFile gfccFile (printGFCC gfcc)
+ mapM_ (alsoPrint opts gfcc) 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 gfccFile = targetNameGFCC opts (absname gfcc)
+ outputFile gfccFile (printGFCC gfcc)
+ mapM_ (alsoPrint opts gfcc) printOptions
+
+ _ -> do
+ appIOE (mapM_ (batchCompile opts) (map return fs)) >>= err fail return
+ putStrLn "Done."
+
+targetName :: Options -> CId -> String
+targetName opts abs = case getOptVal opts (aOpt "target") of
+ Just n -> n
+ _ -> prCId abs
+
+targetNameGFCC :: Options -> CId -> FilePath
+targetNameGFCC opts abs = targetName opts abs ++ ".gfcc"
+
+---- TODO: nicer and richer print options
+
+alsoPrint opts gr (opt,name) = do
+ if oElem (iOpt opt) opts
+ then outputFile name (prGFCC opt gr)
+ else return ()
+
+outputFile :: FilePath -> String -> IO ()
+outputFile outfile output =
+ do writeFile outfile output
+ putStrLn $ "wrote file " ++ outfile
+
+printOptions = [
+ ("haskell","GSyntax.hs"),
+ ("haskell_gadt","GSyntax.hs"),
+ ("js","grammar.js")
+ ]
+
+usageMsg =
+ "usage: gfc (-h | --make (-noopt) (-noparse) (-target=PREFIX) (-js | -haskell | -haskell_gadt)) (-src) FILES"