/* * Statement parser. * Copyright (c) 2023-2024, Quinn Stephens and the OSMORA team. * Provided under the BSD 3-Clause license. */ #include #include "debug.h" #include "parser/ast.h" #include "parser/stmt.h" #include "parser/proc.h" #include "parser.h" static bool parse_ret(struct parser *ctx, struct ast_node *parent, struct procedure *proc) { struct ast_node *node; (void)proc; debug("Parsing return statement...\n"); /* TODO: Parse return value */ next_token(ctx); if (ctx->tok.kind != TK_SEMICOLON) { tok_error(&ctx->tok, "Expected \";\"\n"); return false; } next_token(ctx); node = ast_new_node(NK_RETURN); ast_append_child(parent, node); return true; } void parse_stmt_block(struct parser *ctx, struct ast_node *parent, struct procedure *proc) { bool success; debug("Parsing statement block...\n"); next_token(ctx); while (ctx->tok.kind != TK_RBRACE) { switch (ctx->tok.kind) { case TK_RET: success = parse_ret(ctx, parent, proc); break; default: tok_error(&ctx->tok, "Expected statement\n"); success = false; break; } if (!success) { return; } } next_token(ctx); }