aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2022-08-18 07:44:18 +0100
committerJuan J. Martinez <jjm@usebox.net>2022-08-18 07:44:18 +0100
commit0f37c89fd65eeb1c0d41e9661de41857db38ffee (patch)
tree503d875a0dba28a10b34e98ed41a6a4606373582
parentbdb014f3a088da82845642b9688c662bc7afa29f (diff)
downloadmicro-lang-hs-0f37c89fd65eeb1c0d41e9661de41857db38ffee.tar.gz
micro-lang-hs-0f37c89fd65eeb1c0d41e9661de41857db38ffee.zip
Added CLI
-rw-r--r--src/Main.hs74
1 files changed, 69 insertions, 5 deletions
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