From de0fe5c10a094cb7755dec5c9ba26f52b8399719 Mon Sep 17 00:00:00 2001 From: aarne Date: Fri, 14 Dec 2007 07:42:56 +0000 Subject: [PATCH] added a module for testgf3 --- src/GF/Devel/Compile/GFC.hs | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/GF/Devel/Compile/GFC.hs diff --git a/src/GF/Devel/Compile/GFC.hs b/src/GF/Devel/Compile/GFC.hs new file mode 100644 index 000000000..1e1bb9ce8 --- /dev/null +++ b/src/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.GFCC.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") . fileSuffix) 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"