From 0f37c89fd65eeb1c0d41e9661de41857db38ffee Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Thu, 18 Aug 2022 07:44:18 +0100 Subject: Added CLI --- src/Main.hs | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/Main.hs b/src/Main.hs index 47fd883..8959329 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,21 +1,85 @@ module Main where import Compiler +import Control.Monad (when) import Control.Monad.State (evalState) import qualified Data.Map as Map +import Data.Maybe (fromMaybe) import Error (showErrorList, showParserError) import Lexer (scan) import Parser (parse, parseFromFile) -import System.Exit (exitFailure) +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) -main :: IO () -main = do - res <- parseFromFile (scan parse) "input" +version = "0.1.0" + +data Options = Options + { optHelp :: Bool, + optVersion :: Bool + } + +defOptions = + Options + { optHelp = False, + optVersion = False + } + +options :: [OptDescr (Options -> Options)] +options = + [ Option + ['h'] + ["help"] + (NoArg (\opts -> opts {optHelp = True})) + "show help and exit", + 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 -> IO () +compileFile filename = 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 _ -> print ast - Left errs -> hPutStr stderr $ showErrorList errs + 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 + _ -> usage progName [] + where + opts = foldl (flip id) defOptions o + (_, _, errs) -> usage progName errs -- cgit v1.2.3