lang: ast: fix parsing of unlabelled complex msg args

This commit is contained in:
2025-09-08 16:00:07 +01:00
parent 6dfa0c7e17
commit 59a85e9c47

View File

@@ -739,6 +739,34 @@ not_complex_msg:
/* this is a generic parenthesis-enclosed sub-expression. /* this is a generic parenthesis-enclosed sub-expression.
* create a new sub-expr parser to handle it */ * create a new sub-expr parser to handle it */
if (state->s_sub_type == EXPR_SUBTYPE_COMPLEX_MSG) {
/* this is an unlabeled complex message arg */
if (state->s_prev_token != IVY_SYM_COMMA
&& state->s_prev_token != IVY_SYM_LEFT_PAREN) {
return PARSE_RESULT(IVY_ERR_BAD_SYNTAX, 0);
}
struct ivy_token *empty_label = malloc(sizeof *empty_label);
if (!empty_label) {
return PARSE_RESULT(IVY_ERR_NO_MEMORY, 0);
}
memset(empty_label, 0x0, sizeof *empty_label);
empty_label->t_type = IVY_TOK_LABEL;
b_queue_push_back(&state->s_labels, &empty_label->t_entry);
struct expr_parser_state *arg_expr
= (struct expr_parser_state *)parser_push_state(
ctx, IVY_AST_EXPR, 0);
expr_copy_terminators(state, arg_expr);
expr_add_terminator(arg_expr, IVY_SYM_COMMA);
arg_expr->s_sub_type = EXPR_SUBTYPE_COMPLEX_ARG;
arg_expr->s_subexpr_depth = state->s_subexpr_depth + 1;
return PARSE_RESULT(IVY_OK, PARSE_REPEAT_TOKEN);
}
struct expr_parser_state *sub_expr struct expr_parser_state *sub_expr
= (struct expr_parser_state *)parser_push_state( = (struct expr_parser_state *)parser_push_state(
ctx, IVY_AST_EXPR, 0); ctx, IVY_AST_EXPR, 0);