From 65c8beecb14f6d09c49504d74beedd58cc7ddd17 Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Wed, 7 Sep 2022 16:26:50 +0100 Subject: Better project layout, removed warnings --- app/Main.hs | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 app/Main.hs (limited to 'app') diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..5a16129 --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,92 @@ +module Main where + +import Control.Monad (when) +import Control.Monad.State (evalState) +import qualified Data.Map as Map +import Data.Maybe (fromMaybe) +import Micro.Compiler +import Micro.Error (showErrorList, showParserError) +import Micro.Lexer (scan) +import Micro.Parser (parse, parseFromFile) +import System.Console.GetOpt +import System.Environment (getProgName) +import System.Environment.Blank (getArgs) +import System.Exit (exitFailure, exitSuccess) +import System.IO (hPutStr, hPutStrLn, stderr, stdout) + +version = "0.1.0" + +data Options = Options + { optParse :: Bool, + optHelp :: Bool, + optVersion :: Bool + } + +defOptions = + Options + { optParse = False, + optHelp = False, + optVersion = False + } + +options :: [OptDescr (Options -> Options)] +options = + [ Option + ['p'] + ["parse"] + (NoArg (\opts -> opts {optParse = True})) + "only parse, reporting any errors", + Option + ['h'] + ["help"] + (NoArg (\opts -> opts {optHelp = True})) + "show help", + Option + ['v'] + ["version"] + (NoArg (\opts -> opts {optVersion = True})) + "output version and exit" + ] + +usage :: String -> [String] -> IO () +usage progName errs + | null errs = do + putStrLn helpText + exitSuccess + | otherwise = do + hPutStrLn stderr ("error: " ++ concat errs ++ "Try " ++ progName ++ " -h for more information.") + exitFailure + where + header = + "Usage: " + ++ progName + ++ " [OPTION...] file" + helpText = + usageInfo header options + +compileFile :: String -> Bool -> IO () +compileFile filename onlyParse = do + res <- parseFromFile (scan parse) filename + case res of + Left err -> hPutStrLn stderr (showParserError err) >> exitFailure + Right ast -> do + res <- return $ evalState (compileAll ast) startState + case res of + Right _ -> if onlyParse then exitSuccess else print ast + Left errs -> hPutStr stderr (showErrorList errs) >> exitFailure + +main :: IO () +main = do + progName <- getProgName + argv <- getArgs + case getOpt Permute options argv of + (o, n, []) -> + do + when (optHelp opts) $ usage progName [] + when (optVersion opts) $ putStrLn (progName ++ " " ++ version) >> exitSuccess + case n of + [filename] -> compileFile filename $ optParse opts + _ -> usage progName [] + where + opts = foldl (flip id) defOptions o + (_, _, errs) -> usage progName errs -- cgit v1.2.3