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"