Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
import Monad import Parsers data Tree = Nil | Bin Tree Tree deriving Show parens :: Parser Tree parens = do char '(' t1 <- parens char ')' t2 <- parens return (Bin t1 t2) <|> return Nil data Expr = Con Int | Expr :+: Expr | Expr :-: Expr | Expr :*: Expr | Expr :/: Expr | Expr :^: Expr deriving Show expr0 = do {e0 <- expr0; keyc '+'; e1 <- expr0; return(e0 :+: e1)} <|> do {e0 <- expr0; keyc '-'; e1 <- expr0; return(e0 :-: e1)} <|> do {e0 <- expr0; keyc '*'; e1 <- expr0; return(e0 :*: e1)} <|> do {e0 <- expr0; keyc '/'; e1 <- expr0; return(e0 :/: e1)} <|> do {e0 <- expr0; keyc '^'; e1 <- expr0; return(e0 :^: e1)} <|> do {i <- int; return (Con i)} <|> paren expr0 expr1 = do a <- atom1 op <- oper1 e <- expr1 return (a `op` e) <|> atom1 oper1 = (keyc '+' >> return (:+:)) <|> (keyc '-' >> return (:-:)) <|> (keyc '*' >> return (:*:)) <|> (keyc '/' >> return (:/:)) <|> (keyc '^' >> return (:^:)) atom1 = do {i <- int; return (Con i)} <|> paren expr1 expr2 :: Parser Expr expr2 = chainl term2 ( (keyc '+' >> return (:+:)) <|> (keyc '-' >> return (:-:))) term2 :: Parser Expr term2 = chainl fact2 ( (keyc '*' >> return (:*:)) <|> (keyc '/' >> return (:/:))) fact2 :: Parser Expr fact2 = chainr atom2 (keyc '^' >> return (:^:)) atom2 :: Parser Expr atom2 = do {i <- int; return (Con i)} <|> paren expr2 expr3 :: Parser Int expr3 = chainl term3 ( (keyc '+' >> return (+)) <|> (keyc '-' >> return (-))) term3 :: Parser Int term3 = chainl fact3 ( (keyc '*' >> return (*)) <|> (keyc '/' >> return div)) fact3 :: Parser Int fact3 = chainr atom3 (keyc '^' >> return (^)) atom3 :: Parser Int atom3 = int <|> paren expr3 testEx1 = "1+2+3" testEx2 = "1+2*3" testEx3 = "1*2+3"