lang: ast: implement parsing of break/continue loop-control statements

This commit is contained in:
2025-09-08 15:55:12 +01:00
parent 84e52b1649
commit bf250179da
6 changed files with 85 additions and 1 deletions

View File

@@ -110,6 +110,23 @@ enum ivy_status arith_push_operand(
b_queue_push_back(&state->s_output_queue, &v->n_entry);
break;
}
case IVY_TOK_KEYWORD: {
struct ivy_ast_node *v = NULL;
switch (tok->t_keyword) {
case IVY_KW_BREAK:
v = ast_node_create(IVY_AST_LOOP_BREAK);
break;
case IVY_KW_CONTINUE:
v = ast_node_create(IVY_AST_LOOP_REPEAT);
break;
default:
return IVY_ERR_BAD_SYNTAX;
}
ivy_ast_node_set_bounds_from_token((struct ivy_ast_node *)v, tok);
b_queue_push_back(&state->s_output_queue, &v->n_entry);
break;
}
default:
return IVY_ERR_BAD_SYNTAX;
}

View File

@@ -78,8 +78,10 @@ struct ast_node_type expr_node_ops = {
.n_keyword_parsers = {
/* statement keywords */
KW_PARSER(FOR, stmt_parse_for),
KW_PARSER(TRY, stmt_parse_try),
KW_PARSER(WHILE, stmt_parse_while),
KW_PARSER(BREAK, stmt_parse_break),
KW_PARSER(CONTINUE, stmt_parse_continue),
KW_PARSER(TRY, stmt_parse_try),
KW_PARSER(MATCH, stmt_parse_match),
KW_PARSER(IF, stmt_parse_if),
KW_PARSER(THEN, stmt_parse_end),

View File

@@ -174,5 +174,9 @@ struct token_parse_result stmt_parse_else(
struct ivy_parser *ctx, struct ivy_token *tok);
struct token_parse_result stmt_parse_end(
struct ivy_parser *ctx, struct ivy_token *tok);
extern struct token_parse_result stmt_parse_break(
struct ivy_parser *ctx, struct ivy_token *tok);
extern struct token_parse_result stmt_parse_continue(
struct ivy_parser *ctx, struct ivy_token *tok);
#endif

View File

@@ -232,3 +232,35 @@ struct token_parse_result stmt_parse_end(
result.r_flags |= PARSE_REPEAT_TOKEN;
return result;
}
struct token_parse_result stmt_parse_break(
struct ivy_parser *ctx, struct ivy_token *tok)
{
struct expr_parser_state *state
= parser_get_state(ctx, struct expr_parser_state);
if (state->s_prev_component != EXPR_CMP_NONE) {
return PARSE_RESULT(IVY_ERR_BAD_SYNTAX, 0);
}
arith_push_operand(state, tok);
state->s_prev_component = EXPR_CMP_KEYWORD;
return PARSE_RESULT(IVY_OK, 0);
}
struct token_parse_result stmt_parse_continue(
struct ivy_parser *ctx, struct ivy_token *tok)
{
struct expr_parser_state *state
= parser_get_state(ctx, struct expr_parser_state);
if (state->s_prev_component != EXPR_CMP_NONE) {
return PARSE_RESULT(IVY_ERR_BAD_SYNTAX, 0);
}
arith_push_operand(state, tok);
state->s_prev_component = EXPR_CMP_KEYWORD;
return PARSE_RESULT(IVY_OK, 0);
}