module CmdArgs(getCmd, Cmd(..)) where
data Cmd =
CmdGrmFiles [String]
| CmdGrmWithOption (Maybe String) String String String
| CmdError String
getCmd :: [String] -> Cmd
getCmd :: [String] -> Cmd
getCmd [String]
args =
let cmd :: Cmd
cmd = [String] -> Cmd
collectInfo [String]
args
in case Cmd
cmd of
CmdGrmWithOption Maybe String
Nothing String
_ String
_ String
_ ->
String -> Cmd
CmdError (String -> Cmd) -> String -> Cmd
forall a b. (a -> b) -> a -> b
$ String
"No grammar file is given for -output"
Cmd
_ -> Cmd
cmd
collectInfo :: [String] -> Cmd
collectInfo :: [String] -> Cmd
collectInfo (String
"-output":[String]
ss) =
if [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
ss Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
3 then
String -> Cmd
CmdError (String -> Cmd) -> String -> Cmd
forall a b. (a -> b) -> a -> b
$ String
"Specify three file names after -output: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [String] -> String
forall a. Show a => a -> String
show [String]
ss
else
let String
prod_rules : String
action_table : String
goto_table : [String]
ss' = [String]
ss
cmd :: Cmd
cmd = [String] -> Cmd
collectInfo [String]
ss'
in case Cmd
cmd of
CmdGrmFiles [] ->
Maybe String -> String -> String -> String -> Cmd
CmdGrmWithOption Maybe String
forall a. Maybe a
Nothing String
prod_rules String
action_table String
goto_table
CmdGrmFiles [String
fileName] ->
Maybe String -> String -> String -> String -> Cmd
CmdGrmWithOption (String -> Maybe String
forall a. a -> Maybe a
Just String
fileName) String
prod_rules String
action_table String
goto_table
CmdGrmFiles [String]
_ ->
String -> Cmd
CmdError (String -> Cmd) -> String -> Cmd
forall a b. (a -> b) -> a -> b
$ String
"Only one grammar file can be applied with -output"
CmdGrmWithOption Maybe String
_ String
_ String
_ String
_ ->
String -> Cmd
CmdError (String -> Cmd) -> String -> Cmd
forall a b. (a -> b) -> a -> b
$ String
"Only one use of -output is allowed"
CmdError String
msg -> Cmd
cmd
collectInfo (String
s:[String]
ss) =
let cmd :: Cmd
cmd = [String] -> Cmd
collectInfo [String]
ss
in case Cmd
cmd of
CmdGrmFiles [String]
fileNames -> [String] -> Cmd
CmdGrmFiles (String
sString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
fileNames)
CmdGrmWithOption Maybe String
Nothing String
f1 String
f2 String
f3 ->
Maybe String -> String -> String -> String -> Cmd
CmdGrmWithOption (String -> Maybe String
forall a. a -> Maybe a
Just String
s) String
f1 String
f2 String
f3
CmdGrmWithOption (Just String
_) String
_ String
_ String
_ ->
String -> Cmd
CmdError (String -> Cmd) -> String -> Cmd
forall a b. (a -> b) -> a -> b
$ String
"Only one grammar file can be applied with -output"
CmdError String
msg -> Cmd
cmd
collectInfo [] = [String] -> Cmd
CmdGrmFiles []