GitHub

@@ -684,6 +684,17 @@ new_pat_hash(parser_state *p, node *pairs, node *rest)

684684

return (node*)n;

685685

}

686686687+

/* Create one-line pattern matching node (expr in pattern / expr => pattern) */

688+

static node*

689+

new_match_pat(parser_state *p, node *value, node *pattern, mrb_bool raise_on_fail)

690+

{

691+

struct mrb_ast_match_pat_node *n = NEW_NODE(match_pat, NODE_MATCH_PAT);

692+

n->value = value;

693+

n->pattern = pattern;

694+

n->raise_on_fail = raise_on_fail;

695+

return (node*)n;

696+

}

697+687698

/* Create in-clause node for case/in */

688699

static node*

689700

new_in(parser_state *p, node *pattern, node *guard, node *body, mrb_bool guard_is_unless)

@@ -2313,12 +2324,6 @@ stmt : keyword_alias fsym {p->lstate = EXPR_FNAME;} fsym

23132324

{

23142325

$$ = new_masgn(p, $1, new_array(p, $3));

23152326

}

2316-

| arg tASSOC tIDENTIFIER

2317-

{

2318-

node *lhs = new_lvar(p, $3);

2319-

assignable(p, lhs);

2320-

$$ = new_asgn(p, lhs, $1);

2321-

}

23222327

| expr

23232328

;

23242329

@@ -2419,6 +2424,18 @@ expr : command_call

24192424

{

24202425

$$ = call_uni_op(p, cond($2), "!");

24212426

}

2427+

| arg tASSOC {p->in_kwarg++;} p_expr

2428+

{

2429+

/* expr => pattern (raises NoMatchingPatternError on failure) */

2430+

p->in_kwarg--;

2431+

$$ = new_match_pat(p, $1, $4, TRUE);

2432+

}

2433+

| arg keyword_in {p->in_kwarg++;} p_expr

2434+

{

2435+

/* expr in pattern (returns true/false) */

2436+

p->in_kwarg--;

2437+

$$ = new_match_pat(p, $1, $4, FALSE);

2438+

}

24222439

| arg

24232440

;

24242441

@@ -8894,6 +8911,16 @@ dump_node(mrb_state *mrb, node *tree, int offset)

88948911

}

88958912

break;

889689138914+

case NODE_MATCH_PAT:

8915+

printf("NODE_MATCH_PAT%s:\n", match_pat_node(tree)->raise_on_fail ? " (=>)" : " (in)");

8916+

dump_prefix(offset+1, lineno);

8917+

printf("value:\n");

8918+

dump_node(mrb, match_pat_node(tree)->value, offset+2);

8919+

dump_prefix(offset+1, lineno);

8920+

printf("pattern:\n");

8921+

dump_node(mrb, match_pat_node(tree)->pattern, offset+2);

8922+

break;

8923+88978924

default:

88988925

/* Fallback: unknown node type - skip like codegen.c does */

88998926

printf("unknown node type %d (0x%x)\n", nodetype, (unsigned)nodetype);

Read the original on github.com ↗