module Calc where import Control.Monad.State import MonParser -- -- Calculator -- expr :: Parser Int addop :: Parser (Int -> Int -> Int) expop :: Parser (Int -> Int -> Int) factor :: Parser Int term :: Parser Int addop = (do char '+'; return (+)) `mplus` (do char '-'; return (-)) expop = do char '^'; return (^) factor = nat `mplus` bracket (char '(') expr (char ')') term = factor `chainr1` expop expr = term `chainl1` addop