module CmdArgs(getCmd, Cmd(..)) where
    
data Cmd = 
        CmdGrmFiles [String] -- a.grm b.grm c.grm ...
    |   CmdGrmWithOption (Maybe String) String String String 
            -- a.grm prod_rules.txt action_table.txt goto_table.txt
    |   CmdError String -- error message

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 []