Skip to content

Commit

Permalink
add: parse Continue and parse Break
Browse files Browse the repository at this point in the history
  • Loading branch information
oriollinan committed Jan 8, 2025
1 parent 2dac1c3 commit 54670d8
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 14 deletions.
14 changes: 14 additions & 0 deletions lib/Ast/Parser/Expr.hs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ parseExpr =
parseWhile,
parseFor,
parseReturn,
parseBreak,
parseContinue,
parseBlock,
M.try parseFunction,
M.try parseDeclaration,
Expand Down Expand Up @@ -139,6 +141,18 @@ parseReturn = do
_ <- PU.symbol "return"
AT.Return srcLoc <$> M.optional parseExpr

parseBreak :: PU.Parser AT.Expr
parseBreak = do
srcLoc <- parseSrcLoc
_ <- PU.symbol "stop"
return $ AT.Break srcLoc

parseContinue :: PU.Parser AT.Expr
parseContinue = do
srcLoc <- parseSrcLoc
_ <- PU.symbol "next"
return $ AT.Continue srcLoc

parseOp :: PU.Parser AT.Expr
parseOp = do
srcLoc <- parseSrcLoc
Expand Down
33 changes: 19 additions & 14 deletions test/Ast/Parser/ExprSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -163,28 +163,33 @@ spec = do
}
result `shouldBe` expected

it "parses a break statement" $ do
let input = "stop"
let result = normalizeExpr <$> parseWithEnv input
let expected = Right (AT.Break normalizeLoc)
result `shouldBe` expected

it "parses a continue statement" $ do
let input = "next"
let result = normalizeExpr <$> parseWithEnv input
let expected = Right (AT.Continue normalizeLoc)
result `shouldBe` expected

normalizeLoc :: AT.SrcLoc
normalizeLoc = AT.SrcLoc "" 0 0

normalizeExpr :: AT.Expr -> AT.Expr
normalizeExpr (AT.Lit _ lit) = AT.Lit normalizeLoc lit
normalizeExpr (AT.Var _ name t) = AT.Var normalizeLoc name t
normalizeExpr (AT.Function _ name t params body) =
AT.Function normalizeLoc name t params (normalizeExpr body)
normalizeExpr (AT.Declaration _ name t initVal) =
AT.Declaration normalizeLoc name t (fmap normalizeExpr initVal)
normalizeExpr (AT.Assignment _ target value) =
AT.Assignment normalizeLoc (normalizeExpr target) (normalizeExpr value)
normalizeExpr (AT.Call _ func args) =
AT.Call normalizeLoc (normalizeExpr func) (map normalizeExpr args)
normalizeExpr (AT.If _ cond thenBranch elseBranch) =
AT.If normalizeLoc (normalizeExpr cond) (normalizeExpr thenBranch) (fmap normalizeExpr elseBranch)
normalizeExpr (AT.Function _ name t params body) = AT.Function normalizeLoc name t params (normalizeExpr body)
normalizeExpr (AT.Declaration _ name t initVal) = AT.Declaration normalizeLoc name t (fmap normalizeExpr initVal)
normalizeExpr (AT.Assignment _ target value) = AT.Assignment normalizeLoc (normalizeExpr target) (normalizeExpr value)
normalizeExpr (AT.Call _ func args) = AT.Call normalizeLoc (normalizeExpr func) (map normalizeExpr args)
normalizeExpr (AT.If _ cond thenBranch elseBranch) = AT.If normalizeLoc (normalizeExpr cond) (normalizeExpr thenBranch) (fmap normalizeExpr elseBranch)
normalizeExpr (AT.Block exprs) = AT.Block (map normalizeExpr exprs)
normalizeExpr (AT.Return _ value) = AT.Return normalizeLoc (fmap normalizeExpr value)
normalizeExpr (AT.Op _ op e1 e2) =
AT.Op normalizeLoc op (normalizeExpr e1) (normalizeExpr e2)
normalizeExpr (AT.UnaryOp _ op e) =
AT.UnaryOp normalizeLoc op (normalizeExpr e)
normalizeExpr (AT.Op _ op e1 e2) = AT.Op normalizeLoc op (normalizeExpr e1) (normalizeExpr e2)
normalizeExpr (AT.UnaryOp _ op e) = AT.UnaryOp normalizeLoc op (normalizeExpr e)
normalizeExpr (AT.For _ i c s b) = AT.For normalizeLoc (normalizeExpr i) (normalizeExpr c) (normalizeExpr s) (normalizeExpr b)
normalizeExpr (AT.While _ c b) = AT.While normalizeLoc (normalizeExpr c) (normalizeExpr b)
normalizeExpr (AT.Continue _) = AT.Continue normalizeLoc
Expand Down

0 comments on commit 54670d8

Please sign in to comment.