Parsec を使った計算機

Parsec を使った計算機。

import Text.ParserCombinators.Parsec
import Control.Applicative hiding ((<|>))

expr :: Parser Int
expr  = tok(term) >>= 
     (\t -> ((symbol "+") >> expr >>= (\e -> return (t + e )))
        <|> ((symbol "-") >> expr >>= (\m -> return (t-m)))
        <|> return t)

term :: Parser Int
term = power >>= (\p ->
       (symbol "*" >> term >>= \t -> return (p * t))
   <|> (symbol "/" >> expr >>= \m -> return (p `div` m))
   <|> return p)

power:: Parser Int
power = factor >>= (\f -> 
        (symbol "^" >> power >>= \p -> return (f ^ p))
    <|> return f)

factor :: Parser Int
factor = (symbol "(" >> expr >>= \e -> symbol ")" >> return e)
     <|> tok(number)

symbol    :: String -> Parser String
symbol xs =  tok (string xs)

number = plus <|> minus

plus :: Parser Int
plus = many1 digit >>= \xs -> return (read xs)

minus :: Parser Int
minus = char '-' >> many1 digit >>= \xs -> return $ negate (read xs)

tok   :: Parser a -> Parser a
tok p = spaces >> p >>= \v -> spaces >> return v
> parseTest expr " (-123 -  11 * -2)  / 2 * 3"
-- > -17
> parseTest expr " -123 -  11 * -2  / 2 * 3"
-- > -112
> parseTest expr "2^3+2*3"
-- > 14