calculator-0.2.2.1: src/Calculator/Parser/Cmd.hs
module Calculator.Parser.Cmd
( parseCmd
, parseAssignCmd
, parseAssign
, parseFuncCmd
, parseFunc
) where
--------------------------------------------------------------------------------
import Calculator.Parser.Base (parseId)
import Calculator.Parser.Expr (parseExpr)
import Calculator.Prim.Cmd (Cmd (..))
--------------------------------------------------------------------------------
import Control.Applicative ((<*))
import Text.ParserCombinators.Parsec
--------------------------------------------------------------------------------
-- cmd -> ':' cmd'
parseCmd :: Parser Cmd
parseCmd = char ':' >> parseCmd'
--------------------------------------------------------------------------------
-- cmd' -> show | help | reset | assign
parseCmd' :: Parser Cmd
parseCmd' = parseShow
<|> parseHelp
<|> parseReset
<|> parseAssignCmd
<|> parseFuncCmd
--------------------------------------------------------------------------------
-- help -> "?" | "help"
parseHelp :: Parser Cmd
parseHelp = (string "?" <|> string "help") >> spaces >> return Help
--------------------------------------------------------------------------------
-- reset -> "reset"
parseShow :: Parser Cmd
parseShow = string "show" >> spaces >> return Display
--------------------------------------------------------------------------------
-- reset -> "reset"
parseReset :: Parser Cmd
parseReset = string "reset" >> spaces >> return Reset
--------------------------------------------------------------------------------
-- assignCmd -> "var" id "=" expr
parseAssignCmd :: Parser Cmd
parseAssignCmd = string "var" >> space >> spaces >> parseAssign
parseAssign :: Parser Cmd
parseAssign = do
str <- parseId
_ <- spaces
_ <- char '='
_ <- spaces
ex <- parseExpr
return $ Assign str ex
--------------------------------------------------------------------------------
-- func -> "func" id (args) "=" expr
parseFuncCmd :: Parser Cmd
parseFuncCmd = string "func" >> space >> spaces >> parseFunc
parseFunc :: Parser Cmd
parseFunc = do
ident <- try (parseId <* (spaces >> char '(' >> spaces))
args <- (parseId <* spaces) `sepBy` (char ',' <* spaces) <* char ')'
_ <- spaces >> char '=' <* spaces
expr <- parseExpr
return $ Func ident args expr
--------------------------------------------------------------------------------