diff options
Diffstat (limited to 'lib/Language/Elna/Driver/CommandLine.hs')
| -rw-r--r-- | lib/Language/Elna/Driver/CommandLine.hs | 69 |
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." |
