summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2019-11-28 22:32:45 +0100
committertomsmeding <tom.smeding@gmail.com>2019-11-28 22:32:45 +0100
commitef5af7d9ab8f508967a4f22cc8559c15ee131ced (patch)
tree070504f89418fea5cccb5481be5aa385af17b45f
parent88019fb54bca4ca6cd12e4683d721aa6068b876c (diff)
Command-line options for AST and IR
-rw-r--r--Main.hs31
1 files changed, 24 insertions, 7 deletions
diff --git a/Main.hs b/Main.hs
index 70991c0..14f3202 100644
--- a/Main.hs
+++ b/Main.hs
@@ -1,6 +1,6 @@
-{-# LANGUAGE LambdaCase, TupleSections #-}
module Main where
+import Control.Monad
import System.Environment
import System.Exit
@@ -14,18 +14,35 @@ import VM
usage :: IO ()
usage = do
progname <- getProgName
- putStrLn $ "Usage: " ++ progname ++ " [filename.lisp]"
+ putStrLn $ "Usage: " ++ progname ++ " [-h] [-ast] [-ir] [filename.lisp]"
+ putStrLn $ "When no filename is given, will read from stdin."
+ putStrLn $ " -h Show this help"
+ putStrLn $ " -ast Print AST after compiler macro's"
+ putStrLn $ " -ir Print IR after optimisation"
+
+data Options = Options { optAST :: Bool, optIR :: Bool }
+
+parseOptions' :: (Options, Maybe FilePath) -> [String] -> IO (Options, Maybe FilePath)
+parseOptions' pair [] = return pair
+parseOptions' _ ("-h":_) = usage >> exitSuccess
+parseOptions' (opt, fp) ("-ast":as) = parseOptions' (opt { optAST = True }, fp) as
+parseOptions' (opt, fp) ("-ir":as) = parseOptions' (opt { optIR = True }, fp) as
+parseOptions' _ (('-':a):_) = putStrLn ("Unknown option '" ++ a ++ "'") >> usage >> exitFailure
+parseOptions' (opt, Nothing) (f:as) = parseOptions' (opt, Just f) as
+parseOptions' (_, Just _) (_:_) = putStrLn "At most one filename argument expected" >> usage >> exitFailure
+
+parseOptions :: [String] -> IO (Options, Maybe FilePath)
+parseOptions = parseOptions' (Options False False, Nothing)
main :: IO ()
main = do
- (mfname, source) <- getArgs >>= \case
- [] -> (Nothing,) <$> getContents
- [arg] -> (Just arg,) <$> readFile arg
- _ -> usage >> exitFailure
+ (opts, mfname) <- getArgs >>= parseOptions
+ source <- maybe getContents readFile mfname
prog <- parseProgram mfname source >>= either (die . show) return
let prog' = compilerMacros prog
+ when (optAST opts) $ print prog'
irprog <- either die return (compileProgram prog')
let opt = optimise irprog
- -- print opt
+ when (optIR opts) $ print opt
vmRun opt