calculator-0.1.5.2: src/Calculator/Parser/Cmd.hs
module Calculator.Parser.Cmd (parseCmd) where
--------------------------------------------------------------------------------
import Calculator.Parser.Base (parseId)
import Calculator.Parser.Expr (parseExpr)
import Calculator.Prim.Cmd (Cmd (..))
--------------------------------------------------------------------------------
import Text.ParserCombinators.Parsec
--------------------------------------------------------------------------------
-- cmd -> ':' cmd'
parseCmd :: Parser Cmd
parseCmd = char ':' >> parseCmd'
--------------------------------------------------------------------------------
-- cmd' -> reset | assign
parseCmd' :: Parser Cmd
parseCmd' = parseHelp <|> parseReset <|> parseAssign <|> parseFunc
--------------------------------------------------------------------------------
-- help -> "?" | "help"
parseHelp :: Parser Cmd
parseHelp = (string "?" <|> string "help") >> return Help
--------------------------------------------------------------------------------
-- reset -> "reset"
parseReset :: Parser Cmd
parseReset = string "reset" >> return Reset
--------------------------------------------------------------------------------
-- assign -> "var" id "=" expr
parseAssign :: Parser Cmd
parseAssign = do
_ <- string "var "
str <- parseId
_ <- char '='
ex <- parseExpr
return $ Assign str ex
--------------------------------------------------------------------------------
-- func -> "func" id arg "=" expr
parseFunc :: Parser Cmd
parseFunc = do
_ <- string "func "
str <- parseId
_ <- char '('
arg <- parseId
_ <- char ')'
_ <- char '='
ex <- parseExpr
return $ Func str arg ex
--------------------------------------------------------------------------------