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