import Text.Parsec
import Text.Parsec.String
import Control.Monad
import Data.Either
main = forever $ getLine >>= return . check . parse aterm "stdin" >>= putStrLn
check :: (Show a) => Either ParseError a -> String
check = either show show
aterm = liftM2 (foldl op) mterm (many $ oop "+-" mterm)
where
op a ('+', t) = a + t
op a ('-', t) = a - t
mterm = liftM2 (foldl op) term (many $ oop "*/" term)
where
op a ('*', t) = a * t
op a ('/', t) = a `div` t
term = try number <|>
(char '-' >> term >>= return . negate) <|>
between (char '(') (char ')') aterm
oop s t = liftM2 (,) (oneOf s) t
number :: Parser Integer
number = do
s1 <- option '+' (char '+' <|> char '-')
let s = if s1 == '-' then "-" else ""
m <- many1 digit
return $ read (s++m)
хахахахахаха)))) слабак)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8