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 --------------------------------------------------------------------------------