Compare commits
2 Commits
e437fd82c4
...
e462724482
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e462724482 | ||
|
|
b603d9edf9 |
@ -55,15 +55,15 @@ eval (UnaryExpr unaryOp a) = lookUpUnaryOp unaryOp (eval a)
|
||||
parseExpr :: Parser Expr
|
||||
parseExpr =
|
||||
makeExprParser
|
||||
parseLiteral
|
||||
parseTerm
|
||||
[ [InfixL (char '/' $> BinaryExpr Divide)]
|
||||
, [InfixL (char '*' $> BinaryExpr Multiply)]
|
||||
, [InfixL (char '+' $> BinaryExpr Add)]
|
||||
, [InfixL (char '-' $> BinaryExpr Subtract)]
|
||||
]
|
||||
|
||||
parseLiteral :: Parser Expr
|
||||
parseLiteral =
|
||||
parseTerm :: Parser Expr
|
||||
parseTerm =
|
||||
choice
|
||||
[ Literal <$> decimal
|
||||
, between (char '(') (char ')') parseExpr
|
||||
|
||||
@ -18,6 +18,11 @@ checkParse :: String -> Expr -> Expectation
|
||||
checkParse text expectedExpr =
|
||||
parse parseExpr "" text `shouldBe` Right expectedExpr
|
||||
|
||||
checkEval :: String -> Int -> Expectation
|
||||
checkEval text expectedVal =
|
||||
fmap eval (parse parseExpr "" text) `shouldBe` Right expectedVal
|
||||
|
||||
|
||||
spec :: Spec
|
||||
spec = do
|
||||
describe "evaluate expressions" $ do
|
||||
@ -39,5 +44,11 @@ spec = do
|
||||
checkParse "2+3*5" (BinaryExpr Add (Literal 2) (BinaryExpr Multiply (Literal 3) (Literal 5)))
|
||||
checkParse "(2+3)*5" (BinaryExpr Multiply (BinaryExpr Add (Literal 2) (Literal 3)) (Literal 5) )
|
||||
checkParse "((2+3))*5" (BinaryExpr Multiply (BinaryExpr Add (Literal 2) (Literal 3)) (Literal 5) )
|
||||
it "can evaluate expressions correctly" $ do
|
||||
checkEval "2" 2
|
||||
checkEval "3*4/2" 6
|
||||
checkEval "2+3*6" 20
|
||||
checkEval "1-2+3" (-4)
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user