70 lines
1.9 KiB
Haskell
70 lines
1.9 KiB
Haskell
|
{- 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."
|