lang: ast: implement caret (return) parsing

This commit is contained in:
2024-12-06 10:01:56 +00:00
parent d1855afc05
commit f3cd89c72a
6 changed files with 72 additions and 1 deletions

View File

@@ -813,10 +813,22 @@ struct token_parse_result arith_parse_semicolon(
}
enum ivy_status status = begin_cascade_operation(ctx);
return PARSE_RESULT(status, 0);
}
static struct ivy_ast_node *create_return_node(struct ivy_ast_node *val)
{
struct ivy_ast_return_node *ret
= (struct ivy_ast_return_node *)ast_node_create(IVY_AST_RETURN);
if (!ret) {
return NULL;
}
ret->n_val = val;
return (struct ivy_ast_node *)ret;
}
struct token_parse_result expr_finalise(
struct ivy_parser *ctx, struct expr_parser_state *state,
enum ivy_operator_precedence min_precedence, struct ivy_ast_node **result)
@@ -840,6 +852,10 @@ struct token_parse_result expr_finalise(
return PARSE_RESULT(status, 0);
}
if (state->s_return && expr) {
expr = create_return_node(expr);
}
*result = expr;
return PARSE_RESULT(IVY_OK, PARSE_REPEAT_TOKEN);
}
@@ -849,6 +865,11 @@ struct token_parse_result expr_finalise(
struct ivy_ast_cascade_node *cascade
= expr_finalise_cascade(state);
if (state->s_return && cascade) {
cascade = (struct ivy_ast_cascade_node *)create_return_node(
(struct ivy_ast_node *)cascade);
}
*result = (struct ivy_ast_node *)cascade;
return PARSE_RESULT(IVY_OK, flags);
}
@@ -856,6 +877,12 @@ struct token_parse_result expr_finalise(
if (state->s_sub_type == EXPR_SUBTYPE_COMPLEX_MSG) {
/* this is the end of a complex message */
struct ivy_ast_msg_node *msg = expr_finalise_complex_msg(state);
if (state->s_return && msg) {
msg = (struct ivy_ast_msg_node *)create_return_node(
(struct ivy_ast_node *)msg);
}
*result = (struct ivy_ast_node *)msg;
return PARSE_RESULT(IVY_OK, 0);
}
@@ -863,6 +890,12 @@ struct token_parse_result expr_finalise(
if (state->s_sub_type == EXPR_SUBTYPE_KEYWORD_MSG) {
/* this is the end of a keyword-message */
struct ivy_ast_msg_node *msg = expr_finalise_keyword_msg(state);
if (state->s_return && msg) {
msg = (struct ivy_ast_msg_node *)create_return_node(
(struct ivy_ast_node *)msg);
}
*result = (struct ivy_ast_node *)msg;
return PARSE_RESULT(IVY_OK, flags);
}
@@ -874,6 +907,10 @@ struct token_parse_result expr_finalise(
return PARSE_RESULT(status, 0);
}
if (expr && state->s_return) {
expr = create_return_node(expr);
}
*result = expr;
return PARSE_RESULT(IVY_OK, flags);
}