{-# LANGUAGE LambdaCase #-} module Main where -- import Codegen.Codegen (compile) import Grammar.ErrM (Err) import Grammar.Par (myLexer, pProgram) import Grammar.Print (printTree) -- import LambdaLifter.LambdaLifter (lambdaLift) import Renamer.Renamer (rename) import System.Environment (getArgs) import System.Exit (exitFailure, exitSuccess) import TypeChecker.TypeChecker (typecheck) main :: IO () main = getArgs >>= \case [] -> print "Required file path missing" (s : _) -> main' s main' :: String -> IO () main' s = do file <- readFile s putStrLn "-- Parse Tree -- " parsed <- fromSyntaxErr . pProgram $ myLexer file putStrLn $ printTree parsed putStrLn "\n-- Renamer --" let renamed = rename parsed putStrLn $ printTree renamed putStrLn "\n-- TypeChecker --" typechecked <- fromTypeCheckerErr $ typecheck renamed putStrLn $ show typechecked -- putStrLn "\n-- Lambda Lifter --" -- let lifted = lambdaLift typechecked -- putStrLn $ printTree lifted -- putStrLn "\n -- Printing compiler output to stdout --" -- compiled <- fromCompilerErr $ compile lifted -- putStrLn compiled exitSuccess fromCompilerErr :: Err a -> IO a fromCompilerErr = either ( \err -> do putStrLn "\nCOMPILER ERROR" putStrLn err exitFailure ) pure fromSyntaxErr :: Err a -> IO a fromSyntaxErr = either ( \err -> do putStrLn "\nSYNTAX ERROR" putStrLn err exitFailure ) pure fromTypeCheckerErr :: Err a -> IO a fromTypeCheckerErr = either ( \err -> do putStrLn "\nTYPECHECKER ERROR" putStrLn err exitFailure ) pure