diff --git a/a3/a3-handout/src/APL/Parser.hs b/a3/a3-handout/src/APL/Parser.hs index cef0e31..413602a 100644 --- a/a3/a3-handout/src/APL/Parser.hs +++ b/a3/a3-handout/src/APL/Parser.hs @@ -96,12 +96,26 @@ pLExp = pFExp ] -pExp1 :: Parser Exp -pExp1 = pLExp >>= chain +pPExp :: Parser Exp +pPExp = pLExp >>= chain where chain x = choice - [ do + [ + do + lString "**" + y <- pPExp + chain $ Pow x y, + pure x + ] + +pExp1 :: Parser Exp +pExp1 = pPExp >>= chain + where + chain x = + choice + [ + do lString "*" y <- pLExp chain $ Mul x y, @@ -125,6 +139,10 @@ pExp0 = pExp1 >>= chain lString "-" y <- pExp1 chain $ Sub x y, + do + lString "==" + y <- pExp1 + chain $ Eql x y, pure x ] diff --git a/a3/a3-handout/src/APL/Parser_Tests.hs b/a3/a3-handout/src/APL/Parser_Tests.hs index 1cc9ddd..5ee19eb 100644 --- a/a3/a3-handout/src/APL/Parser_Tests.hs +++ b/a3/a3-handout/src/APL/Parser_Tests.hs @@ -70,5 +70,17 @@ tests = [ parserTest "x y" $ Apply (Var "x") (Var "y"), parserTest "x y z" $ Apply (Apply (Var "x") (Var "y")) (Var "z"), parserTest "x (y z)" $ Apply (Var "x") (Apply (Var "y") (Var "z")) + ], + testGroup + "Eql" + [ parserTest "x == y" $ Eql (Var "x") (Var "y"), + parserTest "x == y == z" $ Eql (Eql (Var "x") (Var "y")) (Var "z"), + parserTest "x + y == z * x" $ Eql (Add (Var "x") (Var "y")) (Mul (Var "z") (Var "x")) + ], + testGroup + "Eql" + [ parserTest "x ** y" $ Pow (Var "x") (Var "y"), + parserTest "x ** y ** z" $ Pow (Var "x") (Pow (Var "y") (Var "z")), + parserTest "x + y ** z * x" $ Add (Var "x") (Mul (Pow (Var "y") (Var "z")) (Var "x")) ] ]