Compare commits
No commits in common. "e462724482bae4fa72a79a0006fa28c41bcda881" and "e437fd82c437da700d025f903da8acbfeeedd967" have entirely different histories.
e462724482
...
e437fd82c4
@ -55,15 +55,15 @@ eval (UnaryExpr unaryOp a) = lookUpUnaryOp unaryOp (eval a)
|
|||||||
parseExpr :: Parser Expr
|
parseExpr :: Parser Expr
|
||||||
parseExpr =
|
parseExpr =
|
||||||
makeExprParser
|
makeExprParser
|
||||||
parseTerm
|
parseLiteral
|
||||||
[ [InfixL (char '/' $> BinaryExpr Divide)]
|
[ [InfixL (char '/' $> BinaryExpr Divide)]
|
||||||
, [InfixL (char '*' $> BinaryExpr Multiply)]
|
, [InfixL (char '*' $> BinaryExpr Multiply)]
|
||||||
, [InfixL (char '+' $> BinaryExpr Add)]
|
, [InfixL (char '+' $> BinaryExpr Add)]
|
||||||
, [InfixL (char '-' $> BinaryExpr Subtract)]
|
, [InfixL (char '-' $> BinaryExpr Subtract)]
|
||||||
]
|
]
|
||||||
|
|
||||||
parseTerm :: Parser Expr
|
parseLiteral :: Parser Expr
|
||||||
parseTerm =
|
parseLiteral =
|
||||||
choice
|
choice
|
||||||
[ Literal <$> decimal
|
[ Literal <$> decimal
|
||||||
, between (char '(') (char ')') parseExpr
|
, between (char '(') (char ')') parseExpr
|
||||||
|
|||||||
@ -18,11 +18,6 @@ checkParse :: String -> Expr -> Expectation
|
|||||||
checkParse text expectedExpr =
|
checkParse text expectedExpr =
|
||||||
parse parseExpr "" text `shouldBe` Right 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 :: Spec
|
||||||
spec = do
|
spec = do
|
||||||
describe "evaluate expressions" $ do
|
describe "evaluate expressions" $ do
|
||||||
@ -44,11 +39,5 @@ spec = do
|
|||||||
checkParse "2+3*5" (BinaryExpr Add (Literal 2) (BinaryExpr Multiply (Literal 3) (Literal 5)))
|
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) )
|
||||||
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