-- ==========================================================--
-- === Main module Main.hs ===--
-- ==========================================================--
module Main where
import BaseDefs
import Utils
import MyUtils
import Parser2
import PrettyPrint
import LambdaLift5
import TypeCheck5
import EtaAbstract
import StrictAn6
import ReadTable
--import System -- partain: for 1.3
import Char(isDigit)
-- ==========================================================--
--
maBaseTypes :: TcTypeEnv
maBaseTypes
= [
("_not", Scheme [] (TArr tcBool tcBool)),
("_+", Scheme [] (TArr tcInt (TArr tcInt tcInt))),
("_-", Scheme [] (TArr tcInt (TArr tcInt tcInt))),
("_*", Scheme [] (TArr tcInt (TArr tcInt tcInt))),
("_/", Scheme [] (TArr tcInt (TArr tcInt tcInt))),
("_%", Scheme [] (TArr tcInt (TArr tcInt tcInt))),
("_<", Scheme [] (TArr tcInt (TArr tcInt tcBool))),
("_<=", Scheme [] (TArr tcInt (TArr tcInt tcBool))),
("_==", Scheme [] (TArr tcInt (TArr tcInt tcBool))),
("_~=", Scheme [] (TArr tcInt (TArr tcInt tcBool))),
("_>=", Scheme [] (TArr tcInt (TArr tcInt tcBool))),
("_>", Scheme [] (TArr tcInt (TArr tcInt tcBool))),
("_|", Scheme [] (TArr tcBool (TArr tcBool tcBool))),
("_&", Scheme [] (TArr tcBool (TArr tcBool tcBool))),
("_#", Scheme [] (TArr tcBool (TArr tcBool tcBool)))
-- *** parallel or *** ---
]
-- ==========================================================--
--
maBaseAnns :: AList Naam (HExpr Naam)
maBaseAnns
= [
("_not", strictUnaryFunc ),
("_+", strictBinaryFunc ),
("_-", strictBinaryFunc ),
("_*", strictBinaryFunc ),
("_/", strictBinaryFunc ),
("_%", strictBinaryFunc ),
("_<", strictBinaryFunc ),
("_<=", strictBinaryFunc ),
("_==", strictBinaryFunc ),
("_~=", strictBinaryFunc ),
("_>=", strictBinaryFunc ),
("_>", strictBinaryFunc ),
("_|", strictBinaryFunc ),
("_&", strictBinaryFunc ),
("_#", nonLambdaDefinableFunc ),
("False", HPoint One),
("True", HPoint One)
]
where
strictUnaryFunc
= HPoint (Rep (RepTwo
(Min1Max0 1 [MkFrel [One]]
[MkFrel [Zero]])))
strictBinaryFunc
= HPoint (Rep (RepTwo
(Min1Max0 2 [MkFrel [One, One]]
[MkFrel [Zero, One], MkFrel [One, Zero]])))
nonLambdaDefinableFunc
= HPoint (Rep (RepTwo
(Min1Max0 2 [MkFrel [Zero, One], MkFrel [One, Zero]]
[MkFrel [Zero, Zero]])))
-- ==========================================================--
--
maKludgeFlags :: [Flag] -> [Flag]
maKludgeFlags flags
= if DryRun `elem` flags
then bdDryRunSettings ++ flags ++ bdDefaultSettings
else flags ++ bdDefaultSettings
-- ==========================================================--
--
maStrictAn :: AList Domain Int -> [Flag] -> [Char] -> [Char]
maStrictAn table flagsInit fileName
= "\nJules's Strictness Analyser, version 0.400" ++
"\nCopyright (c) Julian Seward 1992" ++
(let n = length table in
mySeq n ("\nRead " ++ show n ++ " lattice sizes.\n")) ++
"\n\n=============" ++
"\n=== Input ===" ++
"\n=============\n" ++
(ppPrintParsed prog) ++
"\n\n\n=============" ++
"\n=== Types ===" ++
"\n=============\n" ++
prettyTypes ++
"\n\n" ++
strictAnResults ++ "\n"
where
flags = maKludgeFlags flagsInit
-- call the strictness analyser if required
strictAnResults
= if Typecheck `notElem` flags
then
saMain
(eaEtaAbstract typedTree) darAug fullEnvAug pseudoParams
maBaseAnns tdsAug flags table
else ""
-- call the parser (never returns if cannot parse)
(dar, (tds, expr)) = paParse fileName
(progAfterLL, pseudoParams)
= llMain builtInNames expr doPretty
builtInNames = map first maBaseAnns
prog = (tds, progAfterLL)
doPretty = NoPretty `notElem` flags
-- call the typechecker, fish out the resulting components
(prettyTypes, typedTree, fullEnv)
= f (tcCheck maBaseTypes ([1],[0]) prog)
f (words, (Fail m))
= panic "maStrictAn: Typecheck failed -- cannot proceed."
f (words, Ok (rootTree, fullEnv))
= (words, rootTree, fullEnv)
-- augment type definitions to cover built-in type bool
tdsAug = [("bool", [], [("True", []), ("False", [])])] ++ tds
darAug = [(False, ["bool"])] ++ dar
-- augment type environment to include built-in types
fullEnvAug = fullEnv ++ map2nd deScheme maBaseTypes
deScheme (Scheme _ texpr) = texpr
-- ==========================================================--
--
--main :: [Response] -> [Request]
main :: IO ()
main = do
raw_args <- return ["-fPolyLim10000","-fForceAll"] -- getArgs
let cmd_line_args = maGetFlags raw_args
--anna_dir <- getEnv "ANNADIR"
tableStr <- readFile ({- anna_dir ++"/"++ -} "anna_table")
file_contents <- getContents
let table = rtReadTable tableStr
putStr (maStrictAn table cmd_line_args file_contents)
-- ==========================================================--
--
maGetFlags :: [String] -> [Flag]
maGetFlags [] = []
maGetFlags ("-fTypecheck" :fs) = Typecheck : maGetFlags fs
maGetFlags ("-fSimp" :fs) = Simp : maGetFlags fs
maGetFlags ("-fNoCaseOpt" :fs) = NoCaseOpt : maGetFlags fs
maGetFlags ("-fShowHExpr" :fs) = ShowHExpr : maGetFlags fs
maGetFlags ("-fNoPretty" :fs) = NoPretty : maGetFlags fs
maGetFlags ("-fNoFormat" :fs) = NoFormat : maGetFlags fs
maGetFlags ("-fNoBaraki" :fs) = NoBaraki : maGetFlags fs
maGetFlags ("-fSimpleInv" :fs) = SimpleInv : maGetFlags fs
maGetFlags ("-fForceAll" :fs) = ForceAll : maGetFlags fs
maGetFlags ("-fDryRun" :fs) = DryRun : maGetFlags fs
maGetFlags
(('-':'f':'P':'o':'l':'y':'L':'i':'m':f):fs)
= (PolyLim (paNumval (filter isDigit f))): maGetFlags fs
maGetFlags
(('-':'f':'L':'o':'w':'e':'r':'L':'i':'m':f):fs)
= (LowerLim (paNumval (filter isDigit f))): maGetFlags fs
maGetFlags
(('-':'f':'U':'p':'p':'e':'r':'L':'i':'m':f):fs)
= (UpperLim (paNumval (filter isDigit f))): maGetFlags fs
maGetFlags
(('-':'f':'S':'c':'a':'l':'e':'U':'p':f):fs)
= (ScaleUp (paNumval (filter isDigit f))): maGetFlags fs
maGetFlags (other:_) = myFail ("Unknown flag: " ++ other ++ maUsage )
-- ==========================================================--
--
maUsage :: String
maUsage
= concat
[
"\n\nUsage: Anna400 [lmlflags -] [flags] < corefile",
"\n",
"\nAllowable flags are:",
"\n -fTypecheck don't do strictness analysis",
"\n -fSimp simplify abstract expressions",
"\n -fNoCaseOpt don't do case-of-case optimisation",
"\n -fShowHExpr show abstract expressions",
"\n -fNoPretty don't clean up after lambda lifting",
"\n -fNoFormat don't prettily format first-order output",
"\n -fNoBaraki don't use Baraki generalisation",
"\n -fSimpleInv use mindless inverses",
"\n -fForceAll force all thunks before analysis",
"\n -fDryRun trial run so as to check lattice table is ok",
"\n -fPolyLimN set generalisation limit to `N' (default 10000)",
"\n -fLowerLimN set lower lattice threshold to `N' (default 0)",
"\n -fUpperLimN set upper lattice threshold to `N' (default 1000000)",
"\n -fScaleUpN set scaleup ratio to N/10 (default 20)",
"\nDefault settings are opposite to those listed.\n"
]
-- ==========================================================--
-- === end Main.hs ===--
-- ==========================================================--
|