module Calculator.Parser.Cmd (parseCmd) where -------------------------------------------------------------------------------- import Calculator.Parser.Expr (parseExpr) import Calculator.Prim.Base (parseId) 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 --------------------------------------------------------------------------------