😎 Task 4 and 5

This commit is contained in:
2024-09-28 14:09:12 +02:00
parent a32fcdf9da
commit a9a530444e
2 changed files with 42 additions and 4 deletions

View File

@ -51,7 +51,7 @@ lVName = lexeme $ try $ do
lStringLit :: Parser String lStringLit :: Parser String
lStringLit = lStringLit =
lexeme $ read <$> some (satisfy isAlpha) <* notFollowedBy (satisfy isAlphaNum) lexeme $ some (satisfy (/= '"'))
lInteger :: Parser Integer lInteger :: Parser Integer
lInteger = lInteger =
@ -101,6 +101,16 @@ pLExp =
<$> (lKeyword "if" *> pExp) <$> (lKeyword "if" *> pExp)
<*> (lKeyword "then" *> pExp) <*> (lKeyword "then" *> pExp)
<*> (lKeyword "else" *> pExp), <*> (lKeyword "else" *> pExp),
Lambda
<$> (lString "\\" *> lVName)
<*> (lString "->" *> pExp),
TryCatch
<$> (lKeyword "try" *> pExp)
<*> (lKeyword "catch" *> pExp),
Let
<$> (lKeyword "let" *> lVName)
<*> (lString "=" *> pExp)
<*> (lKeyword "in" *> pExp),
pFExp pFExp
] ]
@ -110,7 +120,10 @@ pExp3 =
[ [
Print Print
<$> (lKeyword "print" *> pStringLit) <$> (lKeyword "print" *> pStringLit)
<*> pExp, <*> pAtom,
KvGet <$> (lKeyword "get" *> pAtom),
KvPut <$> (lKeyword "put" *> pAtom)
<*> pAtom,
pLExp pLExp
] ]

View File

@ -69,6 +69,7 @@ tests =
"FExp" "FExp"
[ parserTest "x y" $ Apply (Var "x") (Var "y"), [ 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 (Apply (Var "x") (Var "y")) (Var "z"),
parserTest "x y z+5" $ Add (Apply (Apply (Var "x") (Var "y")) (Var "z")) (CstInt 5),
parserTest "x (y z)" $ Apply (Var "x") (Apply (Var "y") (Var "z")) parserTest "x (y z)" $ Apply (Var "x") (Apply (Var "y") (Var "z"))
], ],
testGroup testGroup
@ -78,13 +79,37 @@ tests =
parserTest "x + y == z * x" $ Eql (Add (Var "x") (Var "y")) (Mul (Var "z") (Var "x")) parserTest "x + y == z * x" $ Eql (Add (Var "x") (Var "y")) (Mul (Var "z") (Var "x"))
], ],
testGroup testGroup
"Eql" "Pow"
[ parserTest "x ** y" $ Pow (Var "x") (Var "y"), [ parserTest "x ** y" $ Pow (Var "x") (Var "y"),
parserTest "x ** y ** z" $ Pow (Var "x") (Pow (Var "y") (Var "z")), 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")) parserTest "x + y ** z * x" $ Add (Var "x") (Mul (Pow (Var "y") (Var "z")) (Var "x"))
], ],
testGroup testGroup
"Print" "Print"
[ parserTest "print \"test\" y" $ Print "test" (Var "y") [ parserTest "print \"test\" x" $ Print "test" (Var "x"),
parserTest "print \"7\" x" $ Print "7" (Var "x"),
parserTest "print \"cool_print\" x" $ Print "cool_print" (Var "x")
],
testGroup
"Get"
[ parserTest "get x" $ KvGet (Var "x"),
parserTest "get 1" $ KvGet (CstInt 1)
],
testGroup
"Put"
[ parserTest "put x y" $ KvPut (Var "x") (Var "y")
],
testGroup
"Lambda"
[ parserTest "\\x->y" $ Lambda "x" (Var "y"),
parserTest "\\x->y+z+5" $ Lambda "x" (Add (Add (Var "y") (Var "z")) (CstInt 5))
],
testGroup
"TryCatch"
[ parserTest "try x catch y" $ TryCatch (Var "x") (Var "y")
],
testGroup
"Let"
[ parserTest "let x=5 in y" $ Let "x" (CstInt 5) (Var "y")
] ]
] ]