packages feed

calculator-0.1.3.0: src/Calculator/Parser/Cmd.hs

module Calculator.Parser.Cmd (parseCmd) where

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

import           Calculator.Prim.Base          (parseId)
import           Calculator.Prim.Cmd           (Cmd (..))
import           Calculator.Parser.Expr        (parseExpr)

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

import           Text.ParserCombinators.Parsec

--------------------------------------------------------------------------------
-- cmd -> ':' cmd'

parseCmd :: Parser Cmd
parseCmd = char ':' >> parseCmd'

--------------------------------------------------------------------------------
-- cmd' -> reset | assign

parseCmd' :: Parser Cmd
parseCmd' = parseReset <|> parseAssign

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

parseReset :: Parser Cmd
parseReset = string "reset" >> return Reset

--------------------------------------------------------------------------------
-- assign -> "let" var "=" expr

parseAssign :: Parser Cmd
parseAssign = do
  _   <- string "var "
  str <- parseId
  _   <- char '='
  ex  <- parseExpr
  return $ Assign str ex

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