content: -- $Id: Main.hs,v 1.14 2001/10/10 23:36:06 hallgren Exp $
  
  -- Currently a test harness for the lexer/parser/pretty printer.
  
  --ToDo: Are initial values for SrcLoc/current column correct?
  
  module Main (main) where
  
  
  import IO
  import Lexer
  import ParseMonad
  import PropParser
  import ParseUtil
  import Syntax
  import PrettyPrint
  import System
  import GetOpt
  import IOExts
  import List
  import Rewrite(rewriteModule)
  import HsAssocInitEnv(initEnv)
  import CommandLine
  import Compile
  import Monad
  import MUtils(( # ))
  
  main :: IO ()
  main = case commandLine of
           (flags, args, [])    ->
             do (file, inp) <- case args of
  			     []  -> do inp <- getContents
  				       return ("stdio", inp)
  			     [f] -> do inp <- readFile f
  				       return (f, inp)
  			     _   -> error $ usageInfo usage options
                case handleFlag (getFlag flags) file inp of
                  Good output          -> putStrLn output
                  CompileError message ->
                      error $ "Compilation had errors:\n\n" ++ message
           (    _,   _, errors) ->
               error $ concat errors ++ usageInfo usage options
  
  
  handleFlag :: Flag -> FilePath -> String -> Compile String
  handleFlag ParseInternal f s    = liftM show $ parseModule f s
  handleFlag (ParsePretty lo) f s = liftM (renderWithMode
                                              defaultMode { layoutType = lo } .
                                           ppi)
                                    (parseModule f s)
  handleFlag ToHaskell f s        = liftM pp $ parseModule f s
  handleFlag StaticAnalysis f s   = compileError
                                    "progc: static analysis not yet implemented"
  handleFlag TypeCheck f s        = compileError
                                    "progc: type checking not yet implemented"
  handleFlag Help f s             = return $
                                    usageInfo ("The Programatica Compiler\n" ++
                                               usage)
                                    options
  
  parseModule :: FilePath -> String -> Compile HsModuleR
  parseModule f s =  rewriteModule initEnv # parseFile parse f s
  