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