module Main where
import Control.Applicative ((<$))
import Text.ParserCombinators.Parsec
number xs = do
x <- many1 digit
return (read x:xs)
operate f (x:y:rest) = return (f y x:rest)
operator xs = do
o <- oneOf "+-*/"
case o of
'+' -> operate (+) xs
'-' -> operate () xs
'*' -> operate (*) xs
'/' -> operate (/) xs
singleTerm xs = number xs <|> operator xs <|> (xs <$ spaces)
expression = expression' [] >>= return . head where
expression' xs = (xs <$ eof) <|> (singleTerm xs >>= expression')
forever m = m >> forever m
main = forever (getLine >>= parseTest expression)
module Main where
import Control.Applicative ((<$), (<$>))
import Text.ParserCombinators.Parsec
number xs = (:xs) . read <$> many1 digit
operate f (x:y:rest) = return (f y x:rest)
operator xs = choice [char c >> operate op xs | (c, op) <- zip "+-*/" [(+),(),(*),(/)]]
singleTerm xs = number xs <|> operator xs <|> (xs <$ spaces)
expression = head <$> expression' [] where
expression' xs = (xs <$ eof) <|> (singleTerm xs >>= expression')
forever m = m >> forever m
main = forever (getLine >>= parseTest expression)