diff --git a/CompState.hs b/CompState.hs index 5a59e79..71bfad7 100644 --- a/CompState.hs +++ b/CompState.hs @@ -16,6 +16,7 @@ data CompState = CompState { csVerboseLevel :: Int, csParseOnly :: Bool, csOutputFile :: String, + csBackend :: String, -- Set by preprocessor csSourceFiles :: Map String String, @@ -47,6 +48,7 @@ emptyState = CompState { csVerboseLevel = 0, csParseOnly = False, csOutputFile = "-", + csBackend = "CIF", csSourceFiles = Map.empty, csIndentLinesIn = [], diff --git a/Main.hs b/Main.hs index fdbd388..a51edfb 100644 --- a/Main.hs +++ b/Main.hs @@ -12,6 +12,7 @@ import System.IO import CompState import Errors import GenerateC +import GenerateCPPCSP import Parse import Pass import PrettyShow @@ -34,6 +35,7 @@ options :: [OptDescr OptFunc] options = [ Option [] ["parse-only"] (NoArg optParseOnly) "only parse input file" , Option ['v'] ["verbose"] (NoArg $ optVerbose) "be more verbose (use multiple times for more detail)" + , Option [] ["backend"] (ReqArg optBackend "BACKEND") "backend (options: CIF, CPPCSP)" , Option ['o'] ["output"] (ReqArg optOutput "FILE") "output file (default \"-\")" ] @@ -46,6 +48,9 @@ optVerbose ps = return $ ps { csVerboseLevel = csVerboseLevel ps + 1 } optOutput :: String -> OptFunc optOutput s ps = return $ ps { csOutputFile = s } +optBackend :: String -> OptFunc +optBackend s ps = return $ ps { csBackend = s } + getOpts :: [String] -> IO ([OptFunc], [String]) getOpts argv = case getOpt RequireOrder options argv of @@ -96,9 +101,20 @@ compile fn do progress "Passes:" ast2 <- (runPasses passes) ast1 - debug "{{{ Generate C" - progress "Generate C" - c <- generateC ast2 + debug "{{{ Generate Code" + c <- + case csBackend optsPS of + "CPPCSP" -> + do progress "Generate C++CSP" + c' <- generateCPPCSP ast2 + return c' + "CIF" -> + do progress "Generate C/CIF" + c' <- generateC ast2 + return c' + _ -> + do error ("Unknown backend: " ++ (csBackend optsPS)) + debug "}}}" return c