packages feed

calculator-0.2.0.0: 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' -> show | help | reset | assign

parseCmd' :: Parser Cmd
parseCmd' = parseShow
         <|> parseHelp
         <|> parseReset
         <|> parseAssign
         <|> parseFunc

--------------------------------------------------------------------------------
-- help -> "?" | "help"

parseHelp :: Parser Cmd
parseHelp = (string "?" <|> string "help") >> return Help

--------------------------------------------------------------------------------
-- reset -> "reset"

parseShow :: Parser Cmd
parseShow = string "show" >> return Display

--------------------------------------------------------------------------------
-- 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 '('
  args <- sepBy parseId (char ',')
  _    <- char ')'
  _    <- char '='
  ex   <- parseExpr
  return $ Func str args ex

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