module Options where

import System.Console.GetOpt
import Data.Set(Set)
import UU.Scanner.Position(Pos,noPos)
import Data.List(intercalate)
import qualified Data.Set as Set
import System.IO
import System.Exit

-- From CommonTypes
data Identifier   = Ident { Identifier -> String
getName::String, Identifier -> Pos
getPos::Pos }
type NontermIdent = Identifier
identifier :: String -> Identifier
identifier :: String -> Identifier
identifier x :: String
x      = String -> Pos -> Identifier
Ident String
x Pos
noPos

instance Eq Identifier where
 Ident x :: String
x _ == :: Identifier -> Identifier -> Bool
== Ident y :: String
y _ = String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
y

instance Ord Identifier where
 compare :: Identifier -> Identifier -> Ordering
compare (Ident x :: String
x _) (Ident y :: String
y _) = String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
compare String
x String
y

instance Show Identifier where
  show :: Identifier -> String
show ident :: Identifier
ident = Identifier -> String
getName Identifier
ident
  
-- Make options serializable
data MyOptDescr = MyOpt [Char] [String] (ArgDescr (Options -> Options)) (Options -> String -> [String]) String

fromMyOpt :: MyOptDescr -> OptDescr (Options -> Options)
fromMyOpt :: MyOptDescr -> OptDescr (Options -> Options)
fromMyOpt (MyOpt sh :: String
sh ln :: [String]
ln desc :: ArgDescr (Options -> Options)
desc _ s :: String
s) = String
-> [String]
-> ArgDescr (Options -> Options)
-> String
-> OptDescr (Options -> Options)
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
sh [String]
ln ArgDescr (Options -> Options)
desc String
s

noOpt :: Options -> String -> [String]
noOpt :: Options -> String -> [String]
noOpt _ _ = []

boolOpt :: (Options -> Bool) -> Options -> String -> [String]
boolOpt :: (Options -> Bool) -> Options -> String -> [String]
boolOpt get :: Options -> Bool
get opt :: Options
opt strArg :: String
strArg = let oldVal :: Bool
oldVal = Options -> Bool
get Options
noOptions
                             newVal :: Bool
newVal = Options -> Bool
get Options
opt
                         in  if   Bool
oldVal Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
/= Bool
newVal
                             then [String
strArg]
                             else []

stringOpt :: (Options -> String) -> Options -> String -> [String]
stringOpt :: (Options -> String) -> Options -> String -> [String]
stringOpt get :: Options -> String
get opt :: Options
opt strArg :: String
strArg = let oldVal :: String
oldVal = Options -> String
get Options
noOptions
                               newVal :: String
newVal = Options -> String
get Options
opt
                           in  if   String
oldVal String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
newVal
                               then [String
strArg, String
newVal]
                               else []

mbStringOpt :: (Options -> Maybe String) -> Options -> String -> [String]
mbStringOpt :: (Options -> Maybe String) -> Options -> String -> [String]
mbStringOpt get :: Options -> Maybe String
get opts :: Options
opts nm :: String
nm = [String] -> (String -> [String]) -> Maybe String -> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\s :: String
s -> [String
nmString -> ShowS
forall a. [a] -> [a] -> [a]
++"="String -> ShowS
forall a. [a] -> [a] -> [a]
++String
s]) (Options -> Maybe String
get Options
opts)

serializeOption :: Options -> MyOptDescr -> [String]
serializeOption :: Options -> MyOptDescr -> [String]
serializeOption opt :: Options
opt (MyOpt sh :: String
sh ln :: [String]
ln _ get :: Options -> String -> [String]
get _) = Options -> String -> [String]
get Options
opt String
strArg
  where
    strArg :: String
strArg = if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
sh
             then '-' Char -> ShowS
forall a. a -> [a] -> [a]
: '-' Char -> ShowS
forall a. a -> [a] -> [a]
: [String] -> String
forall a. [a] -> a
head [String]
ln
             else '-' Char -> ShowS
forall a. a -> [a] -> [a]
: String -> Char
forall a. [a] -> a
head String
sh Char -> ShowS
forall a. a -> [a] -> [a]
: []

-- All options
allOptions :: [MyOptDescr]
allOptions :: [MyOptDescr]
allOptions =  
  [ String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['m']     []                ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg (Maybe String -> Options -> Options
moduleOpt Maybe String
forall a. Maybe a
Nothing)) Options -> String -> [String]
noOpt                 "generate default module header"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["module"]        ((Maybe String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg Maybe String -> Options -> Options
moduleOpt "name")   Options -> String -> [String]
moduleOptGet          "generate module header, specify module name"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['d']     ["data"]          ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
dataOpt)             ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
dataTypes)   "generate data type definition"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["datarecords"]   ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
dataRecOpt)          ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
dataRecords) "generate record data types"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["strictdata"]    ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
strictDataOpt)       ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
strictData)  "generate strict data fields (when data is generated)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["strictwrap"]    ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
strictWrapOpt)       ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
strictWrap)  "generate strict wrap fields for WRAPPER generated data"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['c']     ["catas"]         ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
cataOpt)             ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
folds)       "generate catamorphisms"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['f']     ["semfuns"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
semfunsOpt)          ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
semfuns)     "generate semantic functions"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['s']     ["signatures"]    ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
signaturesOpt)       ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
typeSigs)    "generate signatures for semantic functions"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["newtypes"]      ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
newtypesOpt)         ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
newtypes)    "use newtypes instead of type synonyms"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['p']     ["pretty"]        ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
prettyOpt)           ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
attrInfo)    "generate pretty printed list of attributes"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['w']     ["wrappers"]      ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
wrappersOpt)         ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
wrappers)    "generate wappers for semantic domains"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['r']     ["rename"]        ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
renameOpt)           ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
rename)      "rename data constructors"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["modcopy"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
modcopyOpt)          ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
modcopy)     "use modified copy rule"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["nest"]          ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
nestOpt)             ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
nest)        "use nested tuples"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["syntaxmacro"]   ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
smacroOpt)           ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
smacro)      "experimental: generate syntax macro code (using knit catas)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['o']     ["output"]        ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
outputOpt "file")   Options -> String -> [String]
outputOptGet          "specify output file"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['v']     ["verbose"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
verboseOpt)          ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
verbose)     "verbose error message format"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['h','?'] ["help"]          ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
helpOpt)             ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
showHelp)    "get (this) usage information"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['a']     ["all"]           ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
allOpt)              Options -> String -> [String]
noOpt                ("do everything (-" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
allc String -> ShowS
forall a. [a] -> [a] -> [a]
++ ")")
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['P']     [""]              ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
searchPathOpt "search path") Options -> String -> [String]
searchPathOptGet ("specify seach path")
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["prefix"]        ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
prefixOpt "prefix") ((Options -> String) -> Options -> String -> [String]
stringOpt Options -> String
prefix)    "set prefix for semantic functions"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["self"]          ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
selfOpt)             ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
withSelf)    "generate self attribute"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["cycle"]         ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
cycleOpt)            ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
withCycle)   "check for cyclic definitions"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["version"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
versionOpt)          ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
showVersion) "get version information"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['O']     ["optimize"]      ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
optimizeOpt)         Options -> String -> [String]
noOpt                 "optimize generated code (--visit --case)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["visit"]         ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
visitOpt)            ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
visit)       "try generating visit functions"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["loag"]          ((Maybe String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg Maybe String -> Options -> Options
loagOpt "Bool")     ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
loag)        "recognises all linear ordered attribute grammars by generting a SAT problem, uses --verbose to print out numbers of clauses and variables"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["aoag"]          ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
aoagOpt)             ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
aoag)        "recognises all linear ordered attribute grammars by finding fake dependencies, uses --verbose to print out the selected fake dependencies"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["seq"]           ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
seqOpt)              ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
withSeq)     "force evaluation using function seq (visit functions only)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["unbox"]         ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
unboxOpt)            ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
unbox)       "use unboxed tuples"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["bangpats"]      ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
bangpatsOpt)         ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
bangpats)    "use bang patterns (visit functions only)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["case"]          ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
casesOpt)            ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
cases)       "Use nested cases instead of let (visit functions only)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["strictcase"]    ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
strictCasesOpt)      ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
strictCases) "Force evaluation of the scrutinee of cases (in generated code, visit functions only)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["strictercase"]  ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
stricterCasesOpt)    ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
stricterCases) "Force evaluation of all variables bound by a case statement (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["strictsem"]     ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
strictSemOpt)        ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
strictSems)  "Force evaluation of sem-function arguments (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["localcps"]      ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
localCpsOpt)         ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
localCps)    "Apply a local CPS transformation (in generated code, visit functions only)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["splitsems"]     ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
splitSemsOpt)        ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
splitSems)   "Split semantic functions into smaller pieces"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["Werrors"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
werrorsOpt)          ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
werrors)     "Turn warnings into fatal errors"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["Wignore"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
wignoreOpt)          ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
wignore)     "Ignore warnings"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["Wmax"]          ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
wmaxErrsOpt "<max errs reported>") Options -> String -> [String]
wmaxErrsOptGet "Sets the maximum number of errors that are reported"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["dumpgrammar"]   ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
dumpgrammarOpt)      ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
dumpgrammar) "Dump internal grammar representation (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["dumpcgrammar"]  ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
dumpcgrammarOpt)     ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
dumpcgrammar)"Dump internal cgrammar representation (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["gentraces"]     ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
genTracesOpt)        ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
genTraces)   "Generate trace expressions (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["genusetraces"]  ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
genUseTracesOpt)     ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
genUseTraces)"Generate trace expressions at attribute use sites (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["gencostcentres"] ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
genCostCentresOpt)  ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
genCostCentres) "Generate cost centre pragmas (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["genlinepragmas"] ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
genLinePragmasOpt)  ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
genLinePragmas) "Generate GHC LINE pragmas (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["sepsemmods"]    ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
sepSemModsOpt)       ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
sepSemMods)  "Generate separate modules for semantic functions (in generated code)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['M']     ["genfiledeps"]   ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
genFileDepsOpt)      ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
genFileDeps) "Generate a list of dependencies on the input AG files"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["genvisage"]     ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
genVisageOpt)        ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
genvisage)   "Generate output for the AG visualizer Visage"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["aspectag"]      ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
genAspectAGOpt)      ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
genAspectAG) "Generate AspectAG file"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["nogroup"]       ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
noGroupOpt "attributes") Options -> String -> [String]
noGroupOptGet    "specify the attributes that won't be grouped in AspectAG"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["extends"]       ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
extendsOpt "module") ((Options -> Maybe String) -> Options -> String -> [String]
mbStringOpt Options -> Maybe String
extends)        "specify a module to be extended"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["genattrlist"]   ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
genAttrListOpt)      ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
genAttributeList) "Generate a list of all explicitly defined attributes (outside irrefutable patterns)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["forceirrefutable"] ((Maybe String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg Maybe String -> Options -> Options
forceIrrefutableOpt "file") ((Options -> Maybe String) -> Options -> String -> [String]
mbStringOpt Options -> Maybe String
forceIrrefutables) "Force a set of explicitly defined attributes to be irrefutable, specify file containing the attribute set"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["uniquedispenser"] ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
uniqueDispenserOpt "name") ((Options -> String) -> Options -> String -> [String]
stringOpt Options -> String
uniqueDispenser) "The Haskell function to call in the generated code"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["lckeywords"]    ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
lcKeywordsOpt)       ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
lcKeywords)  "Use lowercase keywords (sem, attr) instead of the uppercase ones (SEM, ATTR)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["doublecolons"]  ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
doubleColonsOpt)     ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
doubleColons)"Use double colons for type signatures instead of single colons"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt ['H']     ["haskellsyntax"] ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
haskellSyntaxOpt)    Options -> String -> [String]
noOpt                 "Use Haskell like syntax (equivalent to --lckeywords and --doublecolons --genlinepragmas)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["reference"]     ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
referenceOpt)        ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
reference)   "Use reference attributes"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["monadic"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
monadicOpt)          ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
monadic)     "Experimental: generate monadic code"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["ocaml"]         ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
ocamlOpt)            ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
ocaml)       "Generate Ocaml code"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["cleanlang"]     ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
cleanOpt)            ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
clean)       "Generate Clean code"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["breadthfirst"]  ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
breadthfirstOpt)     ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
breadthFirst)"Experimental: generate breadth-first code"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["breadthfirst-strict"] ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
breadthfirstStrictOpt) ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
breadthFirstStrict) "Experimental: outermost breadth-first evaluator is strict instead of lazy"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["visitcode"]     ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
visitorsOutputOpt)   ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
visitorsOutput) "Experimental: generate visitors code"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["kennedywarren"] ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
kennedyWarrenOpt)    ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
kennedyWarren) "Use Kennedy-Warren's algorithm for ordering"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["statistics"]    ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
statisticsOpt "FILE to append to") ((Options -> Maybe String) -> Options -> String -> [String]
mbStringOpt Options -> Maybe String
statsFile) "Append statistics to FILE"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["checkParseRhs"]           ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
parseHsRhsOpt)              ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
checkParseRhs)         "Parse RHS of rules with Haskell parser"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["checkParseTys"]           ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
parseHsTpOpt)               ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
checkParseTy)          "Parse types of attrs with Haskell parser"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["checkParseBlocks"]        ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
parseHsBlockOpt)            ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
checkParseBlock)       "Parse blocks with Haskell parser"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["checkParseHaskell"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
parseHsOpt)                 Options -> String -> [String]
noOpt                           "Parse Haskell code (recognizer)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["nocatas"]                 ((String -> Options -> Options)
-> String -> ArgDescr (Options -> Options)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String -> Options -> Options
nocatasOpt "list of nonterms") Options -> String -> [String]
nocatasOptGet               "Nonterminals not to generate catas for"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["nooptimize"]              ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
noOptimizeOpt)              ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
noOptimizations)       "Disable optimizations"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["parallel"]                ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
parallelOpt)                ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
parallelInvoke)        "Generate a parallel evaluator (if possible)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["monadicwrapper"]          ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
monadicWrappersOpt)         ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
monadicWrappers)       "Generate monadic wrappers"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["helpinlining"]            ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
helpInliningOpt)            ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
helpInlining)          "Generate inline directives for GHC"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["dummytokenvisit"]         ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
dummyTokenVisitOpt)         ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
dummyTokenVisit)       "Add an additional dummy parameter to visit functions"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["tupleasdummytoken"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
tupleAsDummyTokenOpt)       ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
tupleAsDummyToken)     "Use conventional tuples as dummy parameter instead of a RealWorld state token"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["stateasdummytoken"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
stateAsDummyTokenOpt)       Options -> String -> [String]
noOpt                           "Use RealWorld state token as dummy parameter instead of conventional tuples (default)"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["strictdummytoken"]        ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
strictDummyTokenOpt)        ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
strictDummyToken)      "Strictify the dummy token that makes states and rules functions"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["noperruletypesigs"]       ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
noPerRuleTypeSigsOpt)       ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
noPerRuleTypeSigs)     "Do not generate type sigs for attrs passed to rules"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["noperstatetypesigs"]      ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
noPerStateTypeSigsOpt)      ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
noPerStateTypeSigs)    "Do not generate type sigs for attrs saved in node states"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["noeagerblackholing"]      ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
noEagerBlackholingOpt)      ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
noEagerBlackholing)    "Do not automatically add the eager blackholing feature for parallel programs"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["noperrulecostcentres"]    ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
noPerRuleCostCentresOpt)    ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
noPerRuleCostCentres)  "Do not generate cost centres for rules"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["nopervisitcostcentres"]   ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
noPerVisitCostCentresOpt)   ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
noPerVisitCostCentres) "Do not generate cost centres for visits"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["noinlinepragmas"]         ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
noInlinePragmasOpt)         ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
noInlinePragmas)       "Definitely not generate inline directives"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["aggressiveinlinepragmas"] ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
aggressiveInlinePragmasOpt) ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
aggressiveInlinePragmas) "Generate more aggressive inline directives"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["latehigherorderbinding"]  ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
lateHigherOrderBindingOpt)  ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
lateHigherOrderBinding) "Generate an attribute and wrapper for late binding of higher-order attributes"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["noincludes"]              ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
noIncludesOpt)              ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
noIncludes)             "Ignore include directives in .ag files"
  , String
-> [String]
-> ArgDescr (Options -> Options)
-> (Options -> String -> [String])
-> String
-> MyOptDescr
MyOpt []        ["quiet"]                   ((Options -> Options) -> ArgDescr (Options -> Options)
forall a. a -> ArgDescr a
NoArg Options -> Options
beQuietOpt)                 ((Options -> Bool) -> Options -> String -> [String]
boolOpt Options -> Bool
beQuiet)                "Dont print some compilation information"
  ]

-- For compatibility
options     :: [OptDescr (Options -> Options)]
options :: [OptDescr (Options -> Options)]
options     = (MyOptDescr -> OptDescr (Options -> Options))
-> [MyOptDescr] -> [OptDescr (Options -> Options)]
forall a b. (a -> b) -> [a] -> [b]
map MyOptDescr -> OptDescr (Options -> Options)
fromMyOpt [MyOptDescr]
allOptions

allc :: String
allc :: String
allc = "dcfsprm"

data ModuleHeader  = NoName
                   | Name String
                   | Default deriving (ModuleHeader -> ModuleHeader -> Bool
(ModuleHeader -> ModuleHeader -> Bool)
-> (ModuleHeader -> ModuleHeader -> Bool) -> Eq ModuleHeader
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ModuleHeader -> ModuleHeader -> Bool
$c/= :: ModuleHeader -> ModuleHeader -> Bool
== :: ModuleHeader -> ModuleHeader -> Bool
$c== :: ModuleHeader -> ModuleHeader -> Bool
Eq, Int -> ModuleHeader -> ShowS
[ModuleHeader] -> ShowS
ModuleHeader -> String
(Int -> ModuleHeader -> ShowS)
-> (ModuleHeader -> String)
-> ([ModuleHeader] -> ShowS)
-> Show ModuleHeader
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModuleHeader] -> ShowS
$cshowList :: [ModuleHeader] -> ShowS
show :: ModuleHeader -> String
$cshow :: ModuleHeader -> String
showsPrec :: Int -> ModuleHeader -> ShowS
$cshowsPrec :: Int -> ModuleHeader -> ShowS
Show)

data Options = Options{ Options -> ModuleHeader
moduleName :: ModuleHeader
                      , Options -> Bool
dataTypes :: Bool
                      , Options -> Bool
dataRecords :: Bool
                      , Options -> Bool
strictData :: Bool
                      , Options -> Bool
strictWrap :: Bool
                      , Options -> Bool
folds :: Bool
                      , Options -> Bool
semfuns :: Bool
                      , Options -> Bool
typeSigs :: Bool
                      , Options -> Bool
attrInfo :: Bool
                      , Options -> Bool
rename :: Bool
                      , Options -> Bool
wrappers :: Bool
                      , Options -> Bool
modcopy :: Bool
                      , Options -> Bool
newtypes :: Bool
                      , Options -> Bool
nest :: Bool
                      , Options -> Bool
smacro :: Bool
                      , Options -> [String]
outputFiles :: [String]
                      , Options -> [String]
searchPath :: [String]
                      , Options -> Bool
verbose :: Bool
                      , Options -> String
prefix :: String
                      , Options -> Bool
withSelf :: Bool
                      , Options -> Bool
withCycle :: Bool
                      , Options -> Bool
showHelp :: Bool
                      , Options -> Bool
showVersion :: Bool
                      , Options -> Bool
visit :: Bool
                      , Options -> Bool
loag  :: Bool
                      , Options -> Bool
minvisits  :: Bool
                      , Options -> Bool
aoag  :: Bool
                      , Options -> Bool
withSeq :: Bool
                      , Options -> Bool
unbox :: Bool
                      , Options -> Bool
bangpats :: Bool
                      , Options -> Bool
cases :: Bool
                      , Options -> Bool
strictCases :: Bool
                      , Options -> Bool
stricterCases :: Bool
                      , Options -> Bool
strictSems :: Bool
                      , Options -> Bool
localCps :: Bool
                      , Options -> Bool
splitSems :: Bool
                      , Options -> Bool
werrors :: Bool
                      , Options -> Bool
wignore :: Bool
                      , Options -> Int
wmaxerrs :: Int
                      , Options -> Bool
dumpgrammar :: Bool
                      , Options -> Bool
dumpcgrammar :: Bool
                      , Options -> Bool
sepSemMods :: Bool
                      , Options -> Bool
allowSepSemMods :: Bool
                      , Options -> Bool
genFileDeps :: Bool
                      , Options -> Bool
genLinePragmas :: Bool
                      , Options -> Bool
genvisage :: Bool
                      , Options -> Bool
genAspectAG :: Bool
                      , Options -> [String]
noGroup :: [String]
                      , Options -> Maybe String
extends :: Maybe String
                      , Options -> Bool
genAttributeList :: Bool
                      , Options -> Maybe String
forceIrrefutables :: Maybe String
                      , Options -> String
uniqueDispenser :: String
                      , Options -> Bool
lcKeywords :: Bool
                      , Options -> Bool
doubleColons :: Bool
                      , Options -> Bool
monadic :: Bool
                      , Options -> Bool
ocaml :: Bool
                      , Options -> Bool
clean :: Bool
                      , Options -> Bool
visitorsOutput :: Bool
                      , Options -> Maybe String
statsFile :: Maybe String
                      , Options -> Bool
breadthFirst :: Bool
                      , Options -> Bool
breadthFirstStrict :: Bool
                      , Options -> Bool
checkParseRhs :: Bool
                      , Options -> Bool
checkParseTy :: Bool
                      , Options -> Bool
checkParseBlock :: Bool
                      , Options -> Set Identifier
nocatas :: Set NontermIdent
                      , Options -> Bool
noOptimizations :: Bool
                      , Options -> Bool
reference :: Bool
                      , Options -> Bool
noIncludes :: Bool
                      , Options -> String -> IO ()
outputStr :: String -> IO ()
                      , Options -> Int -> IO ()
failWithCode :: Int -> IO ()
                      , Options -> Maybe String
mainFilename :: Maybe String
                      , Options -> Bool
beQuiet :: Bool

                      -- KW code path
                      , Options -> Bool
kennedyWarren       :: Bool
                      , Options -> Bool
parallelInvoke      :: Bool
                      , Options -> Bool
tupleAsDummyToken   :: Bool  -- use the empty tuple as dummy token instead of State# RealWorld (Lambda State Hack GHC?)
                      , Options -> Bool
dummyTokenVisit     :: Bool  -- add a dummy argument/pass dummy extra token to visits (should not really have an effect ... Lambda State Hack GHC?)
                      , Options -> Bool
strictDummyToken    :: Bool  -- make the dummy token strict (to prevent its removal -- should not really have an effect)
                      , Options -> Bool
noPerRuleTypeSigs   :: Bool  -- do not print type signatures for attributes of rules
                      , Options -> Bool
noPerStateTypeSigs  :: Bool  -- do not print type signatures for attributes contained in the state
                      , Options -> Bool
noEagerBlackholing  :: Bool  -- disable the use of eager black holing in the parallel evaluator code
                      , Options -> Bool
lateHigherOrderBinding :: Bool  -- generate code to allow late binding of higher-order children semantics
                      , Options -> Bool
monadicWrappers        :: Bool

                      -- tracing
                      , Options -> Bool
genTraces :: Bool
                      , Options -> Bool
genUseTraces :: Bool
                      , Options -> Bool
genCostCentres :: Bool
                      , Options -> Bool
noPerRuleCostCentres :: Bool
                      , Options -> Bool
noPerVisitCostCentres :: Bool

                      -- inline pragma generation
                      , Options -> Bool
helpInlining :: Bool
                      , Options -> Bool
noInlinePragmas :: Bool
                      , Options -> Bool
aggressiveInlinePragmas :: Bool
                      } -- deriving (Eq, Show)

noOptions :: Options
noOptions :: Options
noOptions = Options :: ModuleHeader
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> [String]
-> Bool
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Int
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> [String]
-> Maybe String
-> Bool
-> Maybe String
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Maybe String
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Set Identifier
-> Bool
-> Bool
-> Bool
-> (String -> IO ())
-> (Int -> IO ())
-> Maybe String
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Options
Options { moduleName :: ModuleHeader
moduleName    = ModuleHeader
NoName
                    , dataTypes :: Bool
dataTypes     = Bool
False
                    , dataRecords :: Bool
dataRecords   = Bool
False
                    , strictData :: Bool
strictData    = Bool
False
                    , strictWrap :: Bool
strictWrap    = Bool
False
                    , folds :: Bool
folds         = Bool
False
                    , semfuns :: Bool
semfuns       = Bool
False
                    , typeSigs :: Bool
typeSigs      = Bool
False
                    , attrInfo :: Bool
attrInfo      = Bool
False
                    , rename :: Bool
rename        = Bool
False
                    , wrappers :: Bool
wrappers      = Bool
False
                    , modcopy :: Bool
modcopy       = Bool
False
                    , newtypes :: Bool
newtypes      = Bool
False
                    , nest :: Bool
nest          = Bool
False
                    , smacro :: Bool
smacro        = Bool
False
                    , outputFiles :: [String]
outputFiles   = []
                    , searchPath :: [String]
searchPath    = []
                    , verbose :: Bool
verbose       = Bool
False
                    , showHelp :: Bool
showHelp      = Bool
False
                    , showVersion :: Bool
showVersion   = Bool
False
                    , prefix :: String
prefix        = "sem_"
                    , withSelf :: Bool
withSelf      = Bool
False
                    , withCycle :: Bool
withCycle     = Bool
False
                    , visit :: Bool
visit         = Bool
False
                    , loag :: Bool
loag          = Bool
False
                    , minvisits :: Bool
minvisits     = Bool
False
                    , aoag :: Bool
aoag          = Bool
False
                    , withSeq :: Bool
withSeq       = Bool
False
                    , unbox :: Bool
unbox         = Bool
False
                    , bangpats :: Bool
bangpats      = Bool
False
                    , cases :: Bool
cases         = Bool
False
                    , strictCases :: Bool
strictCases   = Bool
False
                    , stricterCases :: Bool
stricterCases = Bool
False
                    , strictSems :: Bool
strictSems    = Bool
False
                    , localCps :: Bool
localCps      = Bool
False
                    , splitSems :: Bool
splitSems     = Bool
False
                    , werrors :: Bool
werrors       = Bool
False
                    , wignore :: Bool
wignore       = Bool
False
                    , wmaxerrs :: Int
wmaxerrs      = 99999
                    , dumpgrammar :: Bool
dumpgrammar   = Bool
False
                    , dumpcgrammar :: Bool
dumpcgrammar  = Bool
False
                    , sepSemMods :: Bool
sepSemMods     = Bool
False
                    , allowSepSemMods :: Bool
allowSepSemMods = Bool
True
                    , genFileDeps :: Bool
genFileDeps    = Bool
False
                    , genLinePragmas :: Bool
genLinePragmas = Bool
False
                    , genvisage :: Bool
genvisage      = Bool
False
                    , genAspectAG :: Bool
genAspectAG    = Bool
False
                    , noGroup :: [String]
noGroup        = []
                    , extends :: Maybe String
extends        = Maybe String
forall a. Maybe a
Nothing
                    , genAttributeList :: Bool
genAttributeList = Bool
False
                    , forceIrrefutables :: Maybe String
forceIrrefutables = Maybe String
forall a. Maybe a
Nothing
                    , uniqueDispenser :: String
uniqueDispenser = "nextUnique"
                    , lcKeywords :: Bool
lcKeywords      = Bool
False
                    , doubleColons :: Bool
doubleColons    = Bool
False
                    , monadic :: Bool
monadic         = Bool
False
                    , ocaml :: Bool
ocaml           = Bool
False
                    , clean :: Bool
clean           = Bool
False
                    , visitorsOutput :: Bool
visitorsOutput  = Bool
False
                    , statsFile :: Maybe String
statsFile       = Maybe String
forall a. Maybe a
Nothing
                    , breadthFirst :: Bool
breadthFirst     = Bool
False
                    , breadthFirstStrict :: Bool
breadthFirstStrict = Bool
False
                    , checkParseRhs :: Bool
checkParseRhs = Bool
False
                    , checkParseTy :: Bool
checkParseTy  = Bool
False
                    , checkParseBlock :: Bool
checkParseBlock = Bool
False
                    , nocatas :: Set Identifier
nocatas         = Set Identifier
forall a. Set a
Set.empty
                    , noOptimizations :: Bool
noOptimizations = Bool
False
                    , reference :: Bool
reference       = Bool
False
                    , noIncludes :: Bool
noIncludes      = Bool
False
                    , outputStr :: String -> IO ()
outputStr       = Handle -> String -> IO ()
hPutStr Handle
stderr
                    , failWithCode :: Int -> IO ()
failWithCode    = ExitCode -> IO ()
forall a. ExitCode -> IO a
exitWith (ExitCode -> IO ()) -> (Int -> ExitCode) -> Int -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ExitCode
ExitFailure
                    , mainFilename :: Maybe String
mainFilename    = Maybe String
forall a. Maybe a
Nothing
                    , beQuiet :: Bool
beQuiet         = Bool
False

                    -- defaults for the KW-code path
                    , kennedyWarren :: Bool
kennedyWarren       = Bool
False
                    , parallelInvoke :: Bool
parallelInvoke      = Bool
False
                    , tupleAsDummyToken :: Bool
tupleAsDummyToken   = Bool
True
                    , dummyTokenVisit :: Bool
dummyTokenVisit     = Bool
False
                    , strictDummyToken :: Bool
strictDummyToken    = Bool
False
                    , noPerRuleTypeSigs :: Bool
noPerRuleTypeSigs   = Bool
False
                    , noPerStateTypeSigs :: Bool
noPerStateTypeSigs  = Bool
False
                    , noEagerBlackholing :: Bool
noEagerBlackholing  = Bool
False
                    , lateHigherOrderBinding :: Bool
lateHigherOrderBinding = Bool
False
                    , monadicWrappers :: Bool
monadicWrappers        = Bool
False

                    -- defaults for tracing
                    , genTraces :: Bool
genTraces     = Bool
False
                    , genUseTraces :: Bool
genUseTraces  = Bool
False
                    , genCostCentres :: Bool
genCostCentres = Bool
False
                    , noPerRuleCostCentres :: Bool
noPerRuleCostCentres  = Bool
False
                    , noPerVisitCostCentres :: Bool
noPerVisitCostCentres = Bool
False

                    -- defaults for inline pragma generation
                    , helpInlining :: Bool
helpInlining    = Bool
False
                    , noInlinePragmas :: Bool
noInlinePragmas = Bool
False
                    , aggressiveInlinePragmas :: Bool
aggressiveInlinePragmas = Bool
False
                    }

loagOpt :: (Maybe String) -> Options -> Options
loagOpt :: Maybe String -> Options -> Options
loagOpt mstr :: Maybe String
mstr opts :: Options
opts = 
    case Maybe String
mstr of
        Nothing     -> Options
opts'
        Just "0"    -> Options
opts'
        Just _      -> Options
opts' {minvisits :: Bool
minvisits = Bool
True}

 where  opts' :: Options
opts'=Options
opts{loag :: Bool
loag = Bool
True, visit :: Bool
visit = Bool
True}

aoagOpt :: Options -> Options
aoagOpt :: Options -> Options
aoagOpt opts :: Options
opts = 
    Options
opts{loag :: Bool
loag = Bool
True, visit :: Bool
visit = Bool
True, aoag :: Bool
aoag = Bool
True}

--Options -> String -> [String]
moduleOpt :: Maybe String -> Options -> Options
moduleOpt :: Maybe String -> Options -> Options
moduleOpt  nm :: Maybe String
nm   opts :: Options
opts = Options
opts{moduleName :: ModuleHeader
moduleName   = ModuleHeader
-> (String -> ModuleHeader) -> Maybe String -> ModuleHeader
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ModuleHeader
Default String -> ModuleHeader
Name Maybe String
nm}
moduleOptGet :: Options -> String -> [String]
moduleOptGet :: Options -> String -> [String]
moduleOptGet opts :: Options
opts nm :: String
nm = case Options -> ModuleHeader
moduleName Options
opts of
  NoName -> []
  Name s :: String
s -> [String
nmString -> ShowS
forall a. [a] -> [a] -> [a]
++"="String -> ShowS
forall a. [a] -> [a] -> [a]
++String
s]
  Default -> [String
nm]

dataOpt, dataRecOpt, strictDataOpt, strictWrapOpt, cataOpt, semfunsOpt, signaturesOpt, prettyOpt,renameOpt, wrappersOpt, modcopyOpt, newtypesOpt, nestOpt, smacroOpt, verboseOpt, helpOpt, versionOpt, selfOpt, cycleOpt, visitOpt, seqOpt, unboxOpt, bangpatsOpt, casesOpt, strictCasesOpt, stricterCasesOpt, strictSemOpt, localCpsOpt, splitSemsOpt, werrorsOpt, wignoreOpt, dumpgrammarOpt, dumpcgrammarOpt, genTracesOpt, genUseTracesOpt, genCostCentresOpt, sepSemModsOpt, genFileDepsOpt, genLinePragmasOpt, genVisageOpt, genAspectAGOpt, dummyTokenVisitOpt, tupleAsDummyTokenOpt, stateAsDummyTokenOpt, strictDummyTokenOpt, noPerRuleTypeSigsOpt, noPerStateTypeSigsOpt, noEagerBlackholingOpt, noPerRuleCostCentresOpt, noPerVisitCostCentresOpt, helpInliningOpt, noInlinePragmasOpt, aggressiveInlinePragmasOpt, lateHigherOrderBindingOpt, monadicWrappersOpt, referenceOpt, genAttrListOpt, lcKeywordsOpt, doubleColonsOpt, haskellSyntaxOpt, monadicOpt, parallelOpt, ocamlOpt, cleanOpt, visitorsOutputOpt, breadthfirstOpt, breadthfirstStrictOpt, parseHsRhsOpt, parseHsTpOpt, parseHsBlockOpt, parseHsOpt, kennedyWarrenOpt, noOptimizeOpt, allOpt, optimizeOpt, noIncludesOpt, beQuietOpt, condDisableOptimizations :: Options -> Options

dataOpt :: Options -> Options
dataOpt         opts :: Options
opts = Options
opts{dataTypes :: Bool
dataTypes    = Bool
True}
dataRecOpt :: Options -> Options
dataRecOpt      opts :: Options
opts = Options
opts{dataRecords :: Bool
dataRecords  = Bool
True}
strictDataOpt :: Options -> Options
strictDataOpt   opts :: Options
opts = Options
opts{strictData :: Bool
strictData   = Bool
True}
strictWrapOpt :: Options -> Options
strictWrapOpt   opts :: Options
opts = Options
opts{strictWrap :: Bool
strictWrap   = Bool
True}
cataOpt :: Options -> Options
cataOpt         opts :: Options
opts = Options
opts{folds :: Bool
folds        = Bool
True}
semfunsOpt :: Options -> Options
semfunsOpt      opts :: Options
opts = Options
opts{semfuns :: Bool
semfuns      = Bool
True}
signaturesOpt :: Options -> Options
signaturesOpt   opts :: Options
opts = Options
opts{typeSigs :: Bool
typeSigs     = Bool
True}
prettyOpt :: Options -> Options
prettyOpt       opts :: Options
opts = Options
opts{attrInfo :: Bool
attrInfo     = Bool
True}
renameOpt :: Options -> Options
renameOpt       opts :: Options
opts = Options
opts{rename :: Bool
rename       = Bool
True}
wrappersOpt :: Options -> Options
wrappersOpt     opts :: Options
opts = Options
opts{wrappers :: Bool
wrappers     = Bool
True}
modcopyOpt :: Options -> Options
modcopyOpt      opts :: Options
opts = Options
opts{modcopy :: Bool
modcopy      = Bool
True}
newtypesOpt :: Options -> Options
newtypesOpt     opts :: Options
opts = Options
opts{newtypes :: Bool
newtypes     = Bool
True}
nestOpt :: Options -> Options
nestOpt         opts :: Options
opts = Options
opts{nest :: Bool
nest         = Bool
True}
smacroOpt :: Options -> Options
smacroOpt       opts :: Options
opts = Options
opts{smacro :: Bool
smacro       = Bool
True}
verboseOpt :: Options -> Options
verboseOpt      opts :: Options
opts = Options
opts{verbose :: Bool
verbose      = Bool
True}
helpOpt :: Options -> Options
helpOpt         opts :: Options
opts = Options
opts{showHelp :: Bool
showHelp     = Bool
True}
versionOpt :: Options -> Options
versionOpt      opts :: Options
opts = Options
opts{showVersion :: Bool
showVersion  = Bool
True}
prefixOpt :: String -> Options -> Options
prefixOpt :: String -> Options -> Options
prefixOpt pre :: String
pre   opts :: Options
opts = Options
opts{prefix :: String
prefix       = String
pre }
selfOpt :: Options -> Options
selfOpt         opts :: Options
opts = Options
opts{withSelf :: Bool
withSelf     = Bool
True}
cycleOpt :: Options -> Options
cycleOpt        opts :: Options
opts = Options
opts{withCycle :: Bool
withCycle    = Bool
True}
visitOpt :: Options -> Options
visitOpt        opts :: Options
opts = Options
opts{visit :: Bool
visit        = Bool
True, withCycle :: Bool
withCycle = Bool
True}
seqOpt :: Options -> Options
seqOpt          opts :: Options
opts = Options
opts{withSeq :: Bool
withSeq      = Bool
True}
unboxOpt :: Options -> Options
unboxOpt        opts :: Options
opts = Options
opts{unbox :: Bool
unbox        = Bool
True}
bangpatsOpt :: Options -> Options
bangpatsOpt     opts :: Options
opts = Options
opts{bangpats :: Bool
bangpats     = Bool
True}
casesOpt :: Options -> Options
casesOpt        opts :: Options
opts = Options
opts{cases :: Bool
cases        = Bool
True}
strictCasesOpt :: Options -> Options
strictCasesOpt  opts :: Options
opts = Options
opts{strictCases :: Bool
strictCases  = Bool
True}
stricterCasesOpt :: Options -> Options
stricterCasesOpt opts :: Options
opts = Options
opts{strictCases :: Bool
strictCases = Bool
True, stricterCases :: Bool
stricterCases = Bool
True}
strictSemOpt :: Options -> Options
strictSemOpt    opts :: Options
opts = Options
opts{strictSems :: Bool
strictSems   = Bool
True}
localCpsOpt :: Options -> Options
localCpsOpt     opts :: Options
opts = Options
opts{localCps :: Bool
localCps     = Bool
True}
splitSemsOpt :: Options -> Options
splitSemsOpt    opts :: Options
opts = Options
opts{splitSems :: Bool
splitSems    = Bool
True}
werrorsOpt :: Options -> Options
werrorsOpt      opts :: Options
opts = Options
opts{werrors :: Bool
werrors      = Bool
True}
wignoreOpt :: Options -> Options
wignoreOpt      opts :: Options
opts = Options
opts{wignore :: Bool
wignore      = Bool
True}
wmaxErrsOpt :: String -> Options -> Options
wmaxErrsOpt :: String -> Options -> Options
wmaxErrsOpt n :: String
n   opts :: Options
opts = Options
opts{wmaxerrs :: Int
wmaxerrs     = String -> Int
forall a. Read a => String -> a
read String
n}
wmaxErrsOptGet :: Options -> String -> [String]
wmaxErrsOptGet :: Options -> String -> [String]
wmaxErrsOptGet opts :: Options
opts nm :: String
nm = if Options -> Int
wmaxerrs Options
opts Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Options -> Int
wmaxerrs Options
noOptions
                         then [String
nm,Int -> String
forall a. Show a => a -> String
show (Options -> Int
wmaxerrs Options
opts)]
                         else []
dumpgrammarOpt :: Options -> Options
dumpgrammarOpt  opts :: Options
opts = Options
opts{dumpgrammar :: Bool
dumpgrammar  = Bool
True}
dumpcgrammarOpt :: Options -> Options
dumpcgrammarOpt opts :: Options
opts = Options
opts{dumpcgrammar :: Bool
dumpcgrammar = Bool
True}
genTracesOpt :: Options -> Options
genTracesOpt    opts :: Options
opts = Options
opts{genTraces :: Bool
genTraces    = Bool
True}
genUseTracesOpt :: Options -> Options
genUseTracesOpt opts :: Options
opts = Options
opts{genUseTraces :: Bool
genUseTraces = Bool
True}
genCostCentresOpt :: Options -> Options
genCostCentresOpt opts :: Options
opts = Options
opts{genCostCentres :: Bool
genCostCentres = Bool
True}
sepSemModsOpt :: Options -> Options
sepSemModsOpt opts :: Options
opts = Options
opts{sepSemMods :: Bool
sepSemMods = Options -> Bool
allowSepSemMods Options
opts}
genFileDepsOpt :: Options -> Options
genFileDepsOpt opts :: Options
opts = Options
opts{genFileDeps :: Bool
genFileDeps = Bool
True}
genLinePragmasOpt :: Options -> Options
genLinePragmasOpt opts :: Options
opts = Options
opts{genLinePragmas :: Bool
genLinePragmas = Bool
True}
genVisageOpt :: Options -> Options
genVisageOpt opts :: Options
opts = Options
opts{genvisage :: Bool
genvisage = Bool
True }
genAspectAGOpt :: Options -> Options
genAspectAGOpt opts :: Options
opts = Options
opts{genAspectAG :: Bool
genAspectAG = Bool
True}

dummyTokenVisitOpt :: Options -> Options
dummyTokenVisitOpt opts :: Options
opts         = Options
opts { dummyTokenVisit :: Bool
dummyTokenVisit = Bool
True }
tupleAsDummyTokenOpt :: Options -> Options
tupleAsDummyTokenOpt opts :: Options
opts       = Options
opts { tupleAsDummyToken :: Bool
tupleAsDummyToken = Bool
True }
stateAsDummyTokenOpt :: Options -> Options
stateAsDummyTokenOpt opts :: Options
opts       = Options
opts { tupleAsDummyToken :: Bool
tupleAsDummyToken = Bool
False }
strictDummyTokenOpt :: Options -> Options
strictDummyTokenOpt opts :: Options
opts        = Options
opts { strictDummyToken :: Bool
strictDummyToken = Bool
True }
noPerRuleTypeSigsOpt :: Options -> Options
noPerRuleTypeSigsOpt opts :: Options
opts       = Options
opts { noPerRuleTypeSigs :: Bool
noPerRuleTypeSigs = Bool
True }
noPerStateTypeSigsOpt :: Options -> Options
noPerStateTypeSigsOpt opts :: Options
opts      = Options
opts { noPerStateTypeSigs :: Bool
noPerStateTypeSigs = Bool
True }
noEagerBlackholingOpt :: Options -> Options
noEagerBlackholingOpt opts :: Options
opts      = Options
opts { noEagerBlackholing :: Bool
noEagerBlackholing = Bool
True }
noPerRuleCostCentresOpt :: Options -> Options
noPerRuleCostCentresOpt opts :: Options
opts    = Options
opts { noPerRuleCostCentres :: Bool
noPerRuleCostCentres = Bool
True }
noPerVisitCostCentresOpt :: Options -> Options
noPerVisitCostCentresOpt opts :: Options
opts   = Options
opts { noPerVisitCostCentres :: Bool
noPerVisitCostCentres = Bool
True }
helpInliningOpt :: Options -> Options
helpInliningOpt opts :: Options
opts            = Options
opts { helpInlining :: Bool
helpInlining = Bool
True }
noInlinePragmasOpt :: Options -> Options
noInlinePragmasOpt opts :: Options
opts         = Options
opts { noInlinePragmas :: Bool
noInlinePragmas = Bool
True }
aggressiveInlinePragmasOpt :: Options -> Options
aggressiveInlinePragmasOpt opts :: Options
opts = Options
opts { aggressiveInlinePragmas :: Bool
aggressiveInlinePragmas = Bool
True }
lateHigherOrderBindingOpt :: Options -> Options
lateHigherOrderBindingOpt opts :: Options
opts  = Options
opts { lateHigherOrderBinding :: Bool
lateHigherOrderBinding = Bool
True }
monadicWrappersOpt :: Options -> Options
monadicWrappersOpt opts :: Options
opts         = Options
opts { monadicWrappers :: Bool
monadicWrappers = Bool
True }
referenceOpt :: Options -> Options
referenceOpt opts :: Options
opts               = Options
opts { reference :: Bool
reference = Bool
True }

noGroupOpt :: String -> Options -> Options
noGroupOpt :: String -> Options -> Options
noGroupOpt  att :: String
att  opts :: Options
opts = Options
opts{noGroup :: [String]
noGroup  = (Char -> Bool) -> String -> [String]
wordsBy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ':') String
att  [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Options -> [String]
noGroup Options
opts}
noGroupOptGet :: Options -> String -> [String]
noGroupOptGet :: Options -> String -> [String]
noGroupOptGet opts :: Options
opts nm :: String
nm = if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Options -> [String]
noGroup Options
opts)
                        then []
                        else [String
nm, String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate ":" (Options -> [String]
noGroup Options
opts)]
extendsOpt :: String -> Options -> Options
extendsOpt :: String -> Options -> Options
extendsOpt  m :: String
m  opts :: Options
opts = Options
opts{extends :: Maybe String
extends  = String -> Maybe String
forall a. a -> Maybe a
Just String
m }

genAttrListOpt :: Options -> Options
genAttrListOpt opts :: Options
opts = Options
opts { genAttributeList :: Bool
genAttributeList = Bool
True }
forceIrrefutableOpt :: Maybe String -> Options -> Options
forceIrrefutableOpt :: Maybe String -> Options -> Options
forceIrrefutableOpt mbNm :: Maybe String
mbNm opts :: Options
opts = Options
opts { forceIrrefutables :: Maybe String
forceIrrefutables = Maybe String
mbNm }
uniqueDispenserOpt :: String -> Options -> Options
uniqueDispenserOpt :: String -> Options -> Options
uniqueDispenserOpt nm :: String
nm opts :: Options
opts = Options
opts { uniqueDispenser :: String
uniqueDispenser = String
nm }
lcKeywordsOpt :: Options -> Options
lcKeywordsOpt opts :: Options
opts = Options
opts { lcKeywords :: Bool
lcKeywords = Bool
True }
doubleColonsOpt :: Options -> Options
doubleColonsOpt opts :: Options
opts = Options
opts { doubleColons :: Bool
doubleColons = Bool
True }
haskellSyntaxOpt :: Options -> Options
haskellSyntaxOpt = Options -> Options
lcKeywordsOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
doubleColonsOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
genLinePragmasOpt
monadicOpt :: Options -> Options
monadicOpt opts :: Options
opts = Options
opts { monadic :: Bool
monadic = Bool
True }
parallelOpt :: Options -> Options
parallelOpt opts :: Options
opts = Options
opts { parallelInvoke :: Bool
parallelInvoke = Bool
True }
ocamlOpt :: Options -> Options
ocamlOpt opts :: Options
opts = Options
opts { ocaml :: Bool
ocaml = Bool
True, kennedyWarren :: Bool
kennedyWarren = Bool
True, withCycle :: Bool
withCycle = Bool
True, visit :: Bool
visit = Bool
True }
cleanOpt :: Options -> Options
cleanOpt opts :: Options
opts = Options
opts { clean :: Bool
clean = Bool
True } --TODO: More?
visitorsOutputOpt :: Options -> Options
visitorsOutputOpt opts :: Options
opts = Options
opts { visitorsOutput :: Bool
visitorsOutput = Bool
True }
statisticsOpt :: String -> Options -> Options
statisticsOpt :: String -> Options -> Options
statisticsOpt nm :: String
nm opts :: Options
opts = Options
opts { statsFile :: Maybe String
statsFile = String -> Maybe String
forall a. a -> Maybe a
Just String
nm }
breadthfirstOpt :: Options -> Options
breadthfirstOpt opts :: Options
opts = Options
opts { breadthFirst :: Bool
breadthFirst = Bool
True }
breadthfirstStrictOpt :: Options -> Options
breadthfirstStrictOpt opts :: Options
opts = Options
opts { breadthFirstStrict :: Bool
breadthFirstStrict = Bool
True }
parseHsRhsOpt :: Options -> Options
parseHsRhsOpt opts :: Options
opts = Options
opts { checkParseRhs :: Bool
checkParseRhs = Bool
True }
parseHsTpOpt :: Options -> Options
parseHsTpOpt opts :: Options
opts = Options
opts { checkParseTy :: Bool
checkParseTy = Bool
True }
parseHsBlockOpt :: Options -> Options
parseHsBlockOpt opts :: Options
opts = Options
opts { checkParseBlock :: Bool
checkParseBlock = Bool
True }
parseHsOpt :: Options -> Options
parseHsOpt = Options -> Options
parseHsRhsOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
parseHsTpOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
parseHsBlockOpt
kennedyWarrenOpt :: Options -> Options
kennedyWarrenOpt opts :: Options
opts = Options
opts { kennedyWarren :: Bool
kennedyWarren = Bool
True }
noOptimizeOpt :: Options -> Options
noOptimizeOpt opts :: Options
opts = Options
opts { noOptimizations :: Bool
noOptimizations = Bool
True }
nocatasOpt :: String -> Options -> Options
nocatasOpt :: String -> Options -> Options
nocatasOpt str :: String
str opts :: Options
opts = Options
opts { nocatas :: Set Identifier
nocatas = Set Identifier
set Set Identifier -> Set Identifier -> Set Identifier
forall a. Ord a => Set a -> Set a -> Set a
`Set.union` Options -> Set Identifier
nocatas Options
opts } where
  set :: Set Identifier
set = [Identifier] -> Set Identifier
forall a. Ord a => [a] -> Set a
Set.fromList [Identifier]
ids
  ids :: [Identifier]
ids = (String -> Identifier) -> [String] -> [Identifier]
forall a b. (a -> b) -> [a] -> [b]
map String -> Identifier
identifier [String]
lst
  lst :: [String]
lst = (Char -> Bool) -> String -> [String]
wordsBy (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ',') String
str
nocatasOptGet :: Options -> String -> [String]
nocatasOptGet :: Options -> String -> [String]
nocatasOptGet opts :: Options
opts nm :: String
nm = if Set Identifier -> Bool
forall a. Set a -> Bool
Set.null (Options -> Set Identifier
nocatas Options
opts)
                        then []
                        else [String
nm,String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate "," ([String] -> String) -> (Options -> [String]) -> Options -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identifier -> String) -> [Identifier] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Identifier -> String
getName ([Identifier] -> [String])
-> (Options -> [Identifier]) -> Options -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Set Identifier -> [Identifier]
forall a. Set a -> [a]
Set.toList (Set Identifier -> [Identifier])
-> (Options -> Set Identifier) -> Options -> [Identifier]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Set Identifier
nocatas (Options -> String) -> Options -> String
forall a b. (a -> b) -> a -> b
$ Options
opts]
outputOpt :: String -> Options -> Options
outputOpt :: String -> Options -> Options
outputOpt  file :: String
file  opts :: Options
opts = Options
opts{outputFiles :: [String]
outputFiles  = String
file String -> [String] -> [String]
forall a. a -> [a] -> [a]
: Options -> [String]
outputFiles Options
opts}
outputOptGet :: Options -> String -> [String]
outputOptGet :: Options -> String -> [String]
outputOptGet opts :: Options
opts nm :: String
nm  = [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ [String
nm, String
file] | String
file <- Options -> [String]
outputFiles Options
opts]
searchPathOpt :: String -> Options -> Options
searchPathOpt :: String -> Options -> Options
searchPathOpt  path :: String
path  opts :: Options
opts = Options
opts{searchPath :: [String]
searchPath  = (Char -> Bool) -> String -> [String]
wordsBy (\x :: Char
x -> Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ';' Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== ':') String
path [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ Options -> [String]
searchPath Options
opts}
searchPathOptGet :: Options -> String -> [String]
searchPathOptGet :: Options -> String -> [String]
searchPathOptGet opts :: Options
opts nm :: String
nm = if [String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Options -> [String]
searchPath Options
opts)
                           then []
                           else [String
nm, String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate ":" (Options -> [String]
searchPath Options
opts)]
allOpt :: Options -> Options
allOpt = Maybe String -> Options -> Options
moduleOpt Maybe String
forall a. Maybe a
Nothing (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
dataOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
cataOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
semfunsOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
signaturesOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
prettyOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
renameOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
dataRecOpt
optimizeOpt :: Options -> Options
optimizeOpt   = Options -> Options
visitOpt (Options -> Options) -> (Options -> Options) -> Options -> Options
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Options -> Options
casesOpt
noIncludesOpt :: Options -> Options
noIncludesOpt opts :: Options
opts = Options
opts { noIncludes :: Bool
noIncludes = Bool
True }
beQuietOpt :: Options -> Options
beQuietOpt opts :: Options
opts = Options
opts { beQuiet :: Bool
beQuiet = Bool
True }

condDisableOptimizations :: Options -> Options
condDisableOptimizations opts :: Options
opts
  | Options -> Bool
noOptimizations Options
opts =
      Options
opts { strictData :: Bool
strictData         = Bool
False
           , strictWrap :: Bool
strictWrap         = Bool
False
           , withSeq :: Bool
withSeq            = Bool
False
           , unbox :: Bool
unbox              = Bool
False
           , bangpats :: Bool
bangpats           = Bool
False
           , cases :: Bool
cases              = Bool
False
           , strictCases :: Bool
strictCases        = Bool
False
           , stricterCases :: Bool
stricterCases      = Bool
False
           , strictSems :: Bool
strictSems         = Bool
False
           , localCps :: Bool
localCps           = Bool
False
           , splitSems :: Bool
splitSems          = Bool
False
           , breadthFirstStrict :: Bool
breadthFirstStrict = Bool
False
           }
  | Bool
otherwise = Options
opts
                
-- | Inverse of intercalate
wordsBy :: (Char -> Bool) -> String -> [String]
wordsBy :: (Char -> Bool) -> String -> [String]
wordsBy p :: Char -> Bool
p = String -> [String]
f
  where
    f :: String -> [String]
f s :: String
s = let (x :: String
x,xs :: String
xs) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break Char -> Bool
p String
s
          in  if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
x then [] else String
x String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String -> [String]
f (Int -> ShowS
forall a. Int -> [a] -> [a]
drop 1 String
xs)
                
-- | Use all parsed options to generate real options
constructOptions :: [Options -> Options] -> Options
constructOptions :: [Options -> Options] -> Options
constructOptions = (Options -> (Options -> Options) -> Options)
-> Options -> [Options -> Options] -> Options
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (((Options -> Options) -> Options -> Options)
-> Options -> (Options -> Options) -> Options
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Options -> Options) -> Options -> Options
forall a b. (a -> b) -> a -> b
($)) Options
noOptions

-- | Create Options type from string arguments
getOptions :: [String] -> (Options,[String],[String])
getOptions :: [String] -> (Options, [String], [String])
getOptions args :: [String]
args = let (flags :: [Options -> Options]
flags,files :: [String]
files,errors :: [String]
errors) = ArgOrder (Options -> Options)
-> [OptDescr (Options -> Options)]
-> [String]
-> ([Options -> Options], [String], [String])
forall a.
ArgOrder a -> [OptDescr a] -> [String] -> ([a], [String], [String])
getOpt ArgOrder (Options -> Options)
forall a. ArgOrder a
Permute [OptDescr (Options -> Options)]
options [String]
args
                      appliedOpts :: Options
appliedOpts = [Options -> Options] -> Options
constructOptions [Options -> Options]
flags
                      finOpts :: Options
finOpts = Options -> Options
condDisableOptimizations Options
appliedOpts
                  in (Options
finOpts,[String]
files,[String]
errors)

-- | Convert options back to commandline string
optionsToString :: Options -> [String]
optionsToString :: Options -> [String]
optionsToString opt :: Options
opt = (MyOptDescr -> [String]) -> [MyOptDescr] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Options -> MyOptDescr -> [String]
serializeOption Options
opt) [MyOptDescr]
allOptions

-- | Combine 2 sets of options
combineOptions :: Options -> Options -> Options
combineOptions :: Options -> Options -> Options
combineOptions o1 :: Options
o1 o2 :: Options
o2 = let str1 :: [String]
str1      = Options -> [String]
optionsToString Options
o1
                           str2 :: [String]
str2      = Options -> [String]
optionsToString Options
o2
                           (opt :: Options
opt,_,_) = [String] -> (Options, [String], [String])
getOptions ([String]
str1 [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
str2)
                       in  Options
opt