From 59a85e9c479f528971892786a375d74d881c07d2 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 8 Sep 2025 16:00:07 +0100 Subject: [PATCH] lang: ast: fix parsing of unlabelled complex msg args --- lang/ast/expr/arith.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lang/ast/expr/arith.c b/lang/ast/expr/arith.c index 3a88436..6d798f8 100644 --- a/lang/ast/expr/arith.c +++ b/lang/ast/expr/arith.c @@ -739,6 +739,34 @@ not_complex_msg: /* this is a generic parenthesis-enclosed sub-expression. * 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 *)parser_push_state( ctx, IVY_AST_EXPR, 0);