@@ -684,6 +684,17 @@ new_pat_hash(parser_state *p, node *pairs, node *rest)
684684return (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 */
688699static node*
689700new_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 }
88958912break;
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+88978924default:
88988925/* Fallback: unknown node type - skip like codegen.c does */
88998926printf("unknown node type %d (0x%x)\n", nodetype, (unsigned)nodetype);