packages feed

yapb-0.1.0: src/gentable/CmdArgs.hs

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