content: -- $Id: CommandLine.hs,v 1.2 2002/05/18 20:40:57 hallgren Exp $
  
  module CommandLine where
  
  import System
  import GetOpt
  import IOExts
  import PrettyPrint
  
  
  data Flag = ParseInternal          -- print abstract syntax in internal format
            | ParsePretty PPLayout   -- pretty print in given style
            | ToHaskell              -- forgetful functor from Programatica
            | StaticAnalysis         -- run static analysis
            | TypeCheck              -- run type checker
            | Help                   -- give short usage info
              deriving Eq
  
  options =
     [ Option []        ["ast", "abstract-syntax-tree"]
           (NoArg ParseInternal)
           "print abstract syntax in internal format",
       Option []        ["pretty"]
           (OptArg style "STYLE")
           "pretty print in STYLE[(o)ffside|(s)emicolon|(u)trecht|(i)nline|(n)one] (default = offside)",
       Option []        ["hs", "haskell"]
           (NoArg ToHaskell)
           "produce Haskell code with Programatica constructs commented out",
       Option []        ["sa", "static", "static-analysis"]
           (NoArg StaticAnalysis) 
           "run static analysis",
       Option []        ["tc", "typecheck"]
           (NoArg TypeCheck)
           "run typechecker",
       Option ['h','?'] ["help"]      
           (NoArg Help)
           "display this help message and exit"
     ]
  
  style :: Maybe String -> Flag
  style Nothing  = ParsePretty PPOffsideRule
  style (Just s) = ParsePretty $
           case s of
           "o"         -> PPOffsideRule
           "offside"   -> PPOffsideRule
           "s"         -> PPSemiColon
           "semicolon" -> PPSemiColon
           "u"         -> PPUtrecht
           "utrecht  " -> PPUtrecht
           "i"         -> PPInLine
           "inline"    -> PPInLine
           "n"         -> PPNoLayout
           "none"      -> PPNoLayout
           _           -> PPOffsideRule
  
  getFlag :: [Flag] -> Flag
  getFlag []  = ParsePretty PPOffsideRule
  getFlag [f] = f
  getFlag _   = error usage
  
  usage = "usage: pgc [option] [filename]"
  
  commandLine = getOpt Permute options $ unsafePerformIO getArgs
  