module Main where
import Tip.HaskellFrontend
import Text.Show.Pretty hiding (Name)
import System.Environment
import qualified Data.Foldable as F
import Data.Ord
import Control.Monad
import Tip.Core
import Tip.Fresh
import Tip.Simplify
import Tip.Lint
import Tip.Passes
import Tip.Utils.Rename
import Tip.Pretty
import Tip.Pretty.SMT as SMT
import Text.PrettyPrint hiding ((<>))
import Options.Applicative
main :: IO ()
main = do
(file,params) <-
execParser $
info (helper <*>
((,) <$> strArgument (metavar "FILENAME" <> help "Haskell file to process")
<*> parseParams))
(fullDesc <>
progDesc "Translate Haskell to TIP" <>
header "tip-ghc - translate Haskell to TIP")
mthy <- readHaskellFile file params
case mthy of
Left s -> error s
Right thy -> do
when (PrintInitialTheory `elem` debug_flags params) $ putStrLn (ppRender thy)
let renamed_thy = renameWith disambigId thy
let pipeline =
freshPass $
runPasses
[ SimplifyAggressively
, RemoveNewtype
, UncurryTheory
, CommuteMatch
, SimplifyGently
, IfToBoolOp
, RemoveAliases, CollapseEqual
, CommuteMatch
, SimplifyGently
, CSEMatch
, EliminateDeadCode
]
case pipeline renamed_thy of
[thy'] -> print (SMT.ppTheory thy')
_ -> error "tip-ghc: not one theory!"
data Var = Var String | Refresh Var Int
deriving (Show,Eq,Ord)
varMax :: Var -> Int
varMax Var{} = 0
varMax (Refresh v i) = varMax v `max` i
instance PrettyVar Var where
varStr (Var "") = "x"
varStr (Var xs) = xs
varStr (Refresh v i) = varStr v
disambigId :: Id -> [Var]
disambigId i = vs : [ Refresh vs x | x <- [0..] ]
where
vs = Var $ case varStr i of { [] -> "x"; xs -> xs }
instance Name Var where
fresh = refresh (Var "")
refresh (Refresh v _) = refresh v
refresh v@Var{} = Refresh v `fmap` fresh
freshNamed s = refresh (Var s)
getUnique (Refresh _ i) = i
getUnique Var{} = 0