diff --git a/haskell-experiments/src/SimpleParser.hs b/haskell-experiments/src/SimpleParser.hs index 7e5f920..be76cfd 100644 --- a/haskell-experiments/src/SimpleParser.hs +++ b/haskell-experiments/src/SimpleParser.hs @@ -62,9 +62,9 @@ parseLiteral = Literal <$> decimal parseBinaryExpr :: Parser Expr parseBinaryExpr = do - lhs <- parseLiteral <|> parseExpr + lhs <- parseExpr binOp <- parseOp - rhs <- parseLiteral <|> parseExpr + rhs <- parseExpr pure (BinaryExpr binOp lhs rhs) parseOp :: Parser BinaryOp diff --git a/haskell-experiments/test/Test/SimpleParserSpec.hs b/haskell-experiments/test/Test/SimpleParserSpec.hs index c3e4fe1..a6622ca 100644 --- a/haskell-experiments/test/Test/SimpleParserSpec.hs +++ b/haskell-experiments/test/Test/SimpleParserSpec.hs @@ -14,6 +14,10 @@ import Test.Hspec import Text.Megaparsec import SimpleParser +checkParse :: String -> Expr -> Expectation +checkParse text expectedExpr = + parse parseExpr "" text `shouldBe` Right expectedExpr + spec :: Spec spec = do describe "evaluate expressions" $ do @@ -29,7 +33,8 @@ spec = do (BinaryExpr Divide (Literal 7) (Literal 3)) ) `shouldBe` 1 it "can parse basic expressions" $ do - parse parseExpr "" "2" `shouldBe` Right (Literal 2) - parse parseExpr "" "2+3" `shouldBe` Right (BinaryExpr Add (Literal 2) (Literal 3)) + checkParse "2" (Literal 2) + checkParse "2+3" (BinaryExpr Add (Literal 2) (Literal 3)) + checkParse "2+3+5" (BinaryExpr Add (BinaryExpr Add (Literal 2) (Literal 3)) (Literal 5))