packages feed

curry-frontend-0.2.3: src/CurryCompilerOpts.hs

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--
-- CurryCompilerOpts - Defines data structures containing options for
--                     compiling Curry programs (see module "CurryCompiler")
--
-- September 2005,
-- Martin Engelke (men@informatik.uni-kiel.de)
-- March 2007, extensions by Sebastian Fischer (sebf@informatik.uni-kiel.de)
--
module CurryCompilerOpts where

import GetOpt
--import Options (Dump(..))


-------------------------------------------------------------------------------

-- Data type for recording compiler options
data Options
   = Options{ force :: Bool,             -- force compilation
              html :: Bool,              -- generate Html code  
	      importPaths :: [FilePath], -- directories for searching imports
	      output :: Maybe FilePath,  -- name of output file
	      noInterface :: Bool,       -- do not create an interface file
	      noVerb :: Bool,            -- verbosity on/off
	      noWarn :: Bool,            -- warnings on/off
	      noOverlapWarn :: Bool,     -- "overlap" warnings on/off
	      flat :: Bool,              -- generate FlatCurry code
              extendedFlat :: Bool,      -- generate FlatCurry code with extensions
	      flatXml :: Bool,           -- generate flat XML code
	      abstract :: Bool,          -- generate typed AbstracCurry code
	      untypedAbstract :: Bool,   -- generate untyped AbstractCurry code
	      parseOnly :: Bool,         -- generate source representation
	      withExtensions :: Bool,    -- enable extended functionalities
	      dump :: [Dump]             -- dumps
	    } deriving Show


-- Default compiler options
defaultOpts = Options{ force           = False,
                       html            = False,
		       importPaths     = [],
		       output          = Nothing,
		       noInterface     = False,
		       noVerb          = False,
		       noWarn          = False,
		       noOverlapWarn   = False,
                       extendedFlat    = False,
		       flat            = False,
		       flatXml         = False,
		       abstract        = False,
		       untypedAbstract = False,
                       parseOnly       = False,
		       withExtensions  = False,
		       dump            = []
		     }


-- Data type for representing all available options (needed to read and parse
-- the options from the command line; see module "GetOpt")
data Option = Help | Force | Html
	    | ImportPath FilePath | Output FilePath
	    | NoInterface | NoVerb | NoWarn | NoOverlapWarn
	    | FlatXML | Flat | ExtFlat
            | Abstract | UntypedAbstract | ParseOnly
	    | WithExtensions
	    | Dump [Dump]
   deriving Eq


-- All available compiler options
options = [Option "f" ["force"] (NoArg Force)
	          "force compilation of dependent files",
           Option "" ["html"] (NoArg Html)
                  "generate html code",
	   Option "i" ["import-dir"] (ReqArg ImportPath "DIR")
                  "search for imports in DIR",
	   Option "o" ["output"] (ReqArg Output "FILE")
                  "write code to FILE",
	   Option "" ["no-intf"] (NoArg NoInterface)
                  "do not create an interface file",
	   Option "" ["no-verb"] (NoArg NoVerb)
	          "do not print compiler messages",
	   Option "" ["no-warn"] (NoArg NoWarn)
	          "do not print warnings",
	   Option "" ["no-overlap-warn"] (NoArg NoOverlapWarn)
	          "do not print warnings for overlapping rules",
	   Option "" ["flat"] (NoArg Flat)
                  "generate FlatCurry code",
	   Option "" ["extended-flat"] (NoArg ExtFlat)
                  "generate FlatCurry code with source references",
	   Option "" ["xml"] (NoArg FlatXML)
                  "generate flat xml code",
	   Option "" ["acy"] (NoArg Abstract)
                  "generate (type infered) AbstractCurry code",
	   Option "" ["uacy"] (NoArg UntypedAbstract)
                  "generate untyped AbstractCurry code",
	   Option "" ["parse-only"] (NoArg ParseOnly)
                  "generate source representation",
	   Option "e"  ["extended"] (NoArg WithExtensions)
	          "enable extended Curry functionalities",
	   Option "" ["dump-all"] (NoArg (Dump [minBound..maxBound]))
                  "dump everything",
	   Option "" ["dump-renamed"] (NoArg (Dump [DumpRenamed]))
                  "dump source code after renaming",
	   Option "" ["dump-types"] (NoArg (Dump [DumpTypes]))
                  "dump types after type-checking",
	   Option "" ["dump-desugared"] (NoArg (Dump [DumpDesugared]))
                  "dump source code after desugaring",
	   Option "" ["dump-simplified"] (NoArg (Dump [DumpSimplified]))
                  "dump source code after simplification",
	   Option "" ["dump-lifted"] (NoArg (Dump [DumpLifted]))
                  "dump source code after lambda-lifting",
	   Option "" ["dump-il"] (NoArg (Dump [DumpIL]))
                  "dump intermediate language before lifting",
	   Option "" ["dump-case"] (NoArg (Dump [DumpCase]))
	          "dump intermediate language after case simplification",
	   Option "?h" ["help"] (NoArg Help)
                  "display this help and exit"
	  ]


-- Inserts an option (type 'Option') into the options record (type 'Options')
selectOption :: Option -> Options -> Options
selectOption Force opts           = opts{ force = True }
selectOption (ImportPath dir) opts 
   = opts{ importPaths = dir:(importPaths opts) }
selectOption (Output file) opts   = opts{ output = Just file }
selectOption NoInterface opts     = opts{ noInterface = True }
selectOption NoVerb opts          = opts{ noVerb = True } 
selectOption NoWarn opts          = opts{ noWarn = True }
selectOption NoOverlapWarn opts   = opts{ noOverlapWarn = True }
selectOption Flat opts            = opts{ flat = True }
selectOption ExtFlat opts         = opts{ extendedFlat = True }
selectOption Html opts            = opts{ html = True }
selectOption FlatXML opts         = opts{ flatXml = True }
selectOption Abstract opts        = opts{ abstract = True }
selectOption UntypedAbstract opts = opts{ untypedAbstract = True }
selectOption ParseOnly opts       = opts{ parseOnly = True }
selectOption WithExtensions opts  = opts{ withExtensions = True }
selectOption (Dump ds) opts       = opts{ dump = ds ++ dump opts }


-------------------------------------------------------------------------------

-- Data type for representing code dumps
-- TODO: dump FlatCurry code, dump AbstractCurry code, dump after 'case'
--       expansion
data Dump = DumpRenamed      -- dump source after renaming
	  | DumpTypes        -- dump types after typechecking
	  | DumpDesugared    -- dump source after desugaring
	  | DumpSimplified   -- dump source after simplification
	  | DumpLifted       -- dump source after lambda-lifting
	  | DumpIL           -- dump IL code after translation
	  | DumpCase         -- dump IL code after case elimination
	    deriving (Eq,Bounded,Enum,Show)


-------------------------------------------------------------------------------
-------------------------------------------------------------------------------