packages feed

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

--------------------------------------------------------------------------------