aboutsummaryrefslogtreecommitdiffstats
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-10-23 14:15:04 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-10-23 17:40:33 +0900
commit3b05238289b973af3d5ff73d750ba243c0c2fa3f (patch)
tree89e46d87864def6012e7eebfe357861970457dc6 /parse.y
parentdf5bf5bb591af2d5382fb7746489bfd1d4b7df81 (diff)
downloadruby-3b05238289b973af3d5ff73d750ba243c0c2fa3f.tar.gz
Extract p_assoc and p_in to save lexer contexts
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y17
1 files changed, 9 insertions, 8 deletions
diff --git a/parse.y b/parse.y
index 01903eae1c..9230ef23fa 100644
--- a/parse.y
+++ b/parse.y
@@ -2095,6 +2095,7 @@ get_nd_args(struct parser_params *p, NODE *node)
%type <id> p_kwrest p_kwnorest p_any_kwrest p_kw_label
%type <id> f_no_kwarg f_any_kwrest args_forward excessed_comma nonlocal_var def_name
%type <ctxt> lex_ctxt begin_defined k_class k_module k_END k_rescue k_ensure after_rescue
+%type <ctxt> p_assoc p_in
%type <tbl> p_lparen p_lbracket
/* ripper */ %type <num> max_numparam
/* ripper */ %type <node> numparam
@@ -2648,12 +2649,11 @@ expr : command_call
{
$$ = call_uni_op(p, method_cond(p, $2, &@2), '!', &@1, &@$);
}
- | arg tASSOC[ctxt]
+ | arg p_assoc[ctxt]
{
value_expr($arg);
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
p->command_start = FALSE;
- $<ctxt>ctxt = p->ctxt;
p->ctxt.in_kwarg = 1;
$<tbl>$ = push_pvtbl(p);
}[pvtbl]
@@ -2664,18 +2664,17 @@ expr : command_call
{
pop_pktbl(p, $<tbl>pktbl);
pop_pvtbl(p, $<tbl>pvtbl);
- p->ctxt.in_kwarg = $<ctxt>ctxt.in_kwarg;
+ p->ctxt.in_kwarg = $ctxt.in_kwarg;
/*%%%*/
$$ = NEW_CASE3($arg, NEW_IN($body, 0, 0, &@body), &@$);
/*% %*/
/*% ripper: case!($arg, in!($body, Qnil, Qnil)) %*/
}
- | arg keyword_in[ctxt]
+ | arg p_in[ctxt]
{
value_expr($arg);
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
p->command_start = FALSE;
- $<ctxt>ctxt = p->ctxt;
p->ctxt.in_kwarg = 1;
$<tbl>$ = push_pvtbl(p);
}[pvtbl]
@@ -2686,7 +2685,7 @@ expr : command_call
{
pop_pktbl(p, $<tbl>pktbl);
pop_pvtbl(p, $<tbl>pvtbl);
- p->ctxt.in_kwarg = $<ctxt>ctxt.in_kwarg;
+ p->ctxt.in_kwarg = $ctxt.in_kwarg;
/*%%%*/
$$ = NEW_CASE3($arg, NEW_IN($body, NEW_TRUE(&@body), NEW_FALSE(&@body), &@body), &@$);
/*% %*/
@@ -5057,11 +5056,13 @@ cases : opt_else
| case_body
;
-p_case_body : keyword_in[ctxt]
+p_assoc : tASSOC lex_ctxt {$$ = $2;};
+p_in : keyword_in lex_ctxt {$$ = $2;};
+
+p_case_body : p_in[ctxt]
{
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
p->command_start = FALSE;
- $<ctxt>ctxt = p->ctxt;
p->ctxt.in_kwarg = 1;
$<tbl>$ = push_pvtbl(p);
}[pvtbl]