{- 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."