summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Driver/CommandLine.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Language/Elna/Driver/CommandLine.hs')
-rw-r--r--lib/Language/Elna/Driver/CommandLine.hs69
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/Language/Elna/Driver/CommandLine.hs b/lib/Language/Elna/Driver/CommandLine.hs
new file mode 100644
index 0000000..1bd5f14
--- /dev/null
+++ b/lib/Language/Elna/Driver/CommandLine.hs
@@ -0,0 +1,69 @@
+{- This Source Code Form is subject to the terms of the Mozilla Public License,
+ v. 2.0. If a copy of the MPL was not distributed with this file, You can
+ obtain one at https://mozilla.org/MPL/2.0/. -}
+
+module Language.Elna.Driver.CommandLine
+ ( CommandLine(..)
+ , IntermediateStage(..)
+ , commandLine
+ ) where
+
+import Options.Applicative
+ ( Parser
+ , ParserInfo(..)
+ , argument
+ , flag'
+ , fullDesc
+ , help
+ , helper
+ , info
+ , long
+ , metavar
+ , optional
+ , progDesc
+ , short
+ , str
+ , strOption
+ )
+import Control.Applicative (Alternative(..), (<**>))
+
+data IntermediateStage
+ = ParseStage
+ | ValidateStage
+ | CodeGenStage
+ deriving (Eq, Show)
+
+data CommandLine = CommandLine
+ { input :: FilePath
+ , output :: Maybe FilePath
+ , intermediateStage :: Maybe IntermediateStage
+ } deriving (Eq, Show)
+
+intermediateStageP :: Parser IntermediateStage
+intermediateStageP
+ = flag' ParseStage parseStageP
+ <|> flag' ValidateStage validateStageP
+ <|> flag' CodeGenStage codeGenStageP
+ where
+ parseStageP = long "parse"
+ <> help "Run the lexer and parser, but stop before assembly generation"
+ validateStageP = long "validate"
+ <> help "Run through the semantic analysis stage, stopping before TAC generation"
+ codeGenStageP = long "codegen"
+ <> help "Perform lexing, parsing, and assembly generation, but stop before code emission"
+
+commandLineP :: Parser CommandLine
+commandLineP = CommandLine
+ <$> argument str inFile
+ <*> optional (strOption outFile)
+ <*> optional intermediateStageP
+ where
+ inFile = metavar "INFILE" <> help "Input file."
+ outFile = long "output"
+ <> short 'o'
+ <> metavar "OUTFILE"
+ <> help "Output file."
+
+commandLine :: ParserInfo CommandLine
+commandLine = info (commandLineP <**> helper)
+ $ fullDesc <> progDesc "Elna compiler."