Skip to content

Ripper is slow on TruffleRuby #2767

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
eregon opened this issue Oct 28, 2022 · 2 comments
Open

Ripper is slow on TruffleRuby #2767

eregon opened this issue Oct 28, 2022 · 2 comments

Comments

@eregon
Copy link
Member

eregon commented Oct 28, 2022

The cause is pretty clear, here it's from running the ruby-lsp benchmark (with gem "syntax_tree", "4.0.2"):

ruby --engine.TraceCompilation -Iharness benchmarks/ruby-lsp/benchmark.rb |& grep 'opt fail'
[engine] opt failed id=72976 Lexer#advance                                      |Tier 1|Time  560(-2478665+2479225)ms|Reason: org.graalvm.compiler.truffle.compiler.GraphTooBigBailoutException: Graph too big to safely compile. Node count: 114422. Graph Size: 150001. Limit: 150000.|Timestamp 2479225288001|Src lexer.rb:11303
[engine] opt failed id=72976 Lexer#advance                                      |Tier 1|Time  431(-2479231+2479661)ms|Reason: org.graalvm.compiler.truffle.compiler.GraphTooBigBailoutException: Graph too big to safely compile. Node count: 114420. Graph Size: 150001. Limit: 150000.|Timestamp 2479661412740|Src lexer.rb:11303

[engine] opt failed id=18998 ripper_yyparse                                     |Tier 1|Time 5389(-2477447+2482836)ms|Reason: org.graalvm.compiler.truffle.compiler.GraphTooBigBailoutException: Graph too big to safely compile. Node count: 142162. Graph Size: 150003. Limit: 150000.|Timestamp 2482836050637|Src ripper.c:6157
[engine] opt failed id=18998 ripper_yyparse                                     |Tier 1|Time 6142(-2482840+2488982)ms|Reason: org.graalvm.compiler.truffle.compiler.GraphTooBigBailoutException: Graph too big to safely compile. Node count: 142364. Graph Size: 150002. Limit: 150000.|Timestamp 2488982502244|Src ripper.c:6157

The first two relate to #2290 (comment) / whitequark/parser#871, a separate issue.

$ ruby --vm.XX:+PrintGCSummary --cpusampler --cpusampler.Delay=15000 --cpusampler.ShowTiers=true -Iharness benchmarks/ruby-lsp/benchmark.rb
...
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Thread[main,5,main]
 Name                                                                                                 ||             Total Time    |   T0   |   T1   |   T2   ||              Self Time    |   T0   |   T1   |   T2   || Location             
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ripper_yyparse                                                                                       ||            16750ms  56.5% | 100.0% |   0.0% |   0.0% ||            10880ms  36.7% | 100.0% |   0.0% |   0.0% || ripper.c~6157:0
 RB_TYPE_P                                                                                            ||             2850ms   9.6% |   0.0% |  47.0% |  53.0% ||             2150ms   7.2% |   0.0% |  29.8% |  70.2% || object.c~21:0
 Lexer#advance                                                                                        ||             3120ms  10.5% | 100.0% |   0.0% |   0.0% ||             1760ms   5.9% | 100.0% |   0.0% |   0.0% || ../../.rubies/truffleruby-dev/lib/gems/gems/parser-3.1.2.1/lib/parser/lexer.rb~11303-24828:470723-833042
 Kernel#class                                                                                         ||              830ms   2.8% |   0.0% | 100.0% |   0.0% ||              830ms   2.8% |   0.0% | 100.0% |   0.0% || (core)~1:0
 BasicObject#!=                                                                                       ||              850ms   2.9% |  10.6% |  89.4% |   0.0% ||              770ms   2.6% |   3.9% |  96.1% |   0.0% || (core)~1:0
 Hash#[]                                                                                              ||              760ms   2.6% |  46.1% |  47.4% |   6.6% ||              440ms   1.5% |  45.5% |  43.2% |  11.4% || (core)~1:0
 Ripper#lineno                                                                                        ||              710ms   2.4% |  45.1% |  54.9% |   0.0% ||              350ms   1.2% |  40.0% |  60.0% |   0.0% || ../../.rubies/truffleruby-dev/lib/truffle/truffle/cext_ruby.rb~22:930-1002
 Hash#[]=                                                                                             ||              300ms   1.0% |  53.3% |  46.7% |   0.0% ||              290ms   1.0% |  51.7% |  48.3% |   0.0% || (core)~1:0
 Array#empty?                                                                                         ||              290ms   1.0% |   0.0% | 100.0% |   0.0% ||              290ms   1.0% |   0.0% | 100.0% |   0.0% || resource:/truffleruby/core/array.rb~398-400:9414-9445

So ripper_yyparse fails to be compiled because too big.

@rschatz Does Sulong use BlockNode or could it? Maybe only for basic blocks without control flow? But I'm not sure it would help then.

BTW, it'd be useful if Sulong shows the end line of functions (even if it's an approximation), because ripper.c~6157:0 doesn't tell us.
ripper_yyparse is 6686 lines long:

int
yyparse (struct parser_params *p)
{
/* The lookahead symbol. */
int yychar;
/* The semantic value of the lookahead symbol. */
/* Default value used for initialization, for pacifying older GCCs
or non-GCC compilers. */
YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
/* Location data for the lookahead symbol. */
static YYLTYPE yyloc_default
# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
= { 1, 1, 1, 1 }
# endif
;
YYLTYPE yylloc = yyloc_default;
/* Number of syntax errors so far. */
int yynerrs;
yy_state_fast_t yystate;
/* Number of tokens to shift before error messages enabled. */
int yyerrstatus;
/* The stacks and their tools:
'yyss': related to states.
'yyvs': related to semantic values.
'yyls': related to locations.
Refer to the stacks through separate pointers, to allow yyoverflow
to reallocate them elsewhere. */
/* The state stack. */
yy_state_t yyssa[YYINITDEPTH];
yy_state_t *yyss;
yy_state_t *yyssp;
/* The semantic value stack. */
YYSTYPE yyvsa[YYINITDEPTH];
YYSTYPE *yyvs;
YYSTYPE *yyvsp;
/* The location stack. */
YYLTYPE yylsa[YYINITDEPTH];
YYLTYPE *yyls;
YYLTYPE *yylsp;
/* The locations where the error started and ended. */
YYLTYPE yyerror_range[3];
YYPTRDIFF_T yystacksize;
int yyn;
int yyresult;
/* Lookahead token as an internal (translated) token number. */
int yytoken = 0;
/* The variables used to return semantic value and location from the
action routines. */
YYSTYPE yyval;
YYLTYPE yyloc;
#if YYERROR_VERBOSE
/* Buffer for error messages, and its allocated size. */
char yymsgbuf[128];
char *yymsg = yymsgbuf;
YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
#endif
#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
/* The number of symbols on the RHS of the reduced rule.
Keep to zero when no symbol should be popped. */
int yylen = 0;
yyssp = yyss = yyssa;
yyvsp = yyvs = yyvsa;
yylsp = yyls = yylsa;
yystacksize = YYINITDEPTH;
YYDPRINTF ((p, "Starting parse\n"));
yystate = 0;
yyerrstatus = 0;
yynerrs = 0;
yychar = YYEMPTY; /* Cause a token to be read. */
/* User initialization code. */
#line 1117 "ripper.y"
{
RUBY_SET_YYLLOC_OF_NONE(yylloc);
}
#line 6250 "ripper.c"
yylsp[0] = yylloc;
goto yysetstate;
/*------------------------------------------------------------.
| yynewstate -- push a new state, which is found in yystate. |
`------------------------------------------------------------*/
yynewstate:
/* In all cases, when you get here, the value and location stacks
have just been pushed. So pushing a state here evens the stacks. */
yyssp++;
/*--------------------------------------------------------------------.
| yysetstate -- set current state (the top of the stack) to yystate. |
`--------------------------------------------------------------------*/
yysetstate:
YYDPRINTF ((p, "Entering state %d\n", yystate));
YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
YY_IGNORE_USELESS_CAST_BEGIN
*yyssp = YY_CAST (yy_state_t, yystate);
YY_IGNORE_USELESS_CAST_END
if (yyss + yystacksize - 1 <= yyssp)
#if !defined yyoverflow && !defined YYSTACK_RELOCATE
goto yyexhaustedlab;
#else
{
/* Get the current used size of the three stacks, in elements. */
YYPTRDIFF_T yysize = yyssp - yyss + 1;
# if defined yyoverflow
{
/* Give user a chance to reallocate the stack. Use copies of
these so that the &'s don't force the real ones into
memory. */
yy_state_t *yyss1 = yyss;
YYSTYPE *yyvs1 = yyvs;
YYLTYPE *yyls1 = yyls;
/* Each stack pointer address is followed by the size of the
data in use in that stack, in bytes. This used to be a
conditional around just the two extra args, but that might
be undefined if yyoverflow is a macro. */
yyoverflow (YY_("memory exhausted"),
&yyss1, yysize * YYSIZEOF (*yyssp),
&yyvs1, yysize * YYSIZEOF (*yyvsp),
&yyls1, yysize * YYSIZEOF (*yylsp),
&yystacksize);
yyss = yyss1;
yyvs = yyvs1;
yyls = yyls1;
}
# else /* defined YYSTACK_RELOCATE */
/* Extend the stack our own way. */
if (YYMAXDEPTH <= yystacksize)
goto yyexhaustedlab;
yystacksize *= 2;
if (YYMAXDEPTH < yystacksize)
yystacksize = YYMAXDEPTH;
{
yy_state_t *yyss1 = yyss;
union yyalloc *yyptr =
YY_CAST (union yyalloc *,
YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
if (! yyptr)
goto yyexhaustedlab;
YYSTACK_RELOCATE (yyss_alloc, yyss);
YYSTACK_RELOCATE (yyvs_alloc, yyvs);
YYSTACK_RELOCATE (yyls_alloc, yyls);
# undef YYSTACK_RELOCATE
if (yyss1 != yyssa)
YYSTACK_FREE (yyss1);
}
# endif
yyssp = yyss + yysize - 1;
yyvsp = yyvs + yysize - 1;
yylsp = yyls + yysize - 1;
YY_IGNORE_USELESS_CAST_BEGIN
YYDPRINTF ((p, "Stack size increased to %ld\n",
YY_CAST (long, yystacksize)));
YY_IGNORE_USELESS_CAST_END
if (yyss + yystacksize - 1 <= yyssp)
YYABORT;
}
#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
if (yystate == YYFINAL)
YYACCEPT;
goto yybackup;
/*-----------.
| yybackup. |
`-----------*/
yybackup:
/* Do appropriate processing given the current state. Read a
lookahead token if we need one and don't already have one. */
/* First try to decide what to do without reference to lookahead token. */
yyn = yypact[yystate];
if (yypact_value_is_default (yyn))
goto yydefault;
/* Not known => get a lookahead token if don't already have one. */
/* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
if (yychar == YYEMPTY)
{
YYDPRINTF ((p, "Reading a token: "));
yychar = yylex (&yylval, &yylloc, p);
}
if (yychar <= YYEOF)
{
yychar = yytoken = YYEOF;
YYDPRINTF ((p, "Now at end of input.\n"));
}
else
{
yytoken = YYTRANSLATE (yychar);
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
}
/* If the proper action on seeing token YYTOKEN is to reduce or to
detect an error, take that action. */
yyn += yytoken;
if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
goto yydefault;
yyn = yytable[yyn];
if (yyn <= 0)
{
if (yytable_value_is_error (yyn))
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
}
/* Count tokens shifted since error; after three, turn off error
status. */
if (yyerrstatus)
yyerrstatus--;
/* Shift the lookahead token. */
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
yystate = yyn;
YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
*++yyvsp = yylval;
YY_IGNORE_MAYBE_UNINITIALIZED_END
*++yylsp = yylloc;
/* Discard the shifted token. */
yychar = YYEMPTY;
goto yynewstate;
/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state. |
`-----------------------------------------------------------*/
yydefault:
yyn = yydefact[yystate];
if (yyn == 0)
goto yyerrlab;
goto yyreduce;
/*-----------------------------.
| yyreduce -- do a reduction. |
`-----------------------------*/
yyreduce:
/* yyn is the number of a rule to reduce with. */
yylen = yyr2[yyn];
/* If YYLEN is nonzero, implement the default value of the action:
'$$ = $1'.
Otherwise, the following line sets YYVAL to garbage.
This behavior is undocumented and Bison
users should not rely upon it. Assigning to YYVAL
unconditionally makes the parser a bit smaller, and it avoids a
GCC warning that YYVAL may be used uninitialized. */
yyval = yyvsp[1-yylen];
/* Default location. */
YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
yyerror_range[1] = yyloc;
YY_REDUCE_PRINT (yyn);
switch (yyn)
{
case 2:
#line 1322 "ripper.y"
{
SET_LEX_STATE(EXPR_BEG);
local_push(p, ifndef_ripper(1)+0);
}
#line 6452 "ripper.c"
break;
case 3:
#line 1327 "ripper.y"
{
#if 0
if ((yyvsp[0].val) && !compile_for_eval) {
NODE *node = (yyvsp[0].val);
/* last expression should not be void */
if (nd_type(node) == NODE_BLOCK) {
while (node->nd_next) {
node = node->nd_next;
}
node = node->nd_head;
}
node = remove_begin(node);
void_expr(p, node);
}
p->eval_tree = NEW_SCOPE(0, block_append(p, p->eval_tree, (yyvsp[0].val)), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(program,v1);p->result=v2;}
local_pop(p);
}
#line 6476 "ripper.c"
break;
case 4:
#line 1349 "ripper.y"
{
(yyval.val) = void_stmts(p, (yyvsp[-1].val));
}
#line 6484 "ripper.c"
break;
case 5:
#line 1355 "ripper.y"
{
#if 0
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=dispatch0(stmts_new);v2=dispatch0(void_stmt);v3=v1;v4=v2;v5=dispatch2(stmts_add,v3,v4);(yyval.val)=v5;}
}
#line 6495 "ripper.c"
break;
case 6:
#line 1362 "ripper.y"
{
#if 0
(yyval.val) = newline_node((yyvsp[0].val));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(stmts_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(stmts_add,v2,v3);(yyval.val)=v4;}
}
#line 6506 "ripper.c"
break;
case 7:
#line 1369 "ripper.y"
{
#if 0
(yyval.val) = block_append(p, (yyvsp[-2].val), newline_node((yyvsp[0].val)));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(stmts_add,v1,v2);(yyval.val)=v3;}
}
#line 6517 "ripper.c"
break;
case 8:
#line 1376 "ripper.y"
{
(yyval.val) = remove_begin((yyvsp[0].val));
}
#line 6525 "ripper.c"
break;
case 10:
#line 1383 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 6533 "ripper.c"
break;
case 11:
#line 1389 "ripper.y"
{
#if 0
p->eval_tree_begin = block_append(p, p->eval_tree_begin,
NEW_BEGIN((yyvsp[-1].val), &(yyloc)));
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(BEGIN,v1);(yyval.val)=v2;}
}
#line 6546 "ripper.c"
break;
case 12:
#line 1401 "ripper.y"
{if (!(yyvsp[-1].val)) {yyerror1(&(yylsp[0]), "else without rescue is useless");}}
#line 6552 "ripper.c"
break;
case 13:
#line 1404 "ripper.y"
{
#if 0
(yyval.val) = new_bodystmt(p, (yyvsp[-5].val), (yyvsp[-4].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=escape_Qundef((yyvsp[-5].val));v2=escape_Qundef((yyvsp[-4].val));v3=escape_Qundef((yyvsp[-1].val));v4=escape_Qundef((yyvsp[0].val));v5=dispatch4(bodystmt,v1,v2,v3,v4);(yyval.val)=v5;}
}
#line 6563 "ripper.c"
break;
case 14:
#line 1413 "ripper.y"
{
#if 0
(yyval.val) = new_bodystmt(p, (yyvsp[-2].val), (yyvsp[-1].val), 0, (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=escape_Qundef((yyvsp[-2].val));v2=escape_Qundef((yyvsp[-1].val));v3=Qnil;v4=escape_Qundef((yyvsp[0].val));v5=dispatch4(bodystmt,v1,v2,v3,v4);(yyval.val)=v5;}
}
#line 6574 "ripper.c"
break;
case 15:
#line 1422 "ripper.y"
{
(yyval.val) = void_stmts(p, (yyvsp[-1].val));
}
#line 6582 "ripper.c"
break;
case 16:
#line 1428 "ripper.y"
{
#if 0
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=dispatch0(stmts_new);v2=dispatch0(void_stmt);v3=v1;v4=v2;v5=dispatch2(stmts_add,v3,v4);(yyval.val)=v5;}
}
#line 6593 "ripper.c"
break;
case 17:
#line 1435 "ripper.y"
{
#if 0
(yyval.val) = newline_node((yyvsp[0].val));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(stmts_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(stmts_add,v2,v3);(yyval.val)=v4;}
}
#line 6604 "ripper.c"
break;
case 18:
#line 1442 "ripper.y"
{
#if 0
(yyval.val) = block_append(p, (yyvsp[-2].val), newline_node((yyvsp[0].val)));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(stmts_add,v1,v2);(yyval.val)=v3;}
}
#line 6615 "ripper.c"
break;
case 19:
#line 1449 "ripper.y"
{
(yyval.val) = remove_begin((yyvsp[0].val));
}
#line 6623 "ripper.c"
break;
case 20:
#line 1455 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 6631 "ripper.c"
break;
case 21:
#line 1459 "ripper.y"
{
yyerror1(&(yylsp[0]), "BEGIN is permitted only at toplevel");
}
#line 6639 "ripper.c"
break;
case 22:
#line 1463 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 6647 "ripper.c"
break;
case 23:
#line 1468 "ripper.y"
{SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);}
#line 6653 "ripper.c"
break;
case 24:
#line 1469 "ripper.y"
{
#if 0
(yyval.val) = NEW_ALIAS((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(alias,v1,v2);(yyval.val)=v3;}
}
#line 6664 "ripper.c"
break;
case 25:
#line 1476 "ripper.y"
{
#if 0
(yyval.val) = NEW_VALIAS((yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(var_alias,v1,v2);(yyval.val)=v3;}
}
#line 6675 "ripper.c"
break;
case 26:
#line 1483 "ripper.y"
{
#if 0
char buf[2];
buf[0] = '$';
buf[1] = (char)(yyvsp[0].val)->nd_nth;
(yyval.val) = NEW_VALIAS((yyvsp[-1].val), rb_intern2(buf, 2), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(var_alias,v1,v2);(yyval.val)=v3;}
}
#line 6689 "ripper.c"
break;
case 27:
#line 1493 "ripper.y"
{
static const char mesg[] = "can't make alias for the number variables";
#if 0
yyerror1(&(yylsp[0]), mesg);
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2,v3;v1=ERR_MESG();v2=(yyvsp[0].val);v3=dispatch2(alias_error,v1,v2);(yyval.val)=v3;}ripper_error(p);
}
#line 6702 "ripper.c"
break;
case 28:
#line 1502 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(undef,v1);(yyval.val)=v2;}
}
#line 6713 "ripper.c"
break;
case 29:
#line 1509 "ripper.y"
{
#if 0
(yyval.val) = new_if(p, (yyvsp[0].val), remove_begin((yyvsp[-2].val)), 0, &(yyloc));
fixpos((yyval.val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[0].val);v2=(yyvsp[-2].val);v3=dispatch2(if_mod,v1,v2);(yyval.val)=v3;}
}
#line 6725 "ripper.c"
break;
case 30:
#line 1517 "ripper.y"
{
#if 0
(yyval.val) = new_unless(p, (yyvsp[0].val), remove_begin((yyvsp[-2].val)), 0, &(yyloc));
fixpos((yyval.val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[0].val);v2=(yyvsp[-2].val);v3=dispatch2(unless_mod,v1,v2);(yyval.val)=v3;}
}
#line 6737 "ripper.c"
break;
case 31:
#line 1525 "ripper.y"
{
#if 0
if ((yyvsp[-2].val) && nd_type((yyvsp[-2].val)) == NODE_BEGIN) {
(yyval.val) = NEW_WHILE(cond(p, (yyvsp[0].val), &(yylsp[0])), (yyvsp[-2].val)->nd_body, 0, &(yyloc));
}
else {
(yyval.val) = NEW_WHILE(cond(p, (yyvsp[0].val), &(yylsp[0])), (yyvsp[-2].val), 1, &(yyloc));
}
#endif
{VALUE v1,v2,v3;v1=(yyvsp[0].val);v2=(yyvsp[-2].val);v3=dispatch2(while_mod,v1,v2);(yyval.val)=v3;}
}
#line 6753 "ripper.c"
break;
case 32:
#line 1537 "ripper.y"
{
#if 0
if ((yyvsp[-2].val) && nd_type((yyvsp[-2].val)) == NODE_BEGIN) {
(yyval.val) = NEW_UNTIL(cond(p, (yyvsp[0].val), &(yylsp[0])), (yyvsp[-2].val)->nd_body, 0, &(yyloc));
}
else {
(yyval.val) = NEW_UNTIL(cond(p, (yyvsp[0].val), &(yylsp[0])), (yyvsp[-2].val), 1, &(yyloc));
}
#endif
{VALUE v1,v2,v3;v1=(yyvsp[0].val);v2=(yyvsp[-2].val);v3=dispatch2(until_mod,v1,v2);(yyval.val)=v3;}
}
#line 6769 "ripper.c"
break;
case 33:
#line 1549 "ripper.y"
{
#if 0
NODE *resq;
YYLTYPE loc = code_loc_gen(&(yylsp[-1]), &(yylsp[0]));
resq = NEW_RESBODY(0, remove_begin((yyvsp[0].val)), 0, &loc);
(yyval.val) = NEW_RESCUE(remove_begin((yyvsp[-2].val)), resq, 0, &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(rescue_mod,v1,v2);(yyval.val)=v3;}
}
#line 6783 "ripper.c"
break;
case 34:
#line 1559 "ripper.y"
{
if (p->ctxt.in_def) {
rb_warn0("END in method; use at_exit");
}
#if 0
{
NODE *scope = NEW_NODE(
NODE_SCOPE, 0 /* tbl */, (yyvsp[-1].val) /* body */, 0 /* args */, &(yyloc));
(yyval.val) = NEW_POSTEXE(scope, &(yyloc));
}
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(END,v1);(yyval.val)=v2;}
}
#line 6801 "ripper.c"
break;
case 36:
#line 1574 "ripper.y"
{
#if 0
value_expr((yyvsp[0].val));
(yyval.val) = node_assign(p, (yyvsp[-3].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[0].val);v3=dispatch2(massign,v1,v2);(yyval.val)=v3;}
}
#line 6813 "ripper.c"
break;
case 37:
#line 1582 "ripper.y"
{
#if 0
value_expr((yyvsp[0].val));
(yyval.val) = node_assign(p, (yyvsp[-3].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[0].val);v3=dispatch2(assign,v1,v2);(yyval.val)=v3;}
}
#line 6825 "ripper.c"
break;
case 38:
#line 1590 "ripper.y"
{
#if 0
YYLTYPE loc = code_loc_gen(&(yylsp[-1]), &(yylsp[0]));
value_expr((yyvsp[-2].val));
(yyval.val) = node_assign(p, (yyvsp[-5].val), NEW_RESCUE((yyvsp[-2].val), NEW_RESBODY(0, remove_begin((yyvsp[0].val)), 0, &loc), 0, &(yyloc)), (yyvsp[-3].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(rescue_mod,v1,v2);v4=(yyvsp[-5].val);v5=v3;v6=dispatch2(massign,v4,v5);(yyval.val)=v6;}
}
#line 6838 "ripper.c"
break;
case 39:
#line 1599 "ripper.y"
{
#if 0
(yyval.val) = node_assign(p, (yyvsp[-3].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[0].val);v3=dispatch2(massign,v1,v2);(yyval.val)=v3;}
}
#line 6849 "ripper.c"
break;
case 41:
#line 1609 "ripper.y"
{
#if 0
(yyval.val) = node_assign(p, (yyvsp[-3].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[0].val);v3=dispatch2(assign,v1,v2);(yyval.val)=v3;}
}
#line 6860 "ripper.c"
break;
case 42:
#line 1616 "ripper.y"
{
#if 0
(yyval.val) = new_op_assign(p, (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-3].val);v2=(yyvsp[-2].val);v3=(yyvsp[0].val);v4=dispatch3(opassign,v1,v2,v3);(yyval.val)=v4;}
}
#line 6871 "ripper.c"
break;
case 43:
#line 1623 "ripper.y"
{
#if 0
(yyval.val) = new_ary_op_assign(p, (yyvsp[-6].val), (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-4]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-6].val);v2=escape_Qundef((yyvsp[-4].val));v3=dispatch2(aref_field,v1,v2);v4=v3;v5=(yyvsp[-2].val);v6=(yyvsp[0].val);v7=dispatch3(opassign,v4,v5,v6);(yyval.val)=v7;}
}
#line 6883 "ripper.c"
break;
case 44:
#line 1631 "ripper.y"
{
#if 0
(yyval.val) = new_attr_op_assign(p, (yyvsp[-5].val), (yyvsp[-4].val), (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-5].val);v2=(yyvsp[-4].val);v3=(yyvsp[-3].val);v4=dispatch3(field,v1,v2,v3);v5=v4;v6=(yyvsp[-2].val);v7=(yyvsp[0].val);v8=dispatch3(opassign,v5,v6,v7);(yyval.val)=v8;}
}
#line 6894 "ripper.c"
break;
case 45:
#line 1638 "ripper.y"
{
#if 0
(yyval.val) = new_attr_op_assign(p, (yyvsp[-5].val), (yyvsp[-4].val), (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-5].val);v2=(yyvsp[-4].val);v3=(yyvsp[-3].val);v4=dispatch3(field,v1,v2,v3);v5=v4;v6=(yyvsp[-2].val);v7=(yyvsp[0].val);v8=dispatch3(opassign,v5,v6,v7);(yyval.val)=v8;}
}
#line 6905 "ripper.c"
break;
case 46:
#line 1645 "ripper.y"
{
#if 0
YYLTYPE loc = code_loc_gen(&(yylsp[-5]), &(yylsp[-3]));
(yyval.val) = new_const_op_assign(p, NEW_COLON2((yyvsp[-5].val), (yyvsp[-3].val), &loc), (yyvsp[-2].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-5].val);v2=(yyvsp[-3].val);v3=dispatch2(const_path_field,v1,v2);v4=v3;v5=(yyvsp[-2].val);v6=(yyvsp[0].val);v7=dispatch3(opassign,v4,v5,v6);(yyval.val)=v7;}
}
#line 6917 "ripper.c"
break;
case 47:
#line 1653 "ripper.y"
{
#if 0
(yyval.val) = new_attr_op_assign(p, (yyvsp[-5].val), ID2VAL(idCOLON2), (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-5].val);v2=ID2VAL(idCOLON2);v3=(yyvsp[-3].val);v4=dispatch3(field,v1,v2,v3);v5=v4;v6=(yyvsp[-2].val);v7=(yyvsp[0].val);v8=dispatch3(opassign,v5,v6,v7);(yyval.val)=v8;}
}
#line 6928 "ripper.c"
break;
case 48:
#line 1660 "ripper.y"
{
#if 0
rb_backref_error(p, (yyvsp[-3].val));
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2,v3;v1=var_field(p, (yyvsp[-3].val));v2=(yyvsp[0].val);v3=dispatch2(assign,v1,v2);(yyval.val)=backref_error(p, RNODE((yyvsp[-3].val)), v3);}ripper_error(p);
}
#line 6940 "ripper.c"
break;
case 49:
#line 1670 "ripper.y"
{
value_expr((yyvsp[0].val));
(yyval.val) = (yyvsp[0].val);
}
#line 6949 "ripper.c"
break;
case 50:
#line 1675 "ripper.y"
{
#if 0
YYLTYPE loc = code_loc_gen(&(yylsp[-1]), &(yylsp[0]));
value_expr((yyvsp[-2].val));
(yyval.val) = NEW_RESCUE((yyvsp[-2].val), NEW_RESBODY(0, remove_begin((yyvsp[0].val)), 0, &loc), 0, &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(rescue_mod,v1,v2);(yyval.val)=v3;}
}
#line 6962 "ripper.c"
break;
case 53:
#line 1688 "ripper.y"
{
(yyval.val) = logop(p, idAND, (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 6970 "ripper.c"
break;
case 54:
#line 1692 "ripper.y"
{
(yyval.val) = logop(p, idOR, (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 6978 "ripper.c"
break;
case 55:
#line 1696 "ripper.y"
{
(yyval.val) = call_uni_op(p, method_cond(p, (yyvsp[0].val), &(yylsp[0])), METHOD_NOT, &(yylsp[-2]), &(yyloc));
}
#line 6986 "ripper.c"
break;
case 56:
#line 1700 "ripper.y"
{
(yyval.val) = call_uni_op(p, method_cond(p, (yyvsp[0].val), &(yylsp[0])), '!', &(yylsp[-1]), &(yyloc));
}
#line 6994 "ripper.c"
break;
case 57:
#line 1704 "ripper.y"
{
value_expr((yyvsp[-1].val));
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
p->command_start = FALSE;
(yyval.ctxt) = p->ctxt;
p->ctxt.in_kwarg = 1;
}
#line 7006 "ripper.c"
break;
case 58:
#line 1711 "ripper.y"
{(yyval.tbl) = push_pvtbl(p);}
#line 7012 "ripper.c"
break;
case 59:
#line 1713 "ripper.y"
{pop_pvtbl(p, (yyvsp[-1].tbl));}
#line 7018 "ripper.c"
break;
case 60:
#line 1714 "ripper.y"
{
p->ctxt.in_kwarg = (yyvsp[-3].ctxt).in_kwarg;
#if 0
(yyval.val) = NEW_CASE3((yyvsp[-5].val), NEW_IN((yyvsp[-1].val), 0, 0, &(yylsp[-1])), &(yyloc));
warn_one_line_pattern_matching(p, (yyval.val), (yyvsp[-1].val), true);
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-1].val);v2=Qnil;v3=Qnil;v4=dispatch3(in,v1,v2,v3);v5=(yyvsp[-5].val);v6=v4;v7=dispatch2(case,v5,v6);(yyval.val)=v7;}
}
#line 7031 "ripper.c"
break;
case 61:
#line 1723 "ripper.y"
{
value_expr((yyvsp[-1].val));
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
p->command_start = FALSE;
(yyval.ctxt) = p->ctxt;
p->ctxt.in_kwarg = 1;
}
#line 7043 "ripper.c"
break;
case 62:
#line 1730 "ripper.y"
{(yyval.tbl) = push_pvtbl(p);}
#line 7049 "ripper.c"
break;
case 63:
#line 1732 "ripper.y"
{pop_pvtbl(p, (yyvsp[-1].tbl));}
#line 7055 "ripper.c"
break;
case 64:
#line 1733 "ripper.y"
{
p->ctxt.in_kwarg = (yyvsp[-3].ctxt).in_kwarg;
#if 0
(yyval.val) = NEW_CASE3((yyvsp[-5].val), NEW_IN((yyvsp[-1].val), NEW_TRUE(&(yylsp[-1])), NEW_FALSE(&(yylsp[-1])), &(yylsp[-1])), &(yyloc));
warn_one_line_pattern_matching(p, (yyval.val), (yyvsp[-1].val), false);
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-1].val);v2=Qnil;v3=Qnil;v4=dispatch3(in,v1,v2,v3);v5=(yyvsp[-5].val);v6=v4;v7=dispatch2(case,v5,v6);(yyval.val)=v7;}
}
#line 7068 "ripper.c"
break;
case 66:
#line 1745 "ripper.y"
{
ID fname = get_id((yyvsp[0].val));
ID cur_arg = p->cur_arg;
YYSTYPE c = {.ctxt = p->ctxt};
numparam_name(p, fname);
local_push(p, 0);
p->cur_arg = 0;
p->ctxt.in_def = 1;
(yyval.node) = NEW_NODE(NODE_SELF, /*vid*/cur_arg, /*mid*/fname, /*cval*/c.val, &(yyloc));
#if 0
#endif
(yyval.val) = NEW_RIPPER(fname, get_value((yyvsp[0].val)), (yyval.val), &NULL_LOC);
}
#line 7087 "ripper.c"
break;
case 67:
#line 1762 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
#if 0
(yyval.val) = NEW_NODE(NODE_DEFN, 0, (yyval.val)->nd_mid, (yyval.val), &(yyloc));
#endif
}
#line 7098 "ripper.c"
break;
case 68:
#line 1770 "ripper.y"
{SET_LEX_STATE(EXPR_FNAME);}
#line 7104 "ripper.c"
break;
case 69:
#line 1771 "ripper.y"
{
SET_LEX_STATE(EXPR_ENDFN|EXPR_LABEL); /* force for args */
(yyval.val) = (yyvsp[0].val);
#if 0
(yyval.val) = NEW_NODE(NODE_DEFS, (yyvsp[-3].val), (yyval.val)->nd_mid, (yyval.val), &(yyloc));
#endif
VALUE ary = rb_ary_new_from_args(3, (yyvsp[-3].val), (yyvsp[-2].val), get_value((yyval.val)));
add_mark_object(p, ary);
(yyval.node)->nd_rval = ary;
}
#line 7120 "ripper.c"
break;
case 70:
#line 1785 "ripper.y"
{
value_expr((yyvsp[0].val));
(yyval.val) = (yyvsp[0].val);
}
#line 7129 "ripper.c"
break;
case 71:
#line 1791 "ripper.y"
{COND_PUSH(1);}
#line 7135 "ripper.c"
break;
case 72:
#line 1791 "ripper.y"
{COND_POP();}
#line 7141 "ripper.c"
break;
case 73:
#line 1792 "ripper.y"
{
(yyval.val) = (yyvsp[-2].val);
}
#line 7149 "ripper.c"
break;
case 77:
#line 1803 "ripper.y"
{
#if 0
(yyval.val) = new_qcall(p, (yyvsp[-2].val), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-3].val);v2=(yyvsp[-2].val);v3=(yyvsp[-1].val);v4=dispatch3(call,v1,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=dispatch2(method_add_arg,v5,v6);(yyval.val)=v7;}
}
#line 7160 "ripper.c"
break;
case 78:
#line 1812 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
#if 0
(yyval.val)->nd_body->nd_loc = code_loc_gen(&(yylsp[-2]), &(yylsp[0]));
nd_set_line((yyval.val), (yylsp[-2]).end_pos.lineno);
#endif
}
#line 7172 "ripper.c"
break;
case 79:
#line 1822 "ripper.y"
{
#if 0
(yyval.val) = NEW_FCALL((yyvsp[0].val), 0, &(yyloc));
nd_set_line((yyval.val), p->tokline);
#endif
(yyval.val)=(yyvsp[0].val);
}
#line 7184 "ripper.c"
break;
case 80:
#line 1832 "ripper.y"
{
#if 0
(yyvsp[-1].val)->nd_args = (yyvsp[0].val);
nd_set_last_loc((yyvsp[-1].val), (yylsp[0]).end_pos);
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(command,v1,v2);(yyval.val)=v3;}
}
#line 7197 "ripper.c"
break;
case 81:
#line 1841 "ripper.y"
{
#if 0
block_dup_check(p, (yyvsp[-1].val), (yyvsp[0].val));
(yyvsp[-2].val)->nd_args = (yyvsp[-1].val);
(yyval.val) = method_add_block(p, (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-2].val));
nd_set_last_loc((yyvsp[-2].val), (yylsp[-1]).end_pos);
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=dispatch2(command,v1,v2);v4=v3;v5=(yyvsp[0].val);v6=dispatch2(method_add_block,v4,v5);(yyval.val)=v6;}
}
#line 7212 "ripper.c"
break;
case 82:
#line 1852 "ripper.y"
{
#if 0
(yyval.val) = new_command_qcall(p, (yyvsp[-2].val), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), Qnull, &(yylsp[-1]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-3].val);v2=(yyvsp[-2].val);v3=(yyvsp[-1].val);v4=(yyvsp[0].val);v5=dispatch4(command_call,v1,v2,v3,v4);(yyval.val)=v5;}
}
#line 7223 "ripper.c"
break;
case 83:
#line 1859 "ripper.y"
{
#if 0
(yyval.val) = new_command_qcall(p, (yyvsp[-3].val), (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-2]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-4].val);v2=(yyvsp[-3].val);v3=(yyvsp[-2].val);v4=(yyvsp[-1].val);v5=dispatch4(command_call,v1,v2,v3,v4);v6=v5;v7=(yyvsp[0].val);v8=dispatch2(method_add_block,v6,v7);(yyval.val)=v8;}
}
#line 7234 "ripper.c"
break;
case 84:
#line 1866 "ripper.y"
{
#if 0
(yyval.val) = new_command_qcall(p, ID2VAL(idCOLON2), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), Qnull, &(yylsp[-1]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-3].val);v2=ID2VAL(idCOLON2);v3=(yyvsp[-1].val);v4=(yyvsp[0].val);v5=dispatch4(command_call,v1,v2,v3,v4);(yyval.val)=v5;}
}
#line 7245 "ripper.c"
break;
case 85:
#line 1873 "ripper.y"
{
#if 0
(yyval.val) = new_command_qcall(p, ID2VAL(idCOLON2), (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-2]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-4].val);v2=ID2VAL(idCOLON2);v3=(yyvsp[-2].val);v4=(yyvsp[-1].val);v5=dispatch4(command_call,v1,v2,v3,v4);v6=v5;v7=(yyvsp[0].val);v8=dispatch2(method_add_block,v6,v7);(yyval.val)=v8;}
}
#line 7256 "ripper.c"
break;
case 86:
#line 1880 "ripper.y"
{
#if 0
(yyval.val) = NEW_SUPER((yyvsp[0].val), &(yyloc));
fixpos((yyval.val), (yyvsp[0].val));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(super,v1);(yyval.val)=v2;}
}
#line 7268 "ripper.c"
break;
case 87:
#line 1888 "ripper.y"
{
#if 0
(yyval.val) = new_yield(p, (yyvsp[0].val), &(yyloc));
fixpos((yyval.val), (yyvsp[0].val));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(yield,v1);(yyval.val)=v2;}
}
#line 7280 "ripper.c"
break;
case 88:
#line 1896 "ripper.y"
{
#if 0
(yyval.val) = NEW_RETURN(ret_args(p, (yyvsp[0].val)), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(return,v1);(yyval.val)=v2;}
}
#line 7291 "ripper.c"
break;
case 89:
#line 1903 "ripper.y"
{
#if 0
(yyval.val) = NEW_BREAK(ret_args(p, (yyvsp[0].val)), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(break,v1);(yyval.val)=v2;}
}
#line 7302 "ripper.c"
break;
case 90:
#line 1910 "ripper.y"
{
#if 0
(yyval.val) = NEW_NEXT(ret_args(p, (yyvsp[0].val)), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(next,v1);(yyval.val)=v2;}
}
#line 7313 "ripper.c"
break;
case 92:
#line 1920 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(mlhs_paren,v1);(yyval.val)=v2;}
}
#line 7324 "ripper.c"
break;
case 94:
#line 1930 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN(NEW_LIST((yyvsp[-1].val), &(yyloc)), 0, &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(mlhs_paren,v1);(yyval.val)=v2;}
}
#line 7335 "ripper.c"
break;
case 95:
#line 1939 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN((yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=(yyvsp[0].val);
}
#line 7346 "ripper.c"
break;
case 96:
#line 1946 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN(list_append(p, (yyvsp[-1].val),(yyvsp[0].val)), 0, &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(mlhs_add,v1,v2);(yyval.val)=v3;}
}
#line 7357 "ripper.c"
break;
case 97:
#line 1953 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(mlhs_add_star,v1,v2);(yyval.val)=v3;}
}
#line 7368 "ripper.c"
break;
case 98:
#line 1960 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN((yyvsp[-4].val), NEW_POSTARG((yyvsp[-2].val),(yyvsp[0].val),&(yyloc)), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=(yyvsp[-4].val);v2=(yyvsp[-2].val);v3=dispatch2(mlhs_add_star,v1,v2);v4=v3;v5=(yyvsp[0].val);v6=dispatch2(mlhs_add_post,v4,v5);(yyval.val)=v6;}
}
#line 7379 "ripper.c"
break;
case 99:
#line 1967 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN((yyvsp[-1].val), NODE_SPECIAL_NO_NAME_REST, &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=Qnil;v3=dispatch2(mlhs_add_star,v1,v2);(yyval.val)=v3;}
}
#line 7390 "ripper.c"
break;
case 100:
#line 1974 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN((yyvsp[-3].val), NEW_POSTARG(NODE_SPECIAL_NO_NAME_REST, (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=(yyvsp[-3].val);v2=Qnil;v3=dispatch2(mlhs_add_star,v1,v2);v4=v3;v5=(yyvsp[0].val);v6=dispatch2(mlhs_add_post,v4,v5);(yyval.val)=v6;}
}
#line 7401 "ripper.c"
break;
case 101:
#line 1981 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN(0, (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(mlhs_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(mlhs_add_star,v2,v3);(yyval.val)=v4;}
}
#line 7412 "ripper.c"
break;
case 102:
#line 1988 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN(0, NEW_POSTARG((yyvsp[-2].val),(yyvsp[0].val),&(yyloc)), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=dispatch0(mlhs_new);v2=v1;v3=(yyvsp[-2].val);v4=dispatch2(mlhs_add_star,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=dispatch2(mlhs_add_post,v5,v6);(yyval.val)=v7;}
}
#line 7423 "ripper.c"
break;
case 103:
#line 1995 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN(0, NODE_SPECIAL_NO_NAME_REST, &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(mlhs_new);v2=v1;v3=Qnil;v4=dispatch2(mlhs_add_star,v2,v3);(yyval.val)=v4;}
}
#line 7434 "ripper.c"
break;
case 104:
#line 2002 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN(0, NEW_POSTARG(NODE_SPECIAL_NO_NAME_REST, (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=dispatch0(mlhs_new);v2=v1;v3=Qnil;v4=dispatch2(mlhs_add_star,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=dispatch2(mlhs_add_post,v5,v6);(yyval.val)=v7;}
}
#line 7445 "ripper.c"
break;
case 106:
#line 2012 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(mlhs_paren,v1);(yyval.val)=v2;}
}
#line 7456 "ripper.c"
break;
case 107:
#line 2021 "ripper.y"
{
#if 0
(yyval.val) = NEW_LIST((yyvsp[-1].val), &(yylsp[-1]));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(mlhs_new);v2=v1;v3=(yyvsp[-1].val);v4=dispatch2(mlhs_add,v2,v3);(yyval.val)=v4;}
}
#line 7467 "ripper.c"
break;
case 108:
#line 2028 "ripper.y"
{
#if 0
(yyval.val) = list_append(p, (yyvsp[-2].val), (yyvsp[-1].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=dispatch2(mlhs_add,v1,v2);(yyval.val)=v3;}
}
#line 7478 "ripper.c"
break;
case 109:
#line 2037 "ripper.y"
{
#if 0
(yyval.val) = NEW_LIST((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(mlhs_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(mlhs_add,v2,v3);(yyval.val)=v4;}
}
#line 7489 "ripper.c"
break;
case 110:
#line 2044 "ripper.y"
{
#if 0
(yyval.val) = list_append(p, (yyvsp[-2].val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(mlhs_add,v1,v2);(yyval.val)=v3;}
}
#line 7500 "ripper.c"
break;
case 111:
#line 2053 "ripper.y"
{
#if 0
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=assignable(p, var_field(p, (yyvsp[0].val)));
}
#line 7511 "ripper.c"
break;
case 112:
#line 2060 "ripper.y"
{
#if 0
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=assignable(p, var_field(p, (yyvsp[0].val)));
}
#line 7522 "ripper.c"
break;
case 113:
#line 2067 "ripper.y"
{
#if 0
(yyval.val) = aryset(p, (yyvsp[-3].val), (yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=escape_Qundef((yyvsp[-1].val));v3=dispatch2(aref_field,v1,v2);(yyval.val)=v3;}
}
#line 7533 "ripper.c"
break;
case 114:
#line 2074 "ripper.y"
{
if ((yyvsp[-1].val) == tANDDOT) {
yyerror1(&(yylsp[-1]), "&. inside multiple assignment destination");
}
#if 0
(yyval.val) = attrset(p, (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=(yyvsp[0].val);v4=dispatch3(field,v1,v2,v3);(yyval.val)=v4;}
}
#line 7547 "ripper.c"
break;
case 115:
#line 2084 "ripper.y"
{
#if 0
(yyval.val) = attrset(p, (yyvsp[-2].val), idCOLON2, (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(const_path_field,v1,v2);(yyval.val)=v3;}
}
#line 7558 "ripper.c"
break;
case 116:
#line 2091 "ripper.y"
{
if ((yyvsp[-1].val) == tANDDOT) {
yyerror1(&(yylsp[-1]), "&. inside multiple assignment destination");
}
#if 0
(yyval.val) = attrset(p, (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=(yyvsp[0].val);v4=dispatch3(field,v1,v2,v3);(yyval.val)=v4;}
}
#line 7572 "ripper.c"
break;
case 117:
#line 2101 "ripper.y"
{
#if 0
(yyval.val) = const_decl(p, NEW_COLON2((yyvsp[-2].val), (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(const_path_field,v1,v2);(yyval.val)=const_decl(p, v3);}
}
#line 7583 "ripper.c"
break;
case 118:
#line 2108 "ripper.y"
{
#if 0
(yyval.val) = const_decl(p, NEW_COLON3((yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(top_const_field,v1);(yyval.val)=const_decl(p, v2);}
}
#line 7594 "ripper.c"
break;
case 119:
#line 2115 "ripper.y"
{
#if 0
rb_backref_error(p, (yyvsp[0].val));
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
(yyval.val)=backref_error(p, RNODE((yyvsp[0].val)), var_field(p, (yyvsp[0].val)));ripper_error(p);
}
#line 7606 "ripper.c"
break;
case 120:
#line 2125 "ripper.y"
{
#if 0
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=assignable(p, var_field(p, (yyvsp[0].val)));
}
#line 7617 "ripper.c"
break;
case 121:
#line 2132 "ripper.y"
{
#if 0
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=assignable(p, var_field(p, (yyvsp[0].val)));
}
#line 7628 "ripper.c"
break;
case 122:
#line 2139 "ripper.y"
{
#if 0
(yyval.val) = aryset(p, (yyvsp[-3].val), (yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=escape_Qundef((yyvsp[-1].val));v3=dispatch2(aref_field,v1,v2);(yyval.val)=v3;}
}
#line 7639 "ripper.c"
break;
case 123:
#line 2146 "ripper.y"
{
#if 0
(yyval.val) = attrset(p, (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=(yyvsp[0].val);v4=dispatch3(field,v1,v2,v3);(yyval.val)=v4;}
}
#line 7650 "ripper.c"
break;
case 124:
#line 2153 "ripper.y"
{
#if 0
(yyval.val) = attrset(p, (yyvsp[-2].val), idCOLON2, (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-2].val);v2=ID2VAL(idCOLON2);v3=(yyvsp[0].val);v4=dispatch3(field,v1,v2,v3);(yyval.val)=v4;}
}
#line 7661 "ripper.c"
break;
case 125:
#line 2160 "ripper.y"
{
#if 0
(yyval.val) = attrset(p, (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=(yyvsp[0].val);v4=dispatch3(field,v1,v2,v3);(yyval.val)=v4;}
}
#line 7672 "ripper.c"
break;
case 126:
#line 2167 "ripper.y"
{
#if 0
(yyval.val) = const_decl(p, NEW_COLON2((yyvsp[-2].val), (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(const_path_field,v1,v2);(yyval.val)=const_decl(p, v3);}
}
#line 7683 "ripper.c"
break;
case 127:
#line 2174 "ripper.y"
{
#if 0
(yyval.val) = const_decl(p, NEW_COLON3((yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(top_const_field,v1);(yyval.val)=const_decl(p, v2);}
}
#line 7694 "ripper.c"
break;
case 128:
#line 2181 "ripper.y"
{
#if 0
rb_backref_error(p, (yyvsp[0].val));
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
(yyval.val)=backref_error(p, RNODE((yyvsp[0].val)), var_field(p, (yyvsp[0].val)));ripper_error(p);
}
#line 7706 "ripper.c"
break;
case 129:
#line 2191 "ripper.y"
{
static const char mesg[] = "class/module name must be CONSTANT";
#if 0
yyerror1(&(yylsp[0]), mesg);
#endif
{VALUE v1,v2,v3;v1=ERR_MESG();v2=(yyvsp[0].val);v3=dispatch2(class_name_error,v1,v2);(yyval.val)=v3;}ripper_error(p);
}
#line 7718 "ripper.c"
break;
case 131:
#line 2202 "ripper.y"
{
#if 0
(yyval.val) = NEW_COLON3((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(top_const_ref,v1);(yyval.val)=v2;}
}
#line 7729 "ripper.c"
break;
case 132:
#line 2209 "ripper.y"
{
#if 0
(yyval.val) = NEW_COLON2(0, (yyval.val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(const_ref,v1);(yyval.val)=v2;}
}
#line 7740 "ripper.c"
break;
case 133:
#line 2216 "ripper.y"
{
#if 0
(yyval.val) = NEW_COLON2((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(const_path_ref,v1,v2);(yyval.val)=v3;}
}
#line 7751 "ripper.c"
break;
case 137:
#line 2228 "ripper.y"
{
SET_LEX_STATE(EXPR_ENDFN);
(yyval.val) = (yyvsp[0].val);
}
#line 7760 "ripper.c"
break;
case 139:
#line 2236 "ripper.y"
{
#if 0
(yyval.val) = NEW_LIT(ID2SYM((yyvsp[0].val)), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(symbol_literal,v1);(yyval.val)=v2;}
}
#line 7771 "ripper.c"
break;
case 141:
#line 2246 "ripper.y"
{
#if 0
(yyval.val) = NEW_UNDEF((yyvsp[0].val), &(yyloc));
#endif
(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));
}
#line 7782 "ripper.c"
break;
case 142:
#line 2252 "ripper.y"
{SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);}
#line 7788 "ripper.c"
break;
case 143:
#line 2253 "ripper.y"
{
#if 0
NODE *undef = NEW_UNDEF((yyvsp[0].val), &(yylsp[0]));
(yyval.val) = block_append(p, (yyvsp[-3].val), undef);
#endif
(yyval.val)=rb_ary_push((yyvsp[-3].val), get_value((yyvsp[0].val)));
}
#line 7800 "ripper.c"
break;
case 144:
#line 2262 "ripper.y"
{ ifndef_ripper((yyval.val) = '|'); }
#line 7806 "ripper.c"
break;
case 145:
#line 2263 "ripper.y"
{ ifndef_ripper((yyval.val) = '^'); }
#line 7812 "ripper.c"
break;
case 146:
#line 2264 "ripper.y"
{ ifndef_ripper((yyval.val) = '&'); }
#line 7818 "ripper.c"
break;
case 147:
#line 2265 "ripper.y"
{ ifndef_ripper((yyval.val) = tCMP); }
#line 7824 "ripper.c"
break;
case 148:
#line 2266 "ripper.y"
{ ifndef_ripper((yyval.val) = tEQ); }
#line 7830 "ripper.c"
break;
case 149:
#line 2267 "ripper.y"
{ ifndef_ripper((yyval.val) = tEQQ); }
#line 7836 "ripper.c"
break;
case 150:
#line 2268 "ripper.y"
{ ifndef_ripper((yyval.val) = tMATCH); }
#line 7842 "ripper.c"
break;
case 151:
#line 2269 "ripper.y"
{ ifndef_ripper((yyval.val) = tNMATCH); }
#line 7848 "ripper.c"
break;
case 152:
#line 2270 "ripper.y"
{ ifndef_ripper((yyval.val) = '>'); }
#line 7854 "ripper.c"
break;
case 153:
#line 2271 "ripper.y"
{ ifndef_ripper((yyval.val) = tGEQ); }
#line 7860 "ripper.c"
break;
case 154:
#line 2272 "ripper.y"
{ ifndef_ripper((yyval.val) = '<'); }
#line 7866 "ripper.c"
break;
case 155:
#line 2273 "ripper.y"
{ ifndef_ripper((yyval.val) = tLEQ); }
#line 7872 "ripper.c"
break;
case 156:
#line 2274 "ripper.y"
{ ifndef_ripper((yyval.val) = tNEQ); }
#line 7878 "ripper.c"
break;
case 157:
#line 2275 "ripper.y"
{ ifndef_ripper((yyval.val) = tLSHFT); }
#line 7884 "ripper.c"
break;
case 158:
#line 2276 "ripper.y"
{ ifndef_ripper((yyval.val) = tRSHFT); }
#line 7890 "ripper.c"
break;
case 159:
#line 2277 "ripper.y"
{ ifndef_ripper((yyval.val) = '+'); }
#line 7896 "ripper.c"
break;
case 160:
#line 2278 "ripper.y"
{ ifndef_ripper((yyval.val) = '-'); }
#line 7902 "ripper.c"
break;
case 161:
#line 2279 "ripper.y"
{ ifndef_ripper((yyval.val) = '*'); }
#line 7908 "ripper.c"
break;
case 162:
#line 2280 "ripper.y"
{ ifndef_ripper((yyval.val) = '*'); }
#line 7914 "ripper.c"
break;
case 163:
#line 2281 "ripper.y"
{ ifndef_ripper((yyval.val) = '/'); }
#line 7920 "ripper.c"
break;
case 164:
#line 2282 "ripper.y"
{ ifndef_ripper((yyval.val) = '%'); }
#line 7926 "ripper.c"
break;
case 165:
#line 2283 "ripper.y"
{ ifndef_ripper((yyval.val) = tPOW); }
#line 7932 "ripper.c"
break;
case 166:
#line 2284 "ripper.y"
{ ifndef_ripper((yyval.val) = tDSTAR); }
#line 7938 "ripper.c"
break;
case 167:
#line 2285 "ripper.y"
{ ifndef_ripper((yyval.val) = '!'); }
#line 7944 "ripper.c"
break;
case 168:
#line 2286 "ripper.y"
{ ifndef_ripper((yyval.val) = '~'); }
#line 7950 "ripper.c"
break;
case 169:
#line 2287 "ripper.y"
{ ifndef_ripper((yyval.val) = tUPLUS); }
#line 7956 "ripper.c"
break;
case 170:
#line 2288 "ripper.y"
{ ifndef_ripper((yyval.val) = tUMINUS); }
#line 7962 "ripper.c"
break;
case 171:
#line 2289 "ripper.y"
{ ifndef_ripper((yyval.val) = tAREF); }
#line 7968 "ripper.c"
break;
case 172:
#line 2290 "ripper.y"
{ ifndef_ripper((yyval.val) = tASET); }
#line 7974 "ripper.c"
break;
case 173:
#line 2291 "ripper.y"
{ ifndef_ripper((yyval.val) = '`'); }
#line 7980 "ripper.c"
break;
case 215:
#line 2309 "ripper.y"
{
#if 0
(yyval.val) = node_assign(p, (yyvsp[-3].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[0].val);v3=dispatch2(assign,v1,v2);(yyval.val)=v3;}
}
#line 7991 "ripper.c"
break;
case 216:
#line 2316 "ripper.y"
{
#if 0
(yyval.val) = new_op_assign(p, (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-3].val);v2=(yyvsp[-2].val);v3=(yyvsp[0].val);v4=dispatch3(opassign,v1,v2,v3);(yyval.val)=v4;}
}
#line 8002 "ripper.c"
break;
case 217:
#line 2323 "ripper.y"
{
#if 0
(yyval.val) = new_ary_op_assign(p, (yyvsp[-6].val), (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-4]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-6].val);v2=escape_Qundef((yyvsp[-4].val));v3=dispatch2(aref_field,v1,v2);v4=v3;v5=(yyvsp[-2].val);v6=(yyvsp[0].val);v7=dispatch3(opassign,v4,v5,v6);(yyval.val)=v7;}
}
#line 8013 "ripper.c"
break;
case 218:
#line 2330 "ripper.y"
{
#if 0
(yyval.val) = new_attr_op_assign(p, (yyvsp[-5].val), (yyvsp[-4].val), (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-5].val);v2=(yyvsp[-4].val);v3=(yyvsp[-3].val);v4=dispatch3(field,v1,v2,v3);v5=v4;v6=(yyvsp[-2].val);v7=(yyvsp[0].val);v8=dispatch3(opassign,v5,v6,v7);(yyval.val)=v8;}
}
#line 8024 "ripper.c"
break;
case 219:
#line 2337 "ripper.y"
{
#if 0
(yyval.val) = new_attr_op_assign(p, (yyvsp[-5].val), (yyvsp[-4].val), (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-5].val);v2=(yyvsp[-4].val);v3=(yyvsp[-3].val);v4=dispatch3(field,v1,v2,v3);v5=v4;v6=(yyvsp[-2].val);v7=(yyvsp[0].val);v8=dispatch3(opassign,v5,v6,v7);(yyval.val)=v8;}
}
#line 8035 "ripper.c"
break;
case 220:
#line 2344 "ripper.y"
{
#if 0
(yyval.val) = new_attr_op_assign(p, (yyvsp[-5].val), ID2VAL(idCOLON2), (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-5].val);v2=ID2VAL(idCOLON2);v3=(yyvsp[-3].val);v4=dispatch3(field,v1,v2,v3);v5=v4;v6=(yyvsp[-2].val);v7=(yyvsp[0].val);v8=dispatch3(opassign,v5,v6,v7);(yyval.val)=v8;}
}
#line 8046 "ripper.c"
break;
case 221:
#line 2351 "ripper.y"
{
#if 0
YYLTYPE loc = code_loc_gen(&(yylsp[-5]), &(yylsp[-3]));
(yyval.val) = new_const_op_assign(p, NEW_COLON2((yyvsp[-5].val), (yyvsp[-3].val), &loc), (yyvsp[-2].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-5].val);v2=(yyvsp[-3].val);v3=dispatch2(const_path_field,v1,v2);v4=v3;v5=(yyvsp[-2].val);v6=(yyvsp[0].val);v7=dispatch3(opassign,v4,v5,v6);(yyval.val)=v7;}
}
#line 8058 "ripper.c"
break;
case 222:
#line 2359 "ripper.y"
{
#if 0
(yyval.val) = new_const_op_assign(p, NEW_COLON3((yyvsp[-3].val), &(yyloc)), (yyvsp[-2].val), (yyvsp[0].val), (yyvsp[-1].ctxt), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=(yyvsp[-3].val);v2=dispatch1(top_const_field,v1);v3=v2;v4=(yyvsp[-2].val);v5=(yyvsp[0].val);v6=dispatch3(opassign,v3,v4,v5);(yyval.val)=v6;}
}
#line 8069 "ripper.c"
break;
case 223:
#line 2366 "ripper.y"
{
#if 0
rb_backref_error(p, (yyvsp[-3].val));
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=var_field(p, (yyvsp[-3].val));v2=(yyvsp[-2].val);v3=(yyvsp[0].val);v4=dispatch3(opassign,v1,v2,v3);(yyval.val)=backref_error(p, RNODE((yyvsp[-3].val)), v4);}ripper_error(p);
}
#line 8081 "ripper.c"
break;
case 224:
#line 2374 "ripper.y"
{
#if 0
value_expr((yyvsp[-2].val));
value_expr((yyvsp[0].val));
(yyval.val) = NEW_DOT2((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(dot2,v1,v2);(yyval.val)=v3;}
}
#line 8094 "ripper.c"
break;
case 225:
#line 2383 "ripper.y"
{
#if 0
value_expr((yyvsp[-2].val));
value_expr((yyvsp[0].val));
(yyval.val) = NEW_DOT3((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(dot3,v1,v2);(yyval.val)=v3;}
}
#line 8107 "ripper.c"
break;
case 226:
#line 2392 "ripper.y"
{
#if 0
value_expr((yyvsp[-1].val));
(yyval.val) = NEW_DOT2((yyvsp[-1].val), new_nil_at(p, &(yylsp[0]).end_pos), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=Qnil;v3=dispatch2(dot2,v1,v2);(yyval.val)=v3;}
}
#line 8119 "ripper.c"
break;
case 227:
#line 2400 "ripper.y"
{
#if 0
value_expr((yyvsp[-1].val));
(yyval.val) = NEW_DOT3((yyvsp[-1].val), new_nil_at(p, &(yylsp[0]).end_pos), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=Qnil;v3=dispatch2(dot3,v1,v2);(yyval.val)=v3;}
}
#line 8131 "ripper.c"
break;
case 228:
#line 2408 "ripper.y"
{
#if 0
value_expr((yyvsp[0].val));
(yyval.val) = NEW_DOT2(new_nil_at(p, &(yylsp[-1]).beg_pos), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=Qnil;v2=(yyvsp[0].val);v3=dispatch2(dot2,v1,v2);(yyval.val)=v3;}
}
#line 8143 "ripper.c"
break;
case 229:
#line 2416 "ripper.y"
{
#if 0
value_expr((yyvsp[0].val));
(yyval.val) = NEW_DOT3(new_nil_at(p, &(yylsp[-1]).beg_pos), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=Qnil;v2=(yyvsp[0].val);v3=dispatch2(dot3,v1,v2);(yyval.val)=v3;}
}
#line 8155 "ripper.c"
break;
case 230:
#line 2424 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), '+', (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8163 "ripper.c"
break;
case 231:
#line 2428 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), '-', (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8171 "ripper.c"
break;
case 232:
#line 2432 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), '*', (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8179 "ripper.c"
break;
case 233:
#line 2436 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), '/', (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8187 "ripper.c"
break;
case 234:
#line 2440 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), '%', (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8195 "ripper.c"
break;
case 235:
#line 2444 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), idPow, (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8203 "ripper.c"
break;
case 236:
#line 2448 "ripper.y"
{
(yyval.val) = call_uni_op(p, call_bin_op(p, (yyvsp[-2].val), idPow, (yyvsp[0].val), &(yylsp[-2]), &(yyloc)), idUMinus, &(yylsp[-3]), &(yyloc));
}
#line 8211 "ripper.c"
break;
case 237:
#line 2452 "ripper.y"
{
(yyval.val) = call_uni_op(p, (yyvsp[0].val), idUPlus, &(yylsp[-1]), &(yyloc));
}
#line 8219 "ripper.c"
break;
case 238:
#line 2456 "ripper.y"
{
(yyval.val) = call_uni_op(p, (yyvsp[0].val), idUMinus, &(yylsp[-1]), &(yyloc));
}
#line 8227 "ripper.c"
break;
case 239:
#line 2460 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), '|', (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8235 "ripper.c"
break;
case 240:
#line 2464 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), '^', (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8243 "ripper.c"
break;
case 241:
#line 2468 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), '&', (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8251 "ripper.c"
break;
case 242:
#line 2472 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), idCmp, (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8259 "ripper.c"
break;
case 244:
#line 2477 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), idEq, (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8267 "ripper.c"
break;
case 245:
#line 2481 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), idEqq, (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8275 "ripper.c"
break;
case 246:
#line 2485 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), idNeq, (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8283 "ripper.c"
break;
case 247:
#line 2489 "ripper.y"
{
(yyval.val) = match_op(p, (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8291 "ripper.c"
break;
case 248:
#line 2493 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), idNeqTilde, (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8299 "ripper.c"
break;
case 249:
#line 2497 "ripper.y"
{
(yyval.val) = call_uni_op(p, method_cond(p, (yyvsp[0].val), &(yylsp[0])), '!', &(yylsp[-1]), &(yyloc));
}
#line 8307 "ripper.c"
break;
case 250:
#line 2501 "ripper.y"
{
(yyval.val) = call_uni_op(p, (yyvsp[0].val), '~', &(yylsp[-1]), &(yyloc));
}
#line 8315 "ripper.c"
break;
case 251:
#line 2505 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), idLTLT, (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8323 "ripper.c"
break;
case 252:
#line 2509 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), idGTGT, (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8331 "ripper.c"
break;
case 253:
#line 2513 "ripper.y"
{
(yyval.val) = logop(p, idANDOP, (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8339 "ripper.c"
break;
case 254:
#line 2517 "ripper.y"
{
(yyval.val) = logop(p, idOROP, (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8347 "ripper.c"
break;
case 255:
#line 2520 "ripper.y"
{p->ctxt.in_defined = 1;}
#line 8353 "ripper.c"
break;
case 256:
#line 2521 "ripper.y"
{
p->ctxt.in_defined = 0;
(yyval.val) = new_defined(p, (yyvsp[0].val), &(yyloc));
}
#line 8362 "ripper.c"
break;
case 257:
#line 2526 "ripper.y"
{
#if 0
value_expr((yyvsp[-5].val));
(yyval.val) = new_if(p, (yyvsp[-5].val), (yyvsp[-3].val), (yyvsp[0].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-5].val));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-5].val);v2=(yyvsp[-3].val);v3=(yyvsp[0].val);v4=dispatch3(ifop,v1,v2,v3);(yyval.val)=v4;}
}
#line 8375 "ripper.c"
break;
case 258:
#line 2535 "ripper.y"
{
endless_method_name(p, (yyvsp[-3].node), &(yylsp[-3]));
restore_defun(p, (yyvsp[-3].node)->nd_defn);
#if 0
(yyval.val) = set_defun_body(p, (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=get_value((yyvsp[-3].val));v2=(yyvsp[-2].val);v3=(yyvsp[0].val);v4=dispatch3(def,v1,v2,v3);(yyval.val)=v4;}
local_pop(p);
}
#line 8389 "ripper.c"
break;
case 259:
#line 2545 "ripper.y"
{
endless_method_name(p, (yyvsp[-5].node), &(yylsp[-5]));
restore_defun(p, (yyvsp[-5].node)->nd_defn);
#if 0
(yyvsp[-2].val) = rescued_expr(p, (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-2]), &(yylsp[-1]), &(yylsp[0]));
(yyval.val) = set_defun_body(p, (yyvsp[-5].val), (yyvsp[-4].val), (yyvsp[-2].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(rescue_mod,v1,v2);v4=get_value((yyvsp[-5].val));v5=(yyvsp[-4].val);v6=v3;v7=dispatch3(def,v4,v5,v6);(yyval.val)=v7;}
local_pop(p);
}
#line 8404 "ripper.c"
break;
case 260:
#line 2556 "ripper.y"
{
endless_method_name(p, (yyvsp[-3].node), &(yylsp[-3]));
restore_defun(p, (yyvsp[-3].node)->nd_defn);
#if 0
(yyval.val) = set_defun_body(p, (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
(yyvsp[-3].val) = get_value((yyvsp[-3].val));
{VALUE v1,v2,v3,v4,v5,v6;v1=AREF((yyvsp[-3].val), 0);v2=AREF((yyvsp[-3].val), 1);v3=AREF((yyvsp[-3].val), 2);v4=(yyvsp[-2].val);v5=(yyvsp[0].val);v6=dispatch5(defs,v1,v2,v3,v4,v5);(yyval.val)=v6;}
local_pop(p);
}
#line 8420 "ripper.c"
break;
case 261:
#line 2568 "ripper.y"
{
endless_method_name(p, (yyvsp[-5].node), &(yylsp[-5]));
restore_defun(p, (yyvsp[-5].node)->nd_defn);
#if 0
(yyvsp[-2].val) = rescued_expr(p, (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-2]), &(yylsp[-1]), &(yylsp[0]));
(yyval.val) = set_defun_body(p, (yyvsp[-5].val), (yyvsp[-4].val), (yyvsp[-2].val), &(yyloc));
#endif
(yyvsp[-5].val) = get_value((yyvsp[-5].val));
{VALUE v1,v2,v3,v4,v5,v6,v7,v8,v9;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(rescue_mod,v1,v2);v4=AREF((yyvsp[-5].val), 0);v5=AREF((yyvsp[-5].val), 1);v6=AREF((yyvsp[-5].val), 2);v7=(yyvsp[-4].val);v8=v3;v9=dispatch5(defs,v4,v5,v6,v7,v8);(yyval.val)=v9;}
local_pop(p);
}
#line 8437 "ripper.c"
break;
case 262:
#line 2581 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 8445 "ripper.c"
break;
case 263:
#line 2586 "ripper.y"
{(yyval.val) = '>';}
#line 8451 "ripper.c"
break;
case 264:
#line 2587 "ripper.y"
{(yyval.val) = '<';}
#line 8457 "ripper.c"
break;
case 265:
#line 2588 "ripper.y"
{(yyval.val) = idGE;}
#line 8463 "ripper.c"
break;
case 266:
#line 2589 "ripper.y"
{(yyval.val) = idLE;}
#line 8469 "ripper.c"
break;
case 267:
#line 2593 "ripper.y"
{
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8477 "ripper.c"
break;
case 268:
#line 2597 "ripper.y"
{
rb_warning1("comparison '%s' after comparison", WARN_ID((yyvsp[-1].val)));
(yyval.val) = call_bin_op(p, (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
}
#line 8486 "ripper.c"
break;
case 269:
#line 2604 "ripper.y"
{
(yyval.ctxt) = p->ctxt;
}
#line 8494 "ripper.c"
break;
case 270:
#line 2608 "ripper.y"
{
(yyval.ctxt) = p->ctxt;
}
#line 8502 "ripper.c"
break;
case 271:
#line 2614 "ripper.y"
{
value_expr((yyvsp[0].val));
(yyval.val) = (yyvsp[0].val);
}
#line 8511 "ripper.c"
break;
case 273:
#line 2622 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
}
#line 8519 "ripper.c"
break;
case 274:
#line 2626 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val) ? arg_append(p, (yyvsp[-3].val), new_hash(p, (yyvsp[-1].val), &(yylsp[-1])), &(yyloc)) : (yyvsp[-3].val);
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-1].val);v2=dispatch1(bare_assoc_hash,v1);v3=(yyvsp[-3].val);v4=v2;v5=dispatch2(args_add,v3,v4);(yyval.val)=v5;}
}
#line 8530 "ripper.c"
break;
case 275:
#line 2633 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val) ? NEW_LIST(new_hash(p, (yyvsp[-1].val), &(yylsp[-1])), &(yyloc)) : 0;
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=dispatch0(args_new);v2=(yyvsp[-1].val);v3=dispatch1(bare_assoc_hash,v2);v4=v1;v5=v3;v6=dispatch2(args_add,v4,v5);(yyval.val)=v6;}
}
#line 8541 "ripper.c"
break;
case 276:
#line 2642 "ripper.y"
{
value_expr((yyvsp[0].val));
(yyval.val) = (yyvsp[0].val);
}
#line 8550 "ripper.c"
break;
case 277:
#line 2647 "ripper.y"
{
#if 0
value_expr((yyvsp[-2].val));
(yyval.val) = rescued_expr(p, (yyvsp[-2].val), (yyvsp[0].val), &(yylsp[-2]), &(yylsp[-1]), &(yylsp[0]));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(rescue_mod,v1,v2);(yyval.val)=v3;}
}
#line 8562 "ripper.c"
break;
case 278:
#line 2657 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=escape_Qundef((yyvsp[-1].val));v2=dispatch1(arg_paren,v1);(yyval.val)=v2;}
}
#line 8573 "ripper.c"
break;
case 279:
#line 2664 "ripper.y"
{
if (!check_forwarding_args(p)) {
(yyval.val) = Qnone;
}
else {
#if 0
(yyval.val) = new_args_forward_call(p, (yyvsp[-3].val), &(yylsp[-1]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-3].val);v2=(yyvsp[-1].val);v3=dispatch2(args_add,v1,v2);v4=v3;v5=dispatch1(arg_paren,v4);(yyval.val)=v5;}
}
}
#line 8589 "ripper.c"
break;
case 280:
#line 2676 "ripper.y"
{
if (!check_forwarding_args(p)) {
(yyval.val) = Qnone;
}
else {
#if 0
(yyval.val) = new_args_forward_call(p, 0, &(yylsp[-1]), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(arg_paren,v1);(yyval.val)=v2;}
}
}
#line 8605 "ripper.c"
break;
case 285:
#line 2696 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
}
#line 8613 "ripper.c"
break;
case 286:
#line 2700 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val) ? arg_append(p, (yyvsp[-3].val), new_hash(p, (yyvsp[-1].val), &(yylsp[-1])), &(yyloc)) : (yyvsp[-3].val);
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-1].val);v2=dispatch1(bare_assoc_hash,v1);v3=(yyvsp[-3].val);v4=v2;v5=dispatch2(args_add,v3,v4);(yyval.val)=v5;}
}
#line 8624 "ripper.c"
break;
case 287:
#line 2707 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val) ? NEW_LIST(new_hash(p, (yyvsp[-1].val), &(yylsp[-1])), &(yylsp[-1])) : 0;
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=dispatch0(args_new);v2=(yyvsp[-1].val);v3=dispatch1(bare_assoc_hash,v2);v4=v1;v5=v3;v6=dispatch2(args_add,v4,v5);(yyval.val)=v6;}
}
#line 8635 "ripper.c"
break;
case 288:
#line 2716 "ripper.y"
{
#if 0
value_expr((yyvsp[0].val));
(yyval.val) = NEW_LIST((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(args_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(args_add,v2,v3);(yyval.val)=v4;}
}
#line 8647 "ripper.c"
break;
case 289:
#line 2724 "ripper.y"
{
#if 0
(yyval.val) = arg_blk_pass((yyvsp[-1].val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(args_add_block,v1,v2);(yyval.val)=v3;}
}
#line 8658 "ripper.c"
break;
case 290:
#line 2731 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val) ? NEW_LIST(new_hash(p, (yyvsp[-1].val), &(yylsp[-1])), &(yylsp[-1])) : 0;
(yyval.val) = arg_blk_pass((yyval.val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8,v9;v1=dispatch0(args_new);v2=(yyvsp[-1].val);v3=dispatch1(bare_assoc_hash,v2);v4=v1;v5=v3;v6=dispatch2(args_add,v4,v5);v7=v6;v8=(yyvsp[0].val);v9=dispatch2(args_add_block,v7,v8);(yyval.val)=v9;}
}
#line 8670 "ripper.c"
break;
case 291:
#line 2739 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val) ? arg_append(p, (yyvsp[-3].val), new_hash(p, (yyvsp[-1].val), &(yylsp[-1])), &(yyloc)) : (yyvsp[-3].val);
(yyval.val) = arg_blk_pass((yyval.val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-1].val);v2=dispatch1(bare_assoc_hash,v1);v3=(yyvsp[-3].val);v4=v2;v5=dispatch2(args_add,v3,v4);v6=v5;v7=(yyvsp[0].val);v8=dispatch2(args_add_block,v6,v7);(yyval.val)=v8;}
}
#line 8682 "ripper.c"
break;
case 292:
#line 2747 "ripper.y"
{{VALUE v1,v2,v3,v4;v1=dispatch0(args_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(args_add_block,v2,v3);(yyval.val)=v4;}}
#line 8688 "ripper.c"
break;
case 293:
#line 2750 "ripper.y"
{
/* If call_args starts with a open paren '(' or '[',
* look-ahead reading of the letters calls CMDARG_PUSH(0),
* but the push must be done after CMDARG_PUSH(1).
* So this code makes them consistent by first cancelling
* the premature CMDARG_PUSH(0), doing CMDARG_PUSH(1),
* and finally redoing CMDARG_PUSH(0).
*/
int lookahead = 0;
switch (yychar) {
case '(': case tLPAREN: case tLPAREN_ARG: case '[': case tLBRACK:
lookahead = 1;
}
if (lookahead) CMDARG_POP();
CMDARG_PUSH(1);
if (lookahead) CMDARG_PUSH(0);
}
#line 8710 "ripper.c"
break;
case 294:
#line 2768 "ripper.y"
{
/* call_args can be followed by tLBRACE_ARG (that does CMDARG_PUSH(0) in the lexer)
* but the push must be done after CMDARG_POP() in the parser.
* So this code does CMDARG_POP() to pop 0 pushed by tLBRACE_ARG,
* CMDARG_POP() to pop 1 pushed by command_args,
* and CMDARG_PUSH(0) to restore back the flag set by tLBRACE_ARG.
*/
int lookahead = 0;
switch (yychar) {
case tLBRACE_ARG:
lookahead = 1;
}
if (lookahead) CMDARG_POP();
CMDARG_POP();
if (lookahead) CMDARG_PUSH(0);
(yyval.val) = (yyvsp[0].val);
}
#line 8732 "ripper.c"
break;
case 295:
#line 2788 "ripper.y"
{
#if 0
(yyval.val) = NEW_BLOCK_PASS((yyvsp[0].val), &(yyloc));
#endif
(yyval.val)=(yyvsp[0].val);
}
#line 8743 "ripper.c"
break;
case 296:
#line 2797 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 8751 "ripper.c"
break;
case 297:
#line 2801 "ripper.y"
{
(yyval.val) = 0;
}
#line 8759 "ripper.c"
break;
case 298:
#line 2807 "ripper.y"
{
#if 0
(yyval.val) = NEW_LIST((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(args_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(args_add,v2,v3);(yyval.val)=v4;}
}
#line 8770 "ripper.c"
break;
case 299:
#line 2814 "ripper.y"
{
#if 0
(yyval.val) = NEW_SPLAT((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(args_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(args_add_star,v2,v3);(yyval.val)=v4;}
}
#line 8781 "ripper.c"
break;
case 300:
#line 2821 "ripper.y"
{
#if 0
(yyval.val) = last_arg_append(p, (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(args_add,v1,v2);(yyval.val)=v3;}
}
#line 8792 "ripper.c"
break;
case 301:
#line 2828 "ripper.y"
{
#if 0
(yyval.val) = rest_arg_append(p, (yyvsp[-3].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[0].val);v3=dispatch2(args_add_star,v1,v2);(yyval.val)=v3;}
}
#line 8803 "ripper.c"
break;
case 304:
#line 2841 "ripper.y"
{
#if 0
(yyval.val) = last_arg_append(p, (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-2].val);v2=dispatch1(mrhs_new_from_args,v1);v3=v2;v4=(yyvsp[0].val);v5=dispatch2(mrhs_add,v3,v4);(yyval.val)=v5;}
}
#line 8814 "ripper.c"
break;
case 305:
#line 2848 "ripper.y"
{
#if 0
(yyval.val) = rest_arg_append(p, (yyvsp[-3].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-3].val);v2=dispatch1(mrhs_new_from_args,v1);v3=v2;v4=(yyvsp[0].val);v5=dispatch2(mrhs_add_star,v3,v4);(yyval.val)=v5;}
}
#line 8825 "ripper.c"
break;
case 306:
#line 2855 "ripper.y"
{
#if 0
(yyval.val) = NEW_SPLAT((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(mrhs_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(mrhs_add_star,v2,v3);(yyval.val)=v4;}
}
#line 8836 "ripper.c"
break;
case 317:
#line 2874 "ripper.y"
{
#if 0
(yyval.val) = NEW_FCALL((yyvsp[0].val), 0, &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=(yyvsp[0].val);v2=dispatch1(fcall,v1);v3=dispatch0(args_new);v4=v2;v5=v3;v6=dispatch2(method_add_arg,v4,v5);(yyval.val)=v6;}
}
#line 8847 "ripper.c"
break;
case 318:
#line 2881 "ripper.y"
{
CMDARG_PUSH(0);
}
#line 8855 "ripper.c"
break;
case 319:
#line 2886 "ripper.y"
{
CMDARG_POP();
#if 0
set_line_body((yyvsp[-1].val), (yylsp[-3]).end_pos.lineno);
(yyval.val) = NEW_BEGIN((yyvsp[-1].val), &(yyloc));
nd_set_line((yyval.val), (yylsp[-3]).end_pos.lineno);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(begin,v1);(yyval.val)=v2;}
}
#line 8869 "ripper.c"
break;
case 320:
#line 2895 "ripper.y"
{SET_LEX_STATE(EXPR_ENDARG);}
#line 8875 "ripper.c"
break;
case 321:
#line 2896 "ripper.y"
{
#if 0
(yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2;v1=0;v2=dispatch1(paren,v1);(yyval.val)=v2;}
}
#line 8886 "ripper.c"
break;
case 322:
#line 2902 "ripper.y"
{SET_LEX_STATE(EXPR_ENDARG);}
#line 8892 "ripper.c"
break;
case 323:
#line 2903 "ripper.y"
{
#if 0
if (nd_type((yyvsp[-2].val)) == NODE_SELF) (yyvsp[-2].val)->nd_state = 0;
(yyval.val) = (yyvsp[-2].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-2].val);v2=dispatch1(paren,v1);(yyval.val)=v2;}
}
#line 8904 "ripper.c"
break;
case 324:
#line 2911 "ripper.y"
{
#if 0
if (nd_type((yyvsp[-1].val)) == NODE_SELF) (yyvsp[-1].val)->nd_state = 0;
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(paren,v1);(yyval.val)=v2;}
}
#line 8916 "ripper.c"
break;
case 325:
#line 2919 "ripper.y"
{
#if 0
(yyval.val) = NEW_COLON2((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(const_path_ref,v1,v2);(yyval.val)=v3;}
}
#line 8927 "ripper.c"
break;
case 326:
#line 2926 "ripper.y"
{
#if 0
(yyval.val) = NEW_COLON3((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(top_const_ref,v1);(yyval.val)=v2;}
}
#line 8938 "ripper.c"
break;
case 327:
#line 2933 "ripper.y"
{
#if 0
(yyval.val) = make_list((yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2;v1=escape_Qundef((yyvsp[-1].val));v2=dispatch1(array,v1);(yyval.val)=v2;}
}
#line 8949 "ripper.c"
break;
case 328:
#line 2940 "ripper.y"
{
#if 0
(yyval.val) = new_hash(p, (yyvsp[-1].val), &(yyloc));
(yyval.val)->nd_brace = TRUE;
#endif
{VALUE v1,v2;v1=escape_Qundef((yyvsp[-1].val));v2=dispatch1(hash,v1);(yyval.val)=v2;}
}
#line 8961 "ripper.c"
break;
case 329:
#line 2948 "ripper.y"
{
#if 0
(yyval.val) = NEW_RETURN(0, &(yyloc));
#endif
{VALUE v1;v1=dispatch0(return0);(yyval.val)=v1;}
}
#line 8972 "ripper.c"
break;
case 330:
#line 2955 "ripper.y"
{
#if 0
(yyval.val) = new_yield(p, (yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-1].val);v2=dispatch1(paren,v1);v3=v2;v4=dispatch1(yield,v3);(yyval.val)=v4;}
}
#line 8983 "ripper.c"
break;
case 331:
#line 2962 "ripper.y"
{
#if 0
(yyval.val) = NEW_YIELD(0, &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5;v1=dispatch0(args_new);v2=v1;v3=dispatch1(paren,v2);v4=v3;v5=dispatch1(yield,v4);(yyval.val)=v5;}
}
#line 8994 "ripper.c"
break;
case 332:
#line 2969 "ripper.y"
{
#if 0
(yyval.val) = NEW_YIELD(0, &(yyloc));
#endif
{VALUE v1;v1=dispatch0(yield0);(yyval.val)=v1;}
}
#line 9005 "ripper.c"
break;
case 333:
#line 2975 "ripper.y"
{p->ctxt.in_defined = 1;}
#line 9011 "ripper.c"
break;
case 334:
#line 2976 "ripper.y"
{
p->ctxt.in_defined = 0;
(yyval.val) = new_defined(p, (yyvsp[-1].val), &(yyloc));
}
#line 9020 "ripper.c"
break;
case 335:
#line 2981 "ripper.y"
{
(yyval.val) = call_uni_op(p, method_cond(p, (yyvsp[-1].val), &(yylsp[-1])), METHOD_NOT, &(yylsp[-3]), &(yyloc));
}
#line 9028 "ripper.c"
break;
case 336:
#line 2985 "ripper.y"
{
(yyval.val) = call_uni_op(p, method_cond(p, new_nil(&(yylsp[-1])), &(yylsp[-1])), METHOD_NOT, &(yylsp[-2]), &(yyloc));
}
#line 9036 "ripper.c"
break;
case 337:
#line 2989 "ripper.y"
{
#if 0
(yyval.val) = method_add_block(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8,v9;v1=(yyvsp[-1].val);v2=dispatch1(fcall,v1);v3=dispatch0(args_new);v4=v2;v5=v3;v6=dispatch2(method_add_arg,v4,v5);v7=v6;v8=(yyvsp[0].val);v9=dispatch2(method_add_block,v7,v8);(yyval.val)=v9;}
}
#line 9047 "ripper.c"
break;
case 339:
#line 2997 "ripper.y"
{
#if 0
block_dup_check(p, (yyvsp[-1].val)->nd_args, (yyvsp[0].val));
(yyval.val) = method_add_block(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(method_add_block,v1,v2);(yyval.val)=v3;}
}
#line 9059 "ripper.c"
break;
case 341:
#line 3009 "ripper.y"
{
#if 0
(yyval.val) = new_if(p, (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[-1].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-4].val));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-4].val);v2=(yyvsp[-2].val);v3=escape_Qundef((yyvsp[-1].val));v4=dispatch3(if,v1,v2,v3);(yyval.val)=v4;}
}
#line 9071 "ripper.c"
break;
case 342:
#line 3020 "ripper.y"
{
#if 0
(yyval.val) = new_unless(p, (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[-1].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-4].val));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-4].val);v2=(yyvsp[-2].val);v3=escape_Qundef((yyvsp[-1].val));v4=dispatch3(unless,v1,v2,v3);(yyval.val)=v4;}
}
#line 9083 "ripper.c"
break;
case 343:
#line 3030 "ripper.y"
{
#if 0
(yyval.val) = NEW_WHILE(cond(p, (yyvsp[-2].val), &(yylsp[-2])), (yyvsp[-1].val), 1, &(yyloc));
fixpos((yyval.val), (yyvsp[-2].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=dispatch2(while,v1,v2);(yyval.val)=v3;}
}
#line 9095 "ripper.c"
break;
case 344:
#line 3040 "ripper.y"
{
#if 0
(yyval.val) = NEW_UNTIL(cond(p, (yyvsp[-2].val), &(yylsp[-2])), (yyvsp[-1].val), 1, &(yyloc));
fixpos((yyval.val), (yyvsp[-2].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=dispatch2(until,v1,v2);(yyval.val)=v3;}
}
#line 9107 "ripper.c"
break;
case 345:
#line 3048 "ripper.y"
{
(yyval.val) = p->case_labels;
p->case_labels = Qnil;
}
#line 9116 "ripper.c"
break;
case 346:
#line 3054 "ripper.y"
{
if (RTEST(p->case_labels)) rb_hash_clear(p->case_labels);
p->case_labels = (yyvsp[-2].val);
#if 0
(yyval.val) = NEW_CASE((yyvsp[-4].val), (yyvsp[-1].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-4].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-4].val);v2=(yyvsp[-1].val);v3=dispatch2(case,v1,v2);(yyval.val)=v3;}
}
#line 9130 "ripper.c"
break;
case 347:
#line 3064 "ripper.y"
{
(yyval.val) = p->case_labels;
p->case_labels = 0;
}
#line 9139 "ripper.c"
break;
case 348:
#line 3070 "ripper.y"
{
if (RTEST(p->case_labels)) rb_hash_clear(p->case_labels);
p->case_labels = (yyvsp[-2].val);
#if 0
(yyval.val) = NEW_CASE2((yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=Qnil;v2=(yyvsp[-1].val);v3=dispatch2(case,v1,v2);(yyval.val)=v3;}
}
#line 9152 "ripper.c"
break;
case 349:
#line 3081 "ripper.y"
{
#if 0
(yyval.val) = NEW_CASE3((yyvsp[-3].val), (yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[-1].val);v3=dispatch2(case,v1,v2);(yyval.val)=v3;}
}
#line 9163 "ripper.c"
break;
case 350:
#line 3090 "ripper.y"
{
#if 0
/*
* for a, b, c in e
* #=>
* e.each{|*x| a, b, c = x}
*
* for a in e
* #=>
* e.each{|x| a, = x}
*/
ID id = internal_id(p);
NODE *m = NEW_ARGS_AUX(0, 0, &NULL_LOC);
NODE *args, *scope, *internal_var = NEW_DVAR(id, &(yylsp[-4]));
ID *tbl = ALLOC_N(ID, 3);
tbl[0] = 1 /* length of local var table */; tbl[1] = id /* internal id */;
rb_ast_add_local_table(p->ast, tbl);
switch (nd_type((yyvsp[-4].val))) {
case NODE_LASGN:
case NODE_DASGN:
case NODE_DASGN_CURR: /* e.each {|internal_var| a = internal_var; ... } */
(yyvsp[-4].val)->nd_value = internal_var;
id = 0;
m->nd_plen = 1;
m->nd_next = (yyvsp[-4].val);
break;
case NODE_MASGN: /* e.each {|*internal_var| a, b, c = (internal_var.length == 1 && Array === (tmp = internal_var[0]) ? tmp : internal_var); ... } */
m->nd_next = node_assign(p, (yyvsp[-4].val), NEW_FOR_MASGN(internal_var, &(yylsp[-4])), NO_LEX_CTXT, &(yylsp[-4]));
break;
default: /* e.each {|*internal_var| @a, B, c[1], d.attr = internal_val; ... } */
m->nd_next = node_assign(p, NEW_MASGN(NEW_LIST((yyvsp[-4].val), &(yylsp[-4])), 0, &(yylsp[-4])), internal_var, NO_LEX_CTXT, &(yylsp[-4]));
}
/* {|*internal_id| <m> = internal_id; ... } */
args = new_args(p, m, 0, id, 0, new_args_tail(p, 0, 0, 0, &(yylsp[-4])), &(yylsp[-4]));
scope = NEW_NODE(NODE_SCOPE, tbl, (yyvsp[-1].val), args, &(yyloc));
(yyval.val) = NEW_FOR((yyvsp[-2].val), scope, &(yyloc));
fixpos((yyval.val), (yyvsp[-4].val));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-4].val);v2=(yyvsp[-2].val);v3=(yyvsp[-1].val);v4=dispatch3(for,v1,v2,v3);(yyval.val)=v4;}
}
#line 9209 "ripper.c"
break;
case 351:
#line 3132 "ripper.y"
{
if (p->ctxt.in_def) {
YYLTYPE loc = code_loc_gen(&(yylsp[-2]), &(yylsp[-1]));
yyerror1(&loc, "class definition in method body");
}
p->ctxt.in_class = 1;
local_push(p, 0);
}
#line 9222 "ripper.c"
break;
case 352:
#line 3142 "ripper.y"
{
#if 0
(yyval.val) = NEW_CLASS((yyvsp[-4].val), (yyvsp[-1].val), (yyvsp[-3].val), &(yyloc));
nd_set_line((yyval.val)->nd_body, (yylsp[0]).end_pos.lineno);
set_line_body((yyvsp[-1].val), (yylsp[-3]).end_pos.lineno);
nd_set_line((yyval.val), (yylsp[-3]).end_pos.lineno);
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-4].val);v2=(yyvsp[-3].val);v3=(yyvsp[-1].val);v4=dispatch3(class,v1,v2,v3);(yyval.val)=v4;}
local_pop(p);
p->ctxt.in_class = (yyvsp[-5].ctxt).in_class;
p->ctxt.shareable_constant_value = (yyvsp[-5].ctxt).shareable_constant_value;
}
#line 9239 "ripper.c"
break;
case 353:
#line 3155 "ripper.y"
{
p->ctxt.in_def = 0;
p->ctxt.in_class = 0;
local_push(p, 0);
}
#line 9249 "ripper.c"
break;
case 354:
#line 3163 "ripper.y"
{
#if 0
(yyval.val) = NEW_SCLASS((yyvsp[-4].val), (yyvsp[-1].val), &(yyloc));
nd_set_line((yyval.val)->nd_body, (yylsp[0]).end_pos.lineno);
set_line_body((yyvsp[-1].val), nd_line((yyvsp[-4].val)));
fixpos((yyval.val), (yyvsp[-4].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-4].val);v2=(yyvsp[-1].val);v3=dispatch2(sclass,v1,v2);(yyval.val)=v3;}
local_pop(p);
p->ctxt.in_def = (yyvsp[-6].ctxt).in_def;
p->ctxt.in_class = (yyvsp[-6].ctxt).in_class;
p->ctxt.shareable_constant_value = (yyvsp[-6].ctxt).shareable_constant_value;
}
#line 9267 "ripper.c"
break;
case 355:
#line 3177 "ripper.y"
{
if (p->ctxt.in_def) {
YYLTYPE loc = code_loc_gen(&(yylsp[-1]), &(yylsp[0]));
yyerror1(&loc, "module definition in method body");
}
p->ctxt.in_class = 1;
local_push(p, 0);
}
#line 9280 "ripper.c"
break;
case 356:
#line 3187 "ripper.y"
{
#if 0
(yyval.val) = NEW_MODULE((yyvsp[-3].val), (yyvsp[-1].val), &(yyloc));
nd_set_line((yyval.val)->nd_body, (yylsp[0]).end_pos.lineno);
set_line_body((yyvsp[-1].val), (yylsp[-3]).end_pos.lineno);
nd_set_line((yyval.val), (yylsp[-3]).end_pos.lineno);
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[-1].val);v3=dispatch2(module,v1,v2);(yyval.val)=v3;}
local_pop(p);
p->ctxt.in_class = (yyvsp[-4].ctxt).in_class;
p->ctxt.shareable_constant_value = (yyvsp[-4].ctxt).shareable_constant_value;
}
#line 9297 "ripper.c"
break;
case 357:
#line 3203 "ripper.y"
{
restore_defun(p, (yyvsp[-3].node)->nd_defn);
#if 0
(yyval.val) = set_defun_body(p, (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=get_value((yyvsp[-3].val));v2=(yyvsp[-2].val);v3=(yyvsp[-1].val);v4=dispatch3(def,v1,v2,v3);(yyval.val)=v4;}
local_pop(p);
}
#line 9310 "ripper.c"
break;
case 358:
#line 3215 "ripper.y"
{
restore_defun(p, (yyvsp[-3].node)->nd_defn);
#if 0
(yyval.val) = set_defun_body(p, (yyvsp[-3].val), (yyvsp[-2].val), (yyvsp[-1].val), &(yyloc));
#endif
(yyvsp[-3].val) = get_value((yyvsp[-3].val));
{VALUE v1,v2,v3,v4,v5,v6;v1=AREF((yyvsp[-3].val), 0);v2=AREF((yyvsp[-3].val), 1);v3=AREF((yyvsp[-3].val), 2);v4=(yyvsp[-2].val);v5=(yyvsp[-1].val);v6=dispatch5(defs,v1,v2,v3,v4,v5);(yyval.val)=v6;}
local_pop(p);
}
#line 9325 "ripper.c"
break;
case 359:
#line 3226 "ripper.y"
{
#if 0
(yyval.val) = NEW_BREAK(0, &(yyloc));
#endif
{VALUE v1,v2,v3;v1=dispatch0(args_new);v2=v1;v3=dispatch1(break,v2);(yyval.val)=v3;}
}
#line 9336 "ripper.c"
break;
case 360:
#line 3233 "ripper.y"
{
#if 0
(yyval.val) = NEW_NEXT(0, &(yyloc));
#endif
{VALUE v1,v2,v3;v1=dispatch0(args_new);v2=v1;v3=dispatch1(next,v2);(yyval.val)=v3;}
}
#line 9347 "ripper.c"
break;
case 361:
#line 3240 "ripper.y"
{
#if 0
(yyval.val) = NEW_REDO(&(yyloc));
#endif
{VALUE v1;v1=dispatch0(redo);(yyval.val)=v1;}
}
#line 9358 "ripper.c"
break;
case 362:
#line 3247 "ripper.y"
{
#if 0
(yyval.val) = NEW_RETRY(&(yyloc));
#endif
{VALUE v1;v1=dispatch0(retry);(yyval.val)=v1;}
}
#line 9369 "ripper.c"
break;
case 363:
#line 3256 "ripper.y"
{
value_expr((yyvsp[0].val));
(yyval.val) = (yyvsp[0].val);
}
#line 9378 "ripper.c"
break;
case 364:
#line 3263 "ripper.y"
{
token_info_push(p, "begin", &(yyloc));
}
#line 9386 "ripper.c"
break;
case 365:
#line 3269 "ripper.y"
{
WARN_EOL("if");
token_info_push(p, "if", &(yyloc));
if (p->token_info && p->token_info->nonspc &&
p->token_info->next && !strcmp(p->token_info->next->token, "else")) {
const char *tok = p->lex.ptok;
const char *beg = p->lex.pbeg + p->token_info->next->beg.column;
beg += rb_strlen_lit("else");
while (beg < tok && ISSPACE(*beg)) beg++;
if (beg == tok) {
p->token_info->nonspc = 0;
}
}
}
#line 9405 "ripper.c"
break;
case 366:
#line 3286 "ripper.y"
{
token_info_push(p, "unless", &(yyloc));
}
#line 9413 "ripper.c"
break;
case 367:
#line 3292 "ripper.y"
{
token_info_push(p, "while", &(yyloc));
}
#line 9421 "ripper.c"
break;
case 368:
#line 3298 "ripper.y"
{
token_info_push(p, "until", &(yyloc));
}
#line 9429 "ripper.c"
break;
case 369:
#line 3304 "ripper.y"
{
token_info_push(p, "case", &(yyloc));
}
#line 9437 "ripper.c"
break;
case 370:
#line 3310 "ripper.y"
{
token_info_push(p, "for", &(yyloc));
}
#line 9445 "ripper.c"
break;
case 371:
#line 3316 "ripper.y"
{
token_info_push(p, "class", &(yyloc));
(yyval.ctxt) = p->ctxt;
}
#line 9454 "ripper.c"
break;
case 372:
#line 3323 "ripper.y"
{
token_info_push(p, "module", &(yyloc));
(yyval.ctxt) = p->ctxt;
}
#line 9463 "ripper.c"
break;
case 373:
#line 3330 "ripper.y"
{
token_info_push(p, "def", &(yyloc));
}
#line 9471 "ripper.c"
break;
case 374:
#line 3336 "ripper.y"
{
token_info_push(p, "do", &(yyloc));
}
#line 9479 "ripper.c"
break;
case 375:
#line 3342 "ripper.y"
{
token_info_push(p, "do", &(yyloc));
}
#line 9487 "ripper.c"
break;
case 376:
#line 3348 "ripper.y"
{
token_info_warn(p, "rescue", p->token_info, 1, &(yyloc));
}
#line 9495 "ripper.c"
break;
case 377:
#line 3354 "ripper.y"
{
token_info_warn(p, "ensure", p->token_info, 1, &(yyloc));
}
#line 9503 "ripper.c"
break;
case 378:
#line 3360 "ripper.y"
{
token_info_warn(p, "when", p->token_info, 0, &(yyloc));
}
#line 9511 "ripper.c"
break;
case 379:
#line 3366 "ripper.y"
{
token_info *ptinfo_beg = p->token_info;
int same = ptinfo_beg && strcmp(ptinfo_beg->token, "case") != 0;
token_info_warn(p, "else", p->token_info, same, &(yyloc));
if (same) {
token_info e;
e.next = ptinfo_beg->next;
e.token = "else";
token_info_setup(&e, p->lex.pbeg, &(yyloc));
if (!e.nonspc) *ptinfo_beg = e;
}
}
#line 9528 "ripper.c"
break;
case 380:
#line 3381 "ripper.y"
{
WARN_EOL("elsif");
token_info_warn(p, "elsif", p->token_info, 1, &(yyloc));
}
#line 9537 "ripper.c"
break;
case 381:
#line 3388 "ripper.y"
{
token_info_pop(p, "end", &(yyloc));
}
#line 9545 "ripper.c"
break;
case 382:
#line 3394 "ripper.y"
{
if (p->ctxt.in_class && !p->ctxt.in_def && !dyna_in_block(p))
yyerror1(&(yylsp[0]), "Invalid return in class/module body");
}
#line 9554 "ripper.c"
break;
case 389:
#line 3413 "ripper.y"
{
#if 0
(yyval.val) = new_if(p, (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-3].val));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-3].val);v2=(yyvsp[-1].val);v3=escape_Qundef((yyvsp[0].val));v4=dispatch3(elsif,v1,v2,v3);(yyval.val)=v4;}
}
#line 9566 "ripper.c"
break;
case 391:
#line 3424 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(else,v1);(yyval.val)=v2;}
}
#line 9577 "ripper.c"
break;
case 394:
#line 3437 "ripper.y"
{
#if 0
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
mark_lvar_used(p, (yyval.val));
#endif
(yyval.val)=assignable(p, (yyvsp[0].val));
}
#line 9589 "ripper.c"
break;
case 395:
#line 3445 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(mlhs_paren,v1);(yyval.val)=v2;}
}
#line 9600 "ripper.c"
break;
case 396:
#line 3454 "ripper.y"
{
#if 0
(yyval.val) = NEW_LIST((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(mlhs_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(mlhs_add,v2,v3);(yyval.val)=v4;}
}
#line 9611 "ripper.c"
break;
case 397:
#line 3461 "ripper.y"
{
#if 0
(yyval.val) = list_append(p, (yyvsp[-2].val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(mlhs_add,v1,v2);(yyval.val)=v3;}
}
#line 9622 "ripper.c"
break;
case 398:
#line 3470 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN((yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=(yyvsp[0].val);
}
#line 9633 "ripper.c"
break;
case 399:
#line 3477 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(mlhs_add_star,v1,v2);(yyval.val)=v3;}
}
#line 9644 "ripper.c"
break;
case 400:
#line 3484 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN((yyvsp[-4].val), NEW_POSTARG((yyvsp[-2].val), (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6;v1=(yyvsp[-4].val);v2=(yyvsp[-2].val);v3=dispatch2(mlhs_add_star,v1,v2);v4=v3;v5=(yyvsp[0].val);v6=dispatch2(mlhs_add_post,v4,v5);(yyval.val)=v6;}
}
#line 9655 "ripper.c"
break;
case 401:
#line 3491 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN(0, (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(mlhs_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(mlhs_add_star,v2,v3);(yyval.val)=v4;}
}
#line 9666 "ripper.c"
break;
case 402:
#line 3498 "ripper.y"
{
#if 0
(yyval.val) = NEW_MASGN(0, NEW_POSTARG((yyvsp[-2].val), (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=dispatch0(mlhs_new);v2=v1;v3=(yyvsp[-2].val);v4=dispatch2(mlhs_add_star,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=dispatch2(mlhs_add_post,v5,v6);(yyval.val)=v7;}
}
#line 9677 "ripper.c"
break;
case 403:
#line 3507 "ripper.y"
{
#if 0
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
mark_lvar_used(p, (yyval.val));
#endif
(yyval.val)=assignable(p, (yyvsp[0].val));
}
#line 9689 "ripper.c"
break;
case 404:
#line 3515 "ripper.y"
{
#if 0
(yyval.val) = NODE_SPECIAL_NO_NAME_REST;
#endif
(yyval.val)=Qnil;
}
#line 9700 "ripper.c"
break;
case 406:
#line 3524 "ripper.y"
{(yyval.val) = ID2VAL(idNil);}
#line 9706 "ripper.c"
break;
case 407:
#line 3528 "ripper.y"
{
(yyval.val) = new_args_tail(p, (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]));
}
#line 9714 "ripper.c"
break;
case 408:
#line 3532 "ripper.y"
{
(yyval.val) = new_args_tail(p, (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yylsp[-1]));
}
#line 9722 "ripper.c"
break;
case 409:
#line 3536 "ripper.y"
{
(yyval.val) = new_args_tail(p, Qnone, (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]));
}
#line 9730 "ripper.c"
break;
case 410:
#line 3540 "ripper.y"
{
(yyval.val) = new_args_tail(p, Qnone, Qnone, (yyvsp[0].val), &(yylsp[0]));
}
#line 9738 "ripper.c"
break;
case 411:
#line 3546 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 9746 "ripper.c"
break;
case 412:
#line 3550 "ripper.y"
{
(yyval.val) = new_args_tail(p, Qnone, Qnone, Qnone, &(yylsp[0]));
}
#line 9754 "ripper.c"
break;
case 413:
#line 3556 "ripper.y"
{
/* magic number for rest_id in iseq_set_arguments() */
#if 0
(yyval.val) = NODE_SPECIAL_EXCESSIVE_COMMA;
#endif
{VALUE v1;v1=dispatch0(excessed_comma);(yyval.val)=v1;}
}
#line 9766 "ripper.c"
break;
case 414:
#line 3566 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-5].val), (yyvsp[-3].val), (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yyloc));
}
#line 9774 "ripper.c"
break;
case 415:
#line 3570 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-7].val), (yyvsp[-5].val), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 9782 "ripper.c"
break;
case 416:
#line 3574 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-3].val), (yyvsp[-1].val), Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 9790 "ripper.c"
break;
case 417:
#line 3578 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-5].val), (yyvsp[-3].val), Qnone, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 9798 "ripper.c"
break;
case 418:
#line 3582 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-3].val), Qnone, (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yyloc));
}
#line 9806 "ripper.c"
break;
case 419:
#line 3586 "ripper.y"
{
(yyval.val) = new_args_tail(p, Qnone, Qnone, Qnone, &(yylsp[0]));
(yyval.val) = new_args(p, (yyvsp[-1].val), Qnone, (yyvsp[0].val), Qnone, (yyval.val), &(yyloc));
}
#line 9815 "ripper.c"
break;
case 420:
#line 3591 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-5].val), Qnone, (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 9823 "ripper.c"
break;
case 421:
#line 3595 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-1].val), Qnone, Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 9831 "ripper.c"
break;
case 422:
#line 3599 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, (yyvsp[-3].val), (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yyloc));
}
#line 9839 "ripper.c"
break;
case 423:
#line 3603 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, (yyvsp[-5].val), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 9847 "ripper.c"
break;
case 424:
#line 3607 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, (yyvsp[-1].val), Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 9855 "ripper.c"
break;
case 425:
#line 3611 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, (yyvsp[-3].val), Qnone, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 9863 "ripper.c"
break;
case 426:
#line 3615 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, Qnone, (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yyloc));
}
#line 9871 "ripper.c"
break;
case 427:
#line 3619 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, Qnone, (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 9879 "ripper.c"
break;
case 428:
#line 3623 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, Qnone, Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 9887 "ripper.c"
break;
case 430:
#line 3630 "ripper.y"
{
p->command_start = TRUE;
}
#line 9895 "ripper.c"
break;
case 431:
#line 3636 "ripper.y"
{
p->cur_arg = 0;
p->max_numparam = ORDINAL_PARAM;
#if 0
(yyval.val) = 0;
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11;v1=Qnil;v2=Qnil;v3=Qnil;v4=Qnil;v5=Qnil;v6=Qnil;v7=Qnil;v8=dispatch7(params,v1,v2,v3,v4,v5,v6,v7);v9=v8;v10=escape_Qundef((yyvsp[-1].val));v11=dispatch2(block_var,v9,v10);(yyval.val)=v11;}
}
#line 9908 "ripper.c"
break;
case 432:
#line 3645 "ripper.y"
{
p->cur_arg = 0;
p->max_numparam = ORDINAL_PARAM;
#if 0
(yyval.val) = (yyvsp[-2].val);
#endif
{VALUE v1,v2,v3;v1=escape_Qundef((yyvsp[-2].val));v2=escape_Qundef((yyvsp[-1].val));v3=dispatch2(block_var,v1,v2);(yyval.val)=v3;}
}
#line 9921 "ripper.c"
break;
case 433:
#line 3657 "ripper.y"
{
(yyval.val) = 0;
}
#line 9929 "ripper.c"
break;
case 434:
#line 3661 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
(yyval.val)=(yyvsp[-1].val);
}
#line 9940 "ripper.c"
break;
case 435:
#line 3670 "ripper.y"
{(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));}
#line 9946 "ripper.c"
break;
case 436:
#line 3672 "ripper.y"
{(yyval.val)=rb_ary_push((yyvsp[-2].val), get_value((yyvsp[0].val)));}
#line 9952 "ripper.c"
break;
case 437:
#line 3676 "ripper.y"
{
new_bv(p, get_id((yyvsp[0].val)));
(yyval.val)=get_value((yyvsp[0].val));
}
#line 9961 "ripper.c"
break;
case 438:
#line 3681 "ripper.y"
{
(yyval.val) = 0;
}
#line 9969 "ripper.c"
break;
case 439:
#line 3687 "ripper.y"
{
token_info_push(p, "->", &(yylsp[0]));
(yyvsp[0].vars) = dyna_push(p);
(yyval.num) = p->lex.lpar_beg;
p->lex.lpar_beg = p->lex.paren_nest;
}
#line 9980 "ripper.c"
break;
case 440:
#line 3693 "ripper.y"
{
(yyval.num) = p->max_numparam;
p->max_numparam = 0;
}
#line 9989 "ripper.c"
break;
case 441:
#line 3697 "ripper.y"
{
(yyval.node) = numparam_push(p);
}
#line 9997 "ripper.c"
break;
case 442:
#line 3701 "ripper.y"
{
CMDARG_PUSH(0);
}
#line 10005 "ripper.c"
break;
case 443:
#line 3705 "ripper.y"
{
int max_numparam = p->max_numparam;
p->lex.lpar_beg = (yyvsp[-5].num);
p->max_numparam = (yyvsp[-4].num);
CMDARG_POP();
(yyvsp[-2].val) = args_with_numbered(p, (yyvsp[-2].val), max_numparam);
#if 0
{
YYLTYPE loc = code_loc_gen(&(yylsp[-2]), &(yylsp[0]));
(yyval.val) = NEW_LAMBDA((yyvsp[-2].val), (yyvsp[0].val), &loc);
nd_set_line((yyval.val)->nd_body, (yylsp[0]).end_pos.lineno);
nd_set_line((yyval.val), (yylsp[-2]).end_pos.lineno);
nd_set_first_loc((yyval.val), (yylsp[-6]).beg_pos);
}
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(lambda,v1,v2);(yyval.val)=v3;}
numparam_pop(p, (yyvsp[-3].node));
dyna_pop(p, (yyvsp[-6].vars));
}
#line 10029 "ripper.c"
break;
case 444:
#line 3727 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-2].val);
p->max_numparam = ORDINAL_PARAM;
#endif
{VALUE v1,v2;v1=(yyvsp[-2].val);v2=dispatch1(paren,v1);(yyval.val)=v2;}
}
#line 10041 "ripper.c"
break;
case 445:
#line 3735 "ripper.y"
{
#if 0
if (!args_info_empty_p((yyvsp[0].val)->nd_ainfo))
p->max_numparam = ORDINAL_PARAM;
#endif
(yyval.val) = (yyvsp[0].val);
}
#line 10053 "ripper.c"
break;
case 446:
#line 3745 "ripper.y"
{
token_info_pop(p, "}", &(yylsp[0]));
(yyval.val) = (yyvsp[-1].val);
}
#line 10062 "ripper.c"
break;
case 447:
#line 3750 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
}
#line 10070 "ripper.c"
break;
case 448:
#line 3756 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
#if 0
(yyval.val)->nd_body->nd_loc = code_loc_gen(&(yylsp[-2]), &(yylsp[0]));
nd_set_line((yyval.val), (yylsp[-2]).end_pos.lineno);
#endif
}
#line 10082 "ripper.c"
break;
case 449:
#line 3766 "ripper.y"
{
#if 0
if (nd_type((yyvsp[-1].val)) == NODE_YIELD) {
compile_error(p, "block given to yield");
}
else {
block_dup_check(p, (yyvsp[-1].val)->nd_args, (yyvsp[0].val));
}
(yyval.val) = method_add_block(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-1].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(method_add_block,v1,v2);(yyval.val)=v3;}
}
#line 10100 "ripper.c"
break;
case 450:
#line 3780 "ripper.y"
{
#if 0
(yyval.val) = new_qcall(p, (yyvsp[-2].val), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-3].val);v2=(yyvsp[-2].val);v3=(yyvsp[-1].val);v4=dispatch3(call,v1,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=v6==Qundef ? v5 : dispatch2(method_add_arg,v5,v6);(yyval.val)=v7;}
}
#line 10111 "ripper.c"
break;
case 451:
#line 3787 "ripper.y"
{
#if 0
(yyval.val) = new_command_qcall(p, (yyvsp[-3].val), (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-2]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-4].val);v2=(yyvsp[-3].val);v3=(yyvsp[-2].val);v4=(yyvsp[-1].val);v5=dispatch4(command_call,v1,v2,v3,v4);v6=v5;v7=(yyvsp[0].val);v8=v7==Qundef ? v6 : dispatch2(method_add_block,v6,v7);(yyval.val)=v8;}
}
#line 10122 "ripper.c"
break;
case 452:
#line 3794 "ripper.y"
{
#if 0
(yyval.val) = new_command_qcall(p, (yyvsp[-3].val), (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-2]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8;v1=(yyvsp[-4].val);v2=(yyvsp[-3].val);v3=(yyvsp[-2].val);v4=(yyvsp[-1].val);v5=dispatch4(command_call,v1,v2,v3,v4);v6=v5;v7=(yyvsp[0].val);v8=dispatch2(method_add_block,v6,v7);(yyval.val)=v8;}
}
#line 10133 "ripper.c"
break;
case 453:
#line 3803 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val);
(yyval.val)->nd_args = (yyvsp[0].val);
nd_set_last_loc((yyvsp[-1].val), (yylsp[0]).end_pos);
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-1].val);v2=dispatch1(fcall,v1);v3=v2;v4=(yyvsp[0].val);v5=dispatch2(method_add_arg,v3,v4);(yyval.val)=v5;}
}
#line 10146 "ripper.c"
break;
case 454:
#line 3812 "ripper.y"
{
#if 0
(yyval.val) = new_qcall(p, (yyvsp[-2].val), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
nd_set_line((yyval.val), (yylsp[-1]).end_pos.lineno);
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-3].val);v2=(yyvsp[-2].val);v3=(yyvsp[-1].val);v4=dispatch3(call,v1,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=v6==Qundef ? v5 : dispatch2(method_add_arg,v5,v6);(yyval.val)=v7;}
}
#line 10158 "ripper.c"
break;
case 455:
#line 3820 "ripper.y"
{
#if 0
(yyval.val) = new_qcall(p, ID2VAL(idCOLON2), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
nd_set_line((yyval.val), (yylsp[-1]).end_pos.lineno);
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-3].val);v2=ID2VAL(idCOLON2);v3=(yyvsp[-1].val);v4=dispatch3(call,v1,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=dispatch2(method_add_arg,v5,v6);(yyval.val)=v7;}
}
#line 10170 "ripper.c"
break;
case 456:
#line 3828 "ripper.y"
{
#if 0
(yyval.val) = new_qcall(p, ID2VAL(idCOLON2), (yyvsp[-2].val), (yyvsp[0].val), Qnull, &(yylsp[0]), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-2].val);v2=ID2VAL(idCOLON2);v3=(yyvsp[0].val);v4=dispatch3(call,v1,v2,v3);(yyval.val)=v4;}
}
#line 10181 "ripper.c"
break;
case 457:
#line 3835 "ripper.y"
{
#if 0
(yyval.val) = new_qcall(p, (yyvsp[-1].val), (yyvsp[-2].val), ID2VAL(idCall), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
nd_set_line((yyval.val), (yylsp[-1]).end_pos.lineno);
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=ID2VAL(idCall);v4=dispatch3(call,v1,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=dispatch2(method_add_arg,v5,v6);(yyval.val)=v7;}
}
#line 10193 "ripper.c"
break;
case 458:
#line 3843 "ripper.y"
{
#if 0
(yyval.val) = new_qcall(p, ID2VAL(idCOLON2), (yyvsp[-2].val), ID2VAL(idCall), (yyvsp[0].val), &(yylsp[-1]), &(yyloc));
nd_set_line((yyval.val), (yylsp[-1]).end_pos.lineno);
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7;v1=(yyvsp[-2].val);v2=ID2VAL(idCOLON2);v3=ID2VAL(idCall);v4=dispatch3(call,v1,v2,v3);v5=v4;v6=(yyvsp[0].val);v7=dispatch2(method_add_arg,v5,v6);(yyval.val)=v7;}
}
#line 10205 "ripper.c"
break;
case 459:
#line 3851 "ripper.y"
{
#if 0
(yyval.val) = NEW_SUPER((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(super,v1);(yyval.val)=v2;}
}
#line 10216 "ripper.c"
break;
case 460:
#line 3858 "ripper.y"
{
#if 0
(yyval.val) = NEW_ZSUPER(&(yyloc));
#endif
{VALUE v1;v1=dispatch0(zsuper);(yyval.val)=v1;}
}
#line 10227 "ripper.c"
break;
case 461:
#line 3865 "ripper.y"
{
#if 0
if ((yyvsp[-3].val) && nd_type((yyvsp[-3].val)) == NODE_SELF)
(yyval.val) = NEW_FCALL(tAREF, (yyvsp[-1].val), &(yyloc));
else
(yyval.val) = NEW_CALL((yyvsp[-3].val), tAREF, (yyvsp[-1].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-3].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=escape_Qundef((yyvsp[-1].val));v3=dispatch2(aref,v1,v2);(yyval.val)=v3;}
}
#line 10242 "ripper.c"
break;
case 462:
#line 3878 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
#if 0
(yyval.val)->nd_body->nd_loc = code_loc_gen(&(yylsp[-2]), &(yylsp[0]));
nd_set_line((yyval.val), (yylsp[-2]).end_pos.lineno);
#endif
}
#line 10254 "ripper.c"
break;
case 463:
#line 3886 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
#if 0
(yyval.val)->nd_body->nd_loc = code_loc_gen(&(yylsp[-2]), &(yylsp[0]));
nd_set_line((yyval.val), (yylsp[-2]).end_pos.lineno);
#endif
}
#line 10266 "ripper.c"
break;
case 464:
#line 3895 "ripper.y"
{(yyval.vars) = dyna_push(p);}
#line 10272 "ripper.c"
break;
case 465:
#line 3896 "ripper.y"
{
(yyval.num) = p->max_numparam;
p->max_numparam = 0;
}
#line 10281 "ripper.c"
break;
case 466:
#line 3900 "ripper.y"
{
(yyval.node) = numparam_push(p);
}
#line 10289 "ripper.c"
break;
case 467:
#line 3904 "ripper.y"
{
int max_numparam = p->max_numparam;
p->max_numparam = (yyvsp[-3].num);
(yyvsp[-1].val) = args_with_numbered(p, (yyvsp[-1].val), max_numparam);
#if 0
(yyval.val) = NEW_ITER((yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=escape_Qundef((yyvsp[-1].val));v2=(yyvsp[0].val);v3=dispatch2(brace_block,v1,v2);(yyval.val)=v3;}
numparam_pop(p, (yyvsp[-2].node));
dyna_pop(p, (yyvsp[-4].vars));
}
#line 10305 "ripper.c"
break;
case 468:
#line 3917 "ripper.y"
{(yyval.vars) = dyna_push(p);}
#line 10311 "ripper.c"
break;
case 469:
#line 3918 "ripper.y"
{
(yyval.num) = p->max_numparam;
p->max_numparam = 0;
}
#line 10320 "ripper.c"
break;
case 470:
#line 3922 "ripper.y"
{
(yyval.node) = numparam_push(p);
CMDARG_PUSH(0);
}
#line 10329 "ripper.c"
break;
case 471:
#line 3927 "ripper.y"
{
int max_numparam = p->max_numparam;
p->max_numparam = (yyvsp[-3].num);
(yyvsp[-1].val) = args_with_numbered(p, (yyvsp[-1].val), max_numparam);
#if 0
(yyval.val) = NEW_ITER((yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=escape_Qundef((yyvsp[-1].val));v2=(yyvsp[0].val);v3=dispatch2(do_block,v1,v2);(yyval.val)=v3;}
CMDARG_POP();
numparam_pop(p, (yyvsp[-2].node));
dyna_pop(p, (yyvsp[-4].vars));
}
#line 10346 "ripper.c"
break;
case 472:
#line 3942 "ripper.y"
{
#if 0
check_literal_when(p, (yyvsp[0].val), &(yylsp[0]));
(yyval.val) = NEW_LIST((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(args_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(args_add,v2,v3);(yyval.val)=v4;}
}
#line 10358 "ripper.c"
break;
case 473:
#line 3950 "ripper.y"
{
#if 0
(yyval.val) = NEW_SPLAT((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=dispatch0(args_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(args_add_star,v2,v3);(yyval.val)=v4;}
}
#line 10369 "ripper.c"
break;
case 474:
#line 3957 "ripper.y"
{
#if 0
check_literal_when(p, (yyvsp[0].val), &(yylsp[0]));
(yyval.val) = last_arg_append(p, (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(args_add,v1,v2);(yyval.val)=v3;}
}
#line 10381 "ripper.c"
break;
case 475:
#line 3965 "ripper.y"
{
#if 0
(yyval.val) = rest_arg_append(p, (yyvsp[-3].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-3].val);v2=(yyvsp[0].val);v3=dispatch2(args_add_star,v1,v2);(yyval.val)=v3;}
}
#line 10392 "ripper.c"
break;
case 476:
#line 3976 "ripper.y"
{
#if 0
(yyval.val) = NEW_WHEN((yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-3].val));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-3].val);v2=(yyvsp[-1].val);v3=escape_Qundef((yyvsp[0].val));v4=dispatch3(when,v1,v2,v3);(yyval.val)=v4;}
}
#line 10404 "ripper.c"
break;
case 479:
#line 3990 "ripper.y"
{
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
p->command_start = FALSE;
(yyvsp[0].ctxt) = p->ctxt;
p->ctxt.in_kwarg = 1;
(yyval.tbl) = push_pvtbl(p);
}
#line 10416 "ripper.c"
break;
case 480:
#line 3997 "ripper.y"
{
(yyval.tbl) = push_pktbl(p);
}
#line 10424 "ripper.c"
break;
case 481:
#line 4001 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
pop_pvtbl(p, (yyvsp[-3].tbl));
p->ctxt.in_kwarg = (yyvsp[-4].ctxt).in_kwarg;
}
#line 10434 "ripper.c"
break;
case 482:
#line 4008 "ripper.y"
{
#if 0
(yyval.val) = NEW_IN((yyvsp[-4].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-4].val);v2=(yyvsp[-1].val);v3=escape_Qundef((yyvsp[0].val));v4=dispatch3(in,v1,v2,v3);(yyval.val)=v4;}
}
#line 10445 "ripper.c"
break;
case 486:
#line 4022 "ripper.y"
{
#if 0
(yyval.val) = new_if(p, (yyvsp[0].val), remove_begin((yyvsp[-2].val)), 0, &(yyloc));
fixpos((yyval.val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[0].val);v2=(yyvsp[-2].val);v3=dispatch2(if_mod,v1,v2);(yyval.val)=v3;}
}
#line 10457 "ripper.c"
break;
case 487:
#line 4030 "ripper.y"
{
#if 0
(yyval.val) = new_unless(p, (yyvsp[0].val), remove_begin((yyvsp[-2].val)), 0, &(yyloc));
fixpos((yyval.val), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[0].val);v2=(yyvsp[-2].val);v3=dispatch2(unless_mod,v1,v2);(yyval.val)=v3;}
}
#line 10469 "ripper.c"
break;
case 489:
#line 4041 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, Qnone, 1, 0, Qnone, &(yyloc));
(yyval.val) = new_array_pattern(p, Qnone, get_value((yyvsp[-1].val)), (yyval.val), &(yyloc));
}
#line 10478 "ripper.c"
break;
case 490:
#line 4046 "ripper.y"
{
(yyval.val) = new_array_pattern(p, Qnone, get_value((yyvsp[-2].val)), (yyvsp[0].val), &(yyloc));
#if 0
nd_set_first_loc((yyval.val), (yylsp[-2]).beg_pos);
#endif
}
#line 10490 "ripper.c"
break;
case 491:
#line 4054 "ripper.y"
{
(yyval.val) = new_find_pattern(p, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 10498 "ripper.c"
break;
case 492:
#line 4058 "ripper.y"
{
(yyval.val) = new_array_pattern(p, Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 10506 "ripper.c"
break;
case 493:
#line 4062 "ripper.y"
{
(yyval.val) = new_hash_pattern(p, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 10514 "ripper.c"
break;
case 495:
#line 4071 "ripper.y"
{
#if 0
NODE *n = NEW_LIST((yyvsp[-2].val), &(yyloc));
n = list_append(p, n, (yyvsp[0].val));
(yyval.val) = new_hash(p, n, &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-2].val);v2=STATIC_ID2SYM(id_assoc);v3=(yyvsp[0].val);v4=dispatch3(binary,v1,v2,v3);(yyval.val)=v4;}
}
#line 10527 "ripper.c"
break;
case 497:
#line 4083 "ripper.y"
{
#if 0
(yyval.val) = NEW_NODE(NODE_OR, (yyvsp[-2].val), (yyvsp[0].val), 0, &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[-2].val);v2=STATIC_ID2SYM(idOr);v3=(yyvsp[0].val);v4=dispatch3(binary,v1,v2,v3);(yyval.val)=v4;}
}
#line 10538 "ripper.c"
break;
case 499:
#line 4092 "ripper.y"
{(yyval.tbl) = push_pktbl(p);}
#line 10544 "ripper.c"
break;
case 500:
#line 4093 "ripper.y"
{(yyval.tbl) = push_pktbl(p);}
#line 10550 "ripper.c"
break;
case 502:
#line 4097 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
(yyval.val) = new_array_pattern(p, (yyvsp[-3].val), Qnone, (yyvsp[-1].val), &(yyloc));
#if 0
nd_set_first_loc((yyval.val), (yylsp[-3]).beg_pos);
#endif
}
#line 10563 "ripper.c"
break;
case 503:
#line 4106 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
(yyval.val) = new_find_pattern(p, (yyvsp[-3].val), (yyvsp[-1].val), &(yyloc));
#if 0
nd_set_first_loc((yyval.val), (yylsp[-3]).beg_pos);
#endif
}
#line 10576 "ripper.c"
break;
case 504:
#line 4115 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
(yyval.val) = new_hash_pattern(p, (yyvsp[-3].val), (yyvsp[-1].val), &(yyloc));
#if 0
nd_set_first_loc((yyval.val), (yylsp[-3]).beg_pos);
#endif
}
#line 10589 "ripper.c"
break;
case 505:
#line 4124 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, Qnone, 0, 0, Qnone, &(yyloc));
(yyval.val) = new_array_pattern(p, (yyvsp[-2].val), Qnone, (yyval.val), &(yyloc));
}
#line 10598 "ripper.c"
break;
case 506:
#line 4129 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
(yyval.val) = new_array_pattern(p, (yyvsp[-3].val), Qnone, (yyvsp[-1].val), &(yyloc));
#if 0
nd_set_first_loc((yyval.val), (yylsp[-3]).beg_pos);
#endif
}
#line 10611 "ripper.c"
break;
case 507:
#line 4138 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
(yyval.val) = new_find_pattern(p, (yyvsp[-3].val), (yyvsp[-1].val), &(yyloc));
#if 0
nd_set_first_loc((yyval.val), (yylsp[-3]).beg_pos);
#endif
}
#line 10624 "ripper.c"
break;
case 508:
#line 4147 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
(yyval.val) = new_hash_pattern(p, (yyvsp[-3].val), (yyvsp[-1].val), &(yyloc));
#if 0
nd_set_first_loc((yyval.val), (yylsp[-3]).beg_pos);
#endif
}
#line 10637 "ripper.c"
break;
case 509:
#line 4156 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, Qnone, 0, 0, Qnone, &(yyloc));
(yyval.val) = new_array_pattern(p, (yyvsp[-2].val), Qnone, (yyval.val), &(yyloc));
}
#line 10646 "ripper.c"
break;
case 510:
#line 4161 "ripper.y"
{
(yyval.val) = new_array_pattern(p, Qnone, Qnone, (yyvsp[-1].val), &(yyloc));
}
#line 10654 "ripper.c"
break;
case 511:
#line 4165 "ripper.y"
{
(yyval.val) = new_find_pattern(p, Qnone, (yyvsp[-1].val), &(yyloc));
}
#line 10662 "ripper.c"
break;
case 512:
#line 4169 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, Qnone, 0, 0, Qnone, &(yyloc));
(yyval.val) = new_array_pattern(p, Qnone, Qnone, (yyval.val), &(yyloc));
}
#line 10671 "ripper.c"
break;
case 513:
#line 4174 "ripper.y"
{
(yyval.tbl) = push_pktbl(p);
(yyvsp[0].ctxt) = p->ctxt;
p->ctxt.in_kwarg = 0;
}
#line 10681 "ripper.c"
break;
case 514:
#line 4180 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
p->ctxt.in_kwarg = (yyvsp[-3].ctxt).in_kwarg;
(yyval.val) = new_hash_pattern(p, Qnone, (yyvsp[-1].val), &(yyloc));
}
#line 10691 "ripper.c"
break;
case 515:
#line 4186 "ripper.y"
{
(yyval.val) = new_hash_pattern_tail(p, Qnone, 0, &(yyloc));
(yyval.val) = new_hash_pattern(p, Qnone, (yyval.val), &(yyloc));
}
#line 10700 "ripper.c"
break;
case 516:
#line 4190 "ripper.y"
{(yyval.tbl) = push_pktbl(p);}
#line 10706 "ripper.c"
break;
case 517:
#line 4191 "ripper.y"
{
pop_pktbl(p, (yyvsp[-2].tbl));
(yyval.val) = (yyvsp[-1].val);
}
#line 10715 "ripper.c"
break;
case 518:
#line 4198 "ripper.y"
{
#if 0
NODE *pre_args = NEW_LIST((yyvsp[0].val), &(yyloc));
(yyval.val) = new_array_pattern_tail(p, pre_args, 0, 0, Qnone, &(yyloc));
#endif
(yyval.val) = new_array_pattern_tail(p, rb_ary_new_from_args(1, get_value((yyvsp[0].val))), 0, 0, Qnone, &(yyloc));
}
#line 10728 "ripper.c"
break;
case 519:
#line 4207 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, (yyvsp[0].val), 1, 0, Qnone, &(yyloc));
}
#line 10736 "ripper.c"
break;
case 520:
#line 4211 "ripper.y"
{
#if 0
(yyval.val) = new_array_pattern_tail(p, list_concat((yyvsp[-1].val), (yyvsp[0].val)), 0, 0, Qnone, &(yyloc));
#endif
VALUE pre_args = rb_ary_concat((yyvsp[-1].val), get_value((yyvsp[0].val)));
(yyval.val) = new_array_pattern_tail(p, pre_args, 0, 0, Qnone, &(yyloc));
}
#line 10749 "ripper.c"
break;
case 521:
#line 4220 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, (yyvsp[-2].val), 1, (yyvsp[0].val), Qnone, &(yyloc));
}
#line 10757 "ripper.c"
break;
case 522:
#line 4224 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, (yyvsp[-4].val), 1, (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
}
#line 10765 "ripper.c"
break;
case 523:
#line 4228 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, (yyvsp[-1].val), 1, 0, Qnone, &(yyloc));
}
#line 10773 "ripper.c"
break;
case 524:
#line 4232 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, (yyvsp[-3].val), 1, 0, (yyvsp[0].val), &(yyloc));
}
#line 10781 "ripper.c"
break;
case 526:
#line 4239 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
}
#line 10789 "ripper.c"
break;
case 527:
#line 4243 "ripper.y"
{
#if 0
(yyval.val) = list_concat((yyvsp[-2].val), (yyvsp[-1].val));
#endif
(yyval.val)=rb_ary_concat((yyvsp[-2].val), get_value((yyvsp[-1].val)));
}
#line 10800 "ripper.c"
break;
case 528:
#line 4252 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, Qnone, 1, (yyvsp[0].val), Qnone, &(yyloc));
}
#line 10808 "ripper.c"
break;
case 529:
#line 4256 "ripper.y"
{
(yyval.val) = new_array_pattern_tail(p, Qnone, 1, (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
}
#line 10816 "ripper.c"
break;
case 530:
#line 4262 "ripper.y"
{
(yyval.val) = new_find_pattern_tail(p, (yyvsp[-4].val), (yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
if (rb_warning_category_enabled_p(RB_WARN_CATEGORY_EXPERIMENTAL))
rb_warn0L_experimental(nd_line((yyval.val)), "Find pattern is experimental, and the behavior may change in future versions of Ruby!");
}
#line 10827 "ripper.c"
break;
case 531:
#line 4272 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 10835 "ripper.c"
break;
case 532:
#line 4276 "ripper.y"
{
(yyval.val) = 0;
}
#line 10843 "ripper.c"
break;
case 534:
#line 4283 "ripper.y"
{
#if 0
(yyval.val) = list_concat((yyvsp[-2].val), (yyvsp[0].val));
#endif
(yyval.val)=rb_ary_concat((yyvsp[-2].val), get_value((yyvsp[0].val)));
}
#line 10854 "ripper.c"
break;
case 535:
#line 4292 "ripper.y"
{
#if 0
(yyval.val) = NEW_LIST((yyvsp[0].val), &(yyloc));
#endif
(yyval.val)=rb_ary_new_from_args(1, get_value((yyvsp[0].val)));
}
#line 10865 "ripper.c"
break;
case 536:
#line 4301 "ripper.y"
{
(yyval.val) = new_hash_pattern_tail(p, new_unique_key_hash(p, (yyvsp[-2].val), &(yyloc)), (yyvsp[0].val), &(yyloc));
}
#line 10873 "ripper.c"
break;
case 537:
#line 4305 "ripper.y"
{
(yyval.val) = new_hash_pattern_tail(p, new_unique_key_hash(p, (yyvsp[0].val), &(yyloc)), 0, &(yyloc));
}
#line 10881 "ripper.c"
break;
case 538:
#line 4309 "ripper.y"
{
(yyval.val) = new_hash_pattern_tail(p, new_unique_key_hash(p, (yyvsp[-1].val), &(yyloc)), 0, &(yyloc));
}
#line 10889 "ripper.c"
break;
case 539:
#line 4313 "ripper.y"
{
(yyval.val) = new_hash_pattern_tail(p, new_hash(p, Qnone, &(yyloc)), (yyvsp[0].val), &(yyloc));
}
#line 10897 "ripper.c"
break;
case 540:
#line 4319 "ripper.y"
{(yyval.val)=rb_ary_new_from_args(1, (yyvsp[0].val));}
#line 10903 "ripper.c"
break;
case 541:
#line 4321 "ripper.y"
{
#if 0
(yyval.val) = list_concat((yyvsp[-2].val), (yyvsp[0].val));
#endif
(yyval.val)=rb_ary_push((yyvsp[-2].val), (yyvsp[0].val));
}
#line 10914 "ripper.c"
break;
case 542:
#line 4330 "ripper.y"
{
error_duplicate_pattern_key(p, get_id((yyvsp[-1].val)), &(yylsp[-1]));
#if 0
(yyval.val) = list_append(p, NEW_LIST(NEW_LIT(ID2SYM((yyvsp[-1].val)), &(yyloc)), &(yyloc)), (yyvsp[0].val));
#endif
(yyval.val)=rb_ary_new_from_args(2, get_value((yyvsp[-1].val)), get_value((yyvsp[0].val)));
}
#line 10926 "ripper.c"
break;
case 543:
#line 4338 "ripper.y"
{
error_duplicate_pattern_key(p, get_id((yyvsp[0].val)), &(yylsp[0]));
if ((yyvsp[0].val) && !is_local_id(get_id((yyvsp[0].val)))) {
yyerror1(&(yylsp[0]), "key must be valid as local variables");
}
error_duplicate_pattern_variable(p, get_id((yyvsp[0].val)), &(yylsp[0]));
#if 0
(yyval.val) = list_append(p, NEW_LIST(NEW_LIT(ID2SYM((yyvsp[0].val)), &(yyloc)), &(yyloc)), assignable(p, (yyvsp[0].val), 0, &(yyloc)));
#endif
(yyval.val)=rb_ary_new_from_args(2, get_value((yyvsp[0].val)), Qnil);
}
#line 10942 "ripper.c"
break;
case 545:
#line 4353 "ripper.y"
{
YYLTYPE loc = code_loc_gen(&(yylsp[-2]), &(yylsp[0]));
#if 0
if (!(yyvsp[-1].val) || nd_type((yyvsp[-1].val)) == NODE_STR) {
NODE *node = dsym_node(p, (yyvsp[-1].val), &loc);
(yyval.val) = SYM2ID(node->nd_lit);
}
#endif
if (ripper_is_node_yylval((yyvsp[-1].val)) && RNODE((yyvsp[-1].val))->nd_cval) {
VALUE label = RNODE((yyvsp[-1].val))->nd_cval;
VALUE rval = RNODE((yyvsp[-1].val))->nd_rval;
(yyval.val) = ripper_new_yylval(p, rb_intern_str(label), rval, label);
RNODE((yyval.val))->nd_loc = loc;
}
else {
yyerror1(&loc, "symbol literal with interpolation is not allowed");
(yyval.val) = 0;
}
}
#line 10967 "ripper.c"
break;
case 546:
#line 4376 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 10975 "ripper.c"
break;
case 547:
#line 4380 "ripper.y"
{
(yyval.val) = 0;
}
#line 10983 "ripper.c"
break;
case 548:
#line 4386 "ripper.y"
{
(yyval.val) = 0;
}
#line 10991 "ripper.c"
break;
case 550:
#line 4392 "ripper.y"
{(yyval.val) = ID2VAL(idNil);}
#line 10997 "ripper.c"
break;
case 552:
#line 4397 "ripper.y"
{
#if 0
value_expr((yyvsp[-2].val));
value_expr((yyvsp[0].val));
(yyval.val) = NEW_DOT2((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(dot2,v1,v2);(yyval.val)=v3;}
}
#line 11010 "ripper.c"
break;
case 553:
#line 4406 "ripper.y"
{
#if 0
value_expr((yyvsp[-2].val));
value_expr((yyvsp[0].val));
(yyval.val) = NEW_DOT3((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(dot3,v1,v2);(yyval.val)=v3;}
}
#line 11023 "ripper.c"
break;
case 554:
#line 4415 "ripper.y"
{
#if 0
value_expr((yyvsp[-1].val));
(yyval.val) = NEW_DOT2((yyvsp[-1].val), new_nil_at(p, &(yylsp[0]).end_pos), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=Qnil;v3=dispatch2(dot2,v1,v2);(yyval.val)=v3;}
}
#line 11035 "ripper.c"
break;
case 555:
#line 4423 "ripper.y"
{
#if 0
value_expr((yyvsp[-1].val));
(yyval.val) = NEW_DOT3((yyvsp[-1].val), new_nil_at(p, &(yylsp[0]).end_pos), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=Qnil;v3=dispatch2(dot3,v1,v2);(yyval.val)=v3;}
}
#line 11047 "ripper.c"
break;
case 559:
#line 4434 "ripper.y"
{
#if 0
value_expr((yyvsp[0].val));
(yyval.val) = NEW_DOT2(new_nil_at(p, &(yylsp[-1]).beg_pos), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=Qnil;v2=(yyvsp[0].val);v3=dispatch2(dot2,v1,v2);(yyval.val)=v3;}
}
#line 11059 "ripper.c"
break;
case 560:
#line 4442 "ripper.y"
{
#if 0
value_expr((yyvsp[0].val));
(yyval.val) = NEW_DOT3(new_nil_at(p, &(yylsp[-1]).beg_pos), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=Qnil;v2=(yyvsp[0].val);v3=dispatch2(dot3,v1,v2);(yyval.val)=v3;}
}
#line 11071 "ripper.c"
break;
case 569:
#line 4460 "ripper.y"
{
#if 0
if (!((yyval.val) = gettable(p, (yyvsp[0].val), &(yyloc)))) (yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(var_ref,v1);(yyval.val)=v2;}
}
#line 11082 "ripper.c"
break;
case 571:
#line 4470 "ripper.y"
{
#if 0
error_duplicate_pattern_variable(p, (yyvsp[0].val), &(yylsp[0]));
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=assignable(p, var_field(p, (yyvsp[0].val)));
}
#line 11094 "ripper.c"
break;
case 572:
#line 4480 "ripper.y"
{
#if 0
NODE *n = gettable(p, (yyvsp[0].val), &(yyloc));
if (!(nd_type(n) == NODE_LVAR || nd_type(n) == NODE_DVAR)) {
compile_error(p, "%"PRIsVALUE": no such local variable", rb_id2str((yyvsp[0].val)));
}
(yyval.val) = n;
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(var_ref,v1);(yyval.val)=v2;}
}
#line 11109 "ripper.c"
break;
case 573:
#line 4493 "ripper.y"
{
#if 0
(yyval.val) = NEW_COLON3((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(top_const_ref,v1);(yyval.val)=v2;}
}
#line 11120 "ripper.c"
break;
case 574:
#line 4500 "ripper.y"
{
#if 0
(yyval.val) = NEW_COLON2((yyvsp[-2].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(const_path_ref,v1,v2);(yyval.val)=v3;}
}
#line 11131 "ripper.c"
break;
case 575:
#line 4507 "ripper.y"
{
#if 0
(yyval.val) = gettable(p, (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(var_ref,v1);(yyval.val)=v2;}
}
#line 11142 "ripper.c"
break;
case 576:
#line 4518 "ripper.y"
{
#if 0
(yyval.val) = NEW_RESBODY((yyvsp[-4].val),
(yyvsp[-3].val) ? block_append(p, node_assign(p, (yyvsp[-3].val), NEW_ERRINFO(&(yylsp[-3])), NO_LEX_CTXT, &(yylsp[-3])), (yyvsp[-1].val)) : (yyvsp[-1].val),
(yyvsp[0].val), &(yyloc));
fixpos((yyval.val), (yyvsp[-4].val)?(yyvsp[-4].val):(yyvsp[-1].val));
#endif
{VALUE v1,v2,v3,v4,v5;v1=escape_Qundef((yyvsp[-4].val));v2=escape_Qundef((yyvsp[-3].val));v3=escape_Qundef((yyvsp[-1].val));v4=escape_Qundef((yyvsp[0].val));v5=dispatch4(rescue,v1,v2,v3,v4);(yyval.val)=v5;}
}
#line 11156 "ripper.c"
break;
case 578:
#line 4531 "ripper.y"
{
#if 0
(yyval.val) = NEW_LIST((yyvsp[0].val), &(yyloc));
#endif
(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));
}
#line 11167 "ripper.c"
break;
case 579:
#line 4538 "ripper.y"
{
#if 0
if (!((yyval.val) = splat_array((yyvsp[0].val)))) (yyval.val) = (yyvsp[0].val);
#endif
(yyval.val)=(yyvsp[0].val);
}
#line 11178 "ripper.c"
break;
case 581:
#line 4548 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 11186 "ripper.c"
break;
case 583:
#line 4555 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(ensure,v1);(yyval.val)=v2;}
}
#line 11197 "ripper.c"
break;
case 587:
#line 4569 "ripper.y"
{
#if 0
NODE *node = (yyvsp[0].val);
if (!node) {
node = NEW_STR(STR_NEW0(), &(yyloc));
RB_OBJ_WRITTEN(p->ast, Qnil, node->nd_lit);
}
else {
node = evstr2dstr(p, node);
}
(yyval.val) = node;
#endif
(yyval.val)=(yyvsp[0].val);
}
#line 11216 "ripper.c"
break;
case 590:
#line 4588 "ripper.y"
{
#if 0
(yyval.val) = literal_concat(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(string_concat,v1,v2);(yyval.val)=v3;}
}
#line 11227 "ripper.c"
break;
case 591:
#line 4597 "ripper.y"
{
#if 0
(yyval.val) = heredoc_dedent(p, (yyvsp[-1].val));
if ((yyval.val)) nd_set_loc((yyval.val), &(yyloc));
#endif
{VALUE v1,v2;v1=heredoc_dedent(p, (yyvsp[-1].val));v2=dispatch1(string_literal,v1);(yyval.val)=v2;}
}
#line 11239 "ripper.c"
break;
case 592:
#line 4607 "ripper.y"
{
#if 0
(yyval.val) = new_xstring(p, heredoc_dedent(p, (yyvsp[-1].val)), &(yyloc));
#endif
{VALUE v1,v2;v1=heredoc_dedent(p, (yyvsp[-1].val));v2=dispatch1(xstring_literal,v1);(yyval.val)=v2;}
}
#line 11250 "ripper.c"
break;
case 593:
#line 4616 "ripper.y"
{
(yyval.val) = new_regexp(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 11258 "ripper.c"
break;
case 594:
#line 4622 "ripper.y"
{
#if 0
(yyval.val) = make_list((yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(array,v1);(yyval.val)=v2;}
}
#line 11269 "ripper.c"
break;
case 595:
#line 4631 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
{VALUE v1;v1=dispatch0(words_new);(yyval.val)=v1;}
}
#line 11280 "ripper.c"
break;
case 596:
#line 4638 "ripper.y"
{
#if 0
(yyval.val) = list_append(p, (yyvsp[-2].val), evstr2dstr(p, (yyvsp[-1].val)));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=dispatch2(words_add,v1,v2);(yyval.val)=v3;}
}
#line 11291 "ripper.c"
break;
case 597:
#line 4647 "ripper.y"
{{VALUE v1,v2,v3,v4;v1=dispatch0(word_new);v2=v1;v3=(yyvsp[0].val);v4=dispatch2(word_add,v2,v3);(yyval.val)=v4;}}
#line 11297 "ripper.c"
break;
case 598:
#line 4649 "ripper.y"
{
#if 0
(yyval.val) = literal_concat(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(word_add,v1,v2);(yyval.val)=v3;}
}
#line 11308 "ripper.c"
break;
case 599:
#line 4658 "ripper.y"
{
#if 0
(yyval.val) = make_list((yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(array,v1);(yyval.val)=v2;}
}
#line 11319 "ripper.c"
break;
case 600:
#line 4667 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
{VALUE v1;v1=dispatch0(symbols_new);(yyval.val)=v1;}
}
#line 11330 "ripper.c"
break;
case 601:
#line 4674 "ripper.y"
{
#if 0
(yyval.val) = symbol_append(p, (yyvsp[-2].val), evstr2dstr(p, (yyvsp[-1].val)));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=dispatch2(symbols_add,v1,v2);(yyval.val)=v3;}
}
#line 11341 "ripper.c"
break;
case 602:
#line 4683 "ripper.y"
{
#if 0
(yyval.val) = make_list((yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(array,v1);(yyval.val)=v2;}
}
#line 11352 "ripper.c"
break;
case 603:
#line 4692 "ripper.y"
{
#if 0
(yyval.val) = make_list((yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(array,v1);(yyval.val)=v2;}
}
#line 11363 "ripper.c"
break;
case 604:
#line 4701 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
{VALUE v1;v1=dispatch0(qwords_new);(yyval.val)=v1;}
}
#line 11374 "ripper.c"
break;
case 605:
#line 4708 "ripper.y"
{
#if 0
(yyval.val) = list_append(p, (yyvsp[-2].val), (yyvsp[-1].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=dispatch2(qwords_add,v1,v2);(yyval.val)=v3;}
}
#line 11385 "ripper.c"
break;
case 606:
#line 4717 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
{VALUE v1;v1=dispatch0(qsymbols_new);(yyval.val)=v1;}
}
#line 11396 "ripper.c"
break;
case 607:
#line 4724 "ripper.y"
{
#if 0
(yyval.val) = symbol_append(p, (yyvsp[-2].val), (yyvsp[-1].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[-1].val);v3=dispatch2(qsymbols_add,v1,v2);(yyval.val)=v3;}
}
#line 11407 "ripper.c"
break;
case 608:
#line 4733 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
{VALUE v1;v1=dispatch0(string_content);(yyval.val)=v1;}
#if 0
#endif
(yyval.val) = ripper_new_yylval(p, 0, (yyval.val), 0);
}
#line 11422 "ripper.c"
break;
case 609:
#line 4744 "ripper.y"
{
#if 0
(yyval.val) = literal_concat(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(string_add,v1,v2);(yyval.val)=v3;}
#if 0
#endif
if (ripper_is_node_yylval((yyvsp[-1].val)) && ripper_is_node_yylval((yyvsp[0].val)) &&
!RNODE((yyvsp[-1].val))->nd_cval) {
RNODE((yyvsp[-1].val))->nd_cval = RNODE((yyvsp[0].val))->nd_cval;
RNODE((yyvsp[-1].val))->nd_rval = add_mark_object(p, (yyval.val));
(yyval.val) = (yyvsp[-1].val);
}
}
#line 11442 "ripper.c"
break;
case 610:
#line 4762 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
{VALUE v1;v1=dispatch0(xstring_new);(yyval.val)=v1;}
}
#line 11453 "ripper.c"
break;
case 611:
#line 4769 "ripper.y"
{
#if 0
(yyval.val) = literal_concat(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(xstring_add,v1,v2);(yyval.val)=v3;}
}
#line 11464 "ripper.c"
break;
case 612:
#line 4778 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
{VALUE v1;v1=dispatch0(regexp_new);(yyval.val)=v1;}
#if 0
#endif
(yyval.val) = ripper_new_yylval(p, 0, (yyval.val), 0);
}
#line 11479 "ripper.c"
break;
case 613:
#line 4789 "ripper.y"
{
#if 0
NODE *head = (yyvsp[-1].val), *tail = (yyvsp[0].val);
if (!head) {
(yyval.val) = tail;
}
else if (!tail) {
(yyval.val) = head;
}
else {
switch (nd_type(head)) {
case NODE_STR:
nd_set_type(head, NODE_DSTR);
break;
case NODE_DSTR:
break;
default:
head = list_append(p, NEW_DSTR(Qnil, &(yyloc)), head);
break;
}
(yyval.val) = list_append(p, head, tail);
}
#endif
VALUE s1 = 1, s2 = 0, n1 = (yyvsp[-1].val), n2 = (yyvsp[0].val);
if (ripper_is_node_yylval(n1)) {
s1 = RNODE(n1)->nd_cval;
n1 = RNODE(n1)->nd_rval;
}
if (ripper_is_node_yylval(n2)) {
s2 = RNODE(n2)->nd_cval;
n2 = RNODE(n2)->nd_rval;
}
(yyval.val) = dispatch2(regexp_add, n1, n2);
if (!s1 && s2) {
(yyval.val) = ripper_new_yylval(p, 0, (yyval.val), s2);
}
}
#line 11522 "ripper.c"
break;
case 614:
#line 4830 "ripper.y"
{(yyval.val)=ripper_new_yylval(p, 0, get_value((yyvsp[0].val)), (yyvsp[0].val));}
#line 11528 "ripper.c"
break;
case 615:
#line 4832 "ripper.y"
{
/* need to backup p->lex.strterm so that a string literal `%&foo,#$&,bar&` can be parsed */
(yyval.strterm) = p->lex.strterm;
p->lex.strterm = 0;
SET_LEX_STATE(EXPR_BEG);
}
#line 11539 "ripper.c"
break;
case 616:
#line 4839 "ripper.y"
{
p->lex.strterm = (yyvsp[-1].strterm);
#if 0
(yyval.val) = NEW_EVSTR((yyvsp[0].val), &(yyloc));
nd_set_line((yyval.val), (yylsp[0]).end_pos.lineno);
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(string_dvar,v1);(yyval.val)=v2;}
}
#line 11552 "ripper.c"
break;
case 617:
#line 4848 "ripper.y"
{
CMDARG_PUSH(0);
COND_PUSH(0);
}
#line 11561 "ripper.c"
break;
case 618:
#line 4852 "ripper.y"
{
/* need to backup p->lex.strterm so that a string literal `%!foo,#{ !0 },bar!` can be parsed */
(yyval.strterm) = p->lex.strterm;
p->lex.strterm = 0;
}
#line 11571 "ripper.c"
break;
case 619:
#line 4857 "ripper.y"
{
(yyval.num) = p->lex.state;
SET_LEX_STATE(EXPR_BEG);
}
#line 11580 "ripper.c"
break;
case 620:
#line 4861 "ripper.y"
{
(yyval.num) = p->lex.brace_nest;
p->lex.brace_nest = 0;
}
#line 11589 "ripper.c"
break;
case 621:
#line 4865 "ripper.y"
{
(yyval.num) = p->heredoc_indent;
p->heredoc_indent = 0;
}
#line 11598 "ripper.c"
break;
case 622:
#line 4870 "ripper.y"
{
COND_POP();
CMDARG_POP();
p->lex.strterm = (yyvsp[-5].strterm);
SET_LEX_STATE((yyvsp[-4].num));
p->lex.brace_nest = (yyvsp[-3].num);
p->heredoc_indent = (yyvsp[-2].num);
p->heredoc_line_indent = -1;
#if 0
if ((yyvsp[-1].val)) (yyvsp[-1].val)->flags &= ~NODE_FL_NEWLINE;
(yyval.val) = new_evstr(p, (yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(string_embexpr,v1);(yyval.val)=v2;}
}
#line 11617 "ripper.c"
break;
case 623:
#line 4887 "ripper.y"
{
#if 0
(yyval.val) = NEW_GVAR((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(var_ref,v1);(yyval.val)=v2;}
}
#line 11628 "ripper.c"
break;
case 624:
#line 4894 "ripper.y"
{
#if 0
(yyval.val) = NEW_IVAR((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(var_ref,v1);(yyval.val)=v2;}
}
#line 11639 "ripper.c"
break;
case 625:
#line 4901 "ripper.y"
{
#if 0
(yyval.val) = NEW_CVAR((yyvsp[0].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(var_ref,v1);(yyval.val)=v2;}
}
#line 11650 "ripper.c"
break;
case 629:
#line 4915 "ripper.y"
{
SET_LEX_STATE(EXPR_END);
#if 0
(yyval.val) = NEW_LIT(ID2SYM((yyvsp[0].val)), &(yyloc));
#endif
{VALUE v1,v2,v3,v4;v1=(yyvsp[0].val);v2=dispatch1(symbol,v1);v3=v2;v4=dispatch1(symbol_literal,v3);(yyval.val)=v4;}
}
#line 11662 "ripper.c"
break;
case 634:
#line 4931 "ripper.y"
{
SET_LEX_STATE(EXPR_END);
#if 0
(yyval.val) = dsym_node(p, (yyvsp[-1].val), &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(dyna_symbol,v1);(yyval.val)=v2;}
}
#line 11674 "ripper.c"
break;
case 636:
#line 4942 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[0].val);
RB_OBJ_WRITE(p->ast, &(yyval.val)->nd_lit, negate_lit(p, (yyval.val)->nd_lit));
#endif
{VALUE v1,v2,v3;v1=ID2VAL(idUMinus);v2=(yyvsp[0].val);v3=dispatch2(unary,v1,v2);(yyval.val)=v3;}
}
#line 11686 "ripper.c"
break;
case 646:
#line 4964 "ripper.y"
{(yyval.val) = KWD2EID(nil, (yyvsp[0].val));}
#line 11692 "ripper.c"
break;
case 647:
#line 4965 "ripper.y"
{(yyval.val) = KWD2EID(self, (yyvsp[0].val));}
#line 11698 "ripper.c"
break;
case 648:
#line 4966 "ripper.y"
{(yyval.val) = KWD2EID(true, (yyvsp[0].val));}
#line 11704 "ripper.c"
break;
case 649:
#line 4967 "ripper.y"
{(yyval.val) = KWD2EID(false, (yyvsp[0].val));}
#line 11710 "ripper.c"
break;
case 650:
#line 4968 "ripper.y"
{(yyval.val) = KWD2EID(_FILE__, (yyvsp[0].val));}
#line 11716 "ripper.c"
break;
case 651:
#line 4969 "ripper.y"
{(yyval.val) = KWD2EID(_LINE__, (yyvsp[0].val));}
#line 11722 "ripper.c"
break;
case 652:
#line 4970 "ripper.y"
{(yyval.val) = KWD2EID(_ENCODING__, (yyvsp[0].val));}
#line 11728 "ripper.c"
break;
case 653:
#line 4974 "ripper.y"
{
#if 0
if (!((yyval.val) = gettable(p, (yyvsp[0].val), &(yyloc)))) (yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
if (id_is_var(p, get_id((yyvsp[0].val)))) {
(yyval.val) = dispatch1(var_ref, (yyvsp[0].val));
}
else {
(yyval.val) = dispatch1(vcall, (yyvsp[0].val));
}
}
#line 11745 "ripper.c"
break;
case 654:
#line 4987 "ripper.y"
{
#if 0
if (!((yyval.val) = gettable(p, (yyvsp[0].val), &(yyloc)))) (yyval.val) = NEW_BEGIN(0, &(yyloc));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(var_ref,v1);(yyval.val)=v2;}
}
#line 11756 "ripper.c"
break;
case 655:
#line 4996 "ripper.y"
{
#if 0
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=assignable(p, var_field(p, (yyvsp[0].val)));
}
#line 11767 "ripper.c"
break;
case 656:
#line 5003 "ripper.y"
{
#if 0
(yyval.val) = assignable(p, (yyvsp[0].val), 0, &(yyloc));
#endif
(yyval.val)=assignable(p, var_field(p, (yyvsp[0].val)));
}
#line 11778 "ripper.c"
break;
case 659:
#line 5016 "ripper.y"
{
SET_LEX_STATE(EXPR_BEG);
p->command_start = TRUE;
}
#line 11787 "ripper.c"
break;
case 660:
#line 5021 "ripper.y"
{
(yyval.val) = (yyvsp[-1].val);
}
#line 11795 "ripper.c"
break;
case 661:
#line 5025 "ripper.y"
{
#if 0
(yyval.val) = 0;
#endif
(yyval.val)=Qnil;
}
#line 11806 "ripper.c"
break;
case 664:
#line 5036 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(paren,v1);(yyval.val)=v2;}
SET_LEX_STATE(EXPR_BEG);
p->command_start = TRUE;
}
#line 11819 "ripper.c"
break;
case 665:
#line 5045 "ripper.y"
{
add_forwarding_args(p);
#if 0
(yyval.val) = new_args_forward_def(p, (yyvsp[-3].val), &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8,v9,v10;v1=(yyvsp[-3].val);v2=Qnone;v3=(yyvsp[-1].val);v4=Qnone;v5=Qnone;v6=Qnone;v7=Qnone;v8=dispatch7(params,v1,v2,v3,v4,v5,v6,v7);v9=v8;v10=dispatch1(paren,v9);(yyval.val)=v10;}
SET_LEX_STATE(EXPR_BEG);
p->command_start = TRUE;
}
#line 11833 "ripper.c"
break;
case 666:
#line 5055 "ripper.y"
{
add_forwarding_args(p);
#if 0
(yyval.val) = new_args_forward_def(p, 0, &(yyloc));
#endif
{VALUE v1,v2,v3,v4,v5,v6,v7,v8,v9,v10;v1=Qnone;v2=Qnone;v3=(yyvsp[-1].val);v4=Qnone;v5=Qnone;v6=Qnone;v7=Qnone;v8=dispatch7(params,v1,v2,v3,v4,v5,v6,v7);v9=v8;v10=dispatch1(paren,v9);(yyval.val)=v10;}
SET_LEX_STATE(EXPR_BEG);
p->command_start = TRUE;
}
#line 11847 "ripper.c"
break;
case 668:
#line 5067 "ripper.y"
{
(yyval.ctxt) = p->ctxt;
p->ctxt.in_kwarg = 1;
SET_LEX_STATE(p->lex.state|EXPR_LABEL); /* force for args */
}
#line 11857 "ripper.c"
break;
case 669:
#line 5073 "ripper.y"
{
p->ctxt.in_kwarg = (yyvsp[-2].ctxt).in_kwarg;
(yyval.val) = (yyvsp[-1].val);
SET_LEX_STATE(EXPR_BEG);
p->command_start = TRUE;
}
#line 11868 "ripper.c"
break;
case 670:
#line 5082 "ripper.y"
{
(yyval.val) = new_args_tail(p, (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]));
}
#line 11876 "ripper.c"
break;
case 671:
#line 5086 "ripper.y"
{
(yyval.val) = new_args_tail(p, (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yylsp[-1]));
}
#line 11884 "ripper.c"
break;
case 672:
#line 5090 "ripper.y"
{
(yyval.val) = new_args_tail(p, Qnone, (yyvsp[-1].val), (yyvsp[0].val), &(yylsp[-1]));
}
#line 11892 "ripper.c"
break;
case 673:
#line 5094 "ripper.y"
{
(yyval.val) = new_args_tail(p, Qnone, Qnone, (yyvsp[0].val), &(yylsp[0]));
}
#line 11900 "ripper.c"
break;
case 674:
#line 5100 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 11908 "ripper.c"
break;
case 675:
#line 5104 "ripper.y"
{
(yyval.val) = new_args_tail(p, Qnone, Qnone, Qnone, &(yylsp[0]));
}
#line 11916 "ripper.c"
break;
case 676:
#line 5110 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-5].val), (yyvsp[-3].val), (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yyloc));
}
#line 11924 "ripper.c"
break;
case 677:
#line 5114 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-7].val), (yyvsp[-5].val), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 11932 "ripper.c"
break;
case 678:
#line 5118 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-3].val), (yyvsp[-1].val), Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 11940 "ripper.c"
break;
case 679:
#line 5122 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-5].val), (yyvsp[-3].val), Qnone, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 11948 "ripper.c"
break;
case 680:
#line 5126 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-3].val), Qnone, (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yyloc));
}
#line 11956 "ripper.c"
break;
case 681:
#line 5130 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-5].val), Qnone, (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 11964 "ripper.c"
break;
case 682:
#line 5134 "ripper.y"
{
(yyval.val) = new_args(p, (yyvsp[-1].val), Qnone, Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 11972 "ripper.c"
break;
case 683:
#line 5138 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, (yyvsp[-3].val), (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yyloc));
}
#line 11980 "ripper.c"
break;
case 684:
#line 5142 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, (yyvsp[-5].val), (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 11988 "ripper.c"
break;
case 685:
#line 5146 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, (yyvsp[-1].val), Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 11996 "ripper.c"
break;
case 686:
#line 5150 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, (yyvsp[-3].val), Qnone, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 12004 "ripper.c"
break;
case 687:
#line 5154 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, Qnone, (yyvsp[-1].val), Qnone, (yyvsp[0].val), &(yyloc));
}
#line 12012 "ripper.c"
break;
case 688:
#line 5158 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, Qnone, (yyvsp[-3].val), (yyvsp[-1].val), (yyvsp[0].val), &(yyloc));
}
#line 12020 "ripper.c"
break;
case 689:
#line 5162 "ripper.y"
{
(yyval.val) = new_args(p, Qnone, Qnone, Qnone, Qnone, (yyvsp[0].val), &(yyloc));
}
#line 12028 "ripper.c"
break;
case 690:
#line 5166 "ripper.y"
{
(yyval.val) = new_args_tail(p, Qnone, Qnone, Qnone, &(yylsp[0]));
(yyval.val) = new_args(p, Qnone, Qnone, Qnone, Qnone, (yyval.val), &(yylsp[0]));
}
#line 12037 "ripper.c"
break;
case 691:
#line 5173 "ripper.y"
{
#if 0
(yyval.val) = idDot3;
#endif
{VALUE v1;v1=dispatch0(args_forward);(yyval.val)=v1;}
}
#line 12048 "ripper.c"
break;
case 692:
#line 5182 "ripper.y"
{
static const char mesg[] = "formal argument cannot be a constant";
#if 0
yyerror1(&(yylsp[0]), mesg);
(yyval.val) = 0;
#endif
{VALUE v1,v2,v3;v1=ERR_MESG();v2=(yyvsp[0].val);v3=dispatch2(param_error,v1,v2);(yyval.val)=v3;}ripper_error(p);
}
#line 12061 "ripper.c"
break;
case 693:
#line 5191 "ripper.y"
{
static const char mesg[] = "formal argument cannot be an instance variable";
#if 0
yyerror1(&(yylsp[0]), mesg);
(yyval.val) = 0;
#endif
{VALUE v1,v2,v3;v1=ERR_MESG();v2=(yyvsp[0].val);v3=dispatch2(param_error,v1,v2);(yyval.val)=v3;}ripper_error(p);
}
#line 12074 "ripper.c"
break;
case 694:
#line 5200 "ripper.y"
{
static const char mesg[] = "formal argument cannot be a global variable";
#if 0
yyerror1(&(yylsp[0]), mesg);
(yyval.val) = 0;
#endif
{VALUE v1,v2,v3;v1=ERR_MESG();v2=(yyvsp[0].val);v3=dispatch2(param_error,v1,v2);(yyval.val)=v3;}ripper_error(p);
}
#line 12087 "ripper.c"
break;
case 695:
#line 5209 "ripper.y"
{
static const char mesg[] = "formal argument cannot be a class variable";
#if 0
yyerror1(&(yylsp[0]), mesg);
(yyval.val) = 0;
#endif
{VALUE v1,v2,v3;v1=ERR_MESG();v2=(yyvsp[0].val);v3=dispatch2(param_error,v1,v2);(yyval.val)=v3;}ripper_error(p);
}
#line 12100 "ripper.c"
break;
case 697:
#line 5221 "ripper.y"
{
formal_argument(p, (yyvsp[0].val));
p->max_numparam = ORDINAL_PARAM;
(yyval.val) = (yyvsp[0].val);
}
#line 12110 "ripper.c"
break;
case 698:
#line 5229 "ripper.y"
{
ID id = get_id((yyvsp[0].val));
arg_var(p, id);
p->cur_arg = id;
(yyval.val) = (yyvsp[0].val);
}
#line 12121 "ripper.c"
break;
case 699:
#line 5238 "ripper.y"
{
p->cur_arg = 0;
#if 0
(yyval.val) = NEW_ARGS_AUX((yyvsp[0].val), 1, &NULL_LOC);
#endif
(yyval.val)=get_value((yyvsp[0].val));
}
#line 12133 "ripper.c"
break;
case 700:
#line 5246 "ripper.y"
{
#if 0
ID tid = internal_id(p);
YYLTYPE loc;
loc.beg_pos = (yylsp[-1]).beg_pos;
loc.end_pos = (yylsp[-1]).beg_pos;
arg_var(p, tid);
if (dyna_in_block(p)) {
(yyvsp[-1].val)->nd_value = NEW_DVAR(tid, &loc);
}
else {
(yyvsp[-1].val)->nd_value = NEW_LVAR(tid, &loc);
}
(yyval.val) = NEW_ARGS_AUX(tid, 1, &NULL_LOC);
(yyval.val)->nd_next = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(mlhs_paren,v1);(yyval.val)=v2;}
}
#line 12156 "ripper.c"
break;
case 701:
#line 5267 "ripper.y"
{(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));}
#line 12162 "ripper.c"
break;
case 702:
#line 5269 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-2].val);
(yyval.val)->nd_plen++;
(yyval.val)->nd_next = block_append(p, (yyval.val)->nd_next, (yyvsp[0].val)->nd_next);
rb_discard_node(p, (yyvsp[0].val));
#endif
(yyval.val)=rb_ary_push((yyvsp[-2].val), get_value((yyvsp[0].val)));
}
#line 12176 "ripper.c"
break;
case 703:
#line 5282 "ripper.y"
{
arg_var(p, formal_argument(p, (yyvsp[0].val)));
p->cur_arg = get_id((yyvsp[0].val));
p->max_numparam = ORDINAL_PARAM;
(yyval.val) = (yyvsp[0].val);
}
#line 12187 "ripper.c"
break;
case 704:
#line 5291 "ripper.y"
{
p->cur_arg = 0;
#if 0
(yyval.val) = new_kw_arg(p, assignable(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
(yyval.val)=rb_assoc_new(get_value(assignable(p, (yyvsp[-1].val))), get_value((yyvsp[0].val)));
}
#line 12199 "ripper.c"
break;
case 705:
#line 5299 "ripper.y"
{
p->cur_arg = 0;
#if 0
(yyval.val) = new_kw_arg(p, assignable(p, (yyvsp[0].val), NODE_SPECIAL_REQUIRED_KEYWORD, &(yyloc)), &(yyloc));
#endif
(yyval.val)=rb_assoc_new(get_value(assignable(p, (yyvsp[0].val))), 0);
}
#line 12211 "ripper.c"
break;
case 706:
#line 5309 "ripper.y"
{
#if 0
(yyval.val) = new_kw_arg(p, assignable(p, (yyvsp[-1].val), (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
(yyval.val)=rb_assoc_new(get_value(assignable(p, (yyvsp[-1].val))), get_value((yyvsp[0].val)));
}
#line 12222 "ripper.c"
break;
case 707:
#line 5316 "ripper.y"
{
#if 0
(yyval.val) = new_kw_arg(p, assignable(p, (yyvsp[0].val), NODE_SPECIAL_REQUIRED_KEYWORD, &(yyloc)), &(yyloc));
#endif
(yyval.val)=rb_assoc_new(get_value(assignable(p, (yyvsp[0].val))), 0);
}
#line 12233 "ripper.c"
break;
case 708:
#line 5325 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));
}
#line 12244 "ripper.c"
break;
case 709:
#line 5332 "ripper.y"
{
#if 0
(yyval.val) = kwd_append((yyvsp[-2].val), (yyvsp[0].val));
#endif
(yyval.val)=rb_ary_push((yyvsp[-2].val), get_value((yyvsp[0].val)));
}
#line 12255 "ripper.c"
break;
case 710:
#line 5342 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));
}
#line 12266 "ripper.c"
break;
case 711:
#line 5349 "ripper.y"
{
#if 0
(yyval.val) = kwd_append((yyvsp[-2].val), (yyvsp[0].val));
#endif
(yyval.val)=rb_ary_push((yyvsp[-2].val), get_value((yyvsp[0].val)));
}
#line 12277 "ripper.c"
break;
case 714:
#line 5362 "ripper.y"
{
#if 0
#endif
{VALUE v1,v2;v1=Qnil;v2=dispatch1(nokw_param,v1);(yyval.val)=v2;}
}
#line 12287 "ripper.c"
break;
case 715:
#line 5370 "ripper.y"
{
arg_var(p, shadowing_lvar(p, get_id((yyvsp[0].val))));
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(kwrest_param,v1);(yyval.val)=v2;}
}
#line 12299 "ripper.c"
break;
case 716:
#line 5378 "ripper.y"
{
#if 0
(yyval.val) = internal_id(p);
arg_var(p, (yyval.val));
#endif
{VALUE v1,v2;v1=Qnil;v2=dispatch1(kwrest_param,v1);(yyval.val)=v2;}
}
#line 12311 "ripper.c"
break;
case 717:
#line 5388 "ripper.y"
{
p->cur_arg = 0;
#if 0
(yyval.val) = NEW_OPT_ARG(0, assignable(p, (yyvsp[-2].val), (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
(yyval.val)=rb_assoc_new(get_value(assignable(p, (yyvsp[-2].val))), get_value((yyvsp[0].val)));
}
#line 12323 "ripper.c"
break;
case 718:
#line 5398 "ripper.y"
{
p->cur_arg = 0;
#if 0
(yyval.val) = NEW_OPT_ARG(0, assignable(p, (yyvsp[-2].val), (yyvsp[0].val), &(yyloc)), &(yyloc));
#endif
(yyval.val)=rb_assoc_new(get_value(assignable(p, (yyvsp[-2].val))), get_value((yyvsp[0].val)));
}
#line 12335 "ripper.c"
break;
case 719:
#line 5408 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));
}
#line 12346 "ripper.c"
break;
case 720:
#line 5415 "ripper.y"
{
#if 0
(yyval.val) = opt_arg_append((yyvsp[-2].val), (yyvsp[0].val));
#endif
(yyval.val)=rb_ary_push((yyvsp[-2].val), get_value((yyvsp[0].val)));
}
#line 12357 "ripper.c"
break;
case 721:
#line 5424 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));
}
#line 12368 "ripper.c"
break;
case 722:
#line 5431 "ripper.y"
{
#if 0
(yyval.val) = opt_arg_append((yyvsp[-2].val), (yyvsp[0].val));
#endif
(yyval.val)=rb_ary_push((yyvsp[-2].val), get_value((yyvsp[0].val)));
}
#line 12379 "ripper.c"
break;
case 725:
#line 5444 "ripper.y"
{
arg_var(p, shadowing_lvar(p, get_id((yyvsp[0].val))));
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(rest_param,v1);(yyval.val)=v2;}
}
#line 12391 "ripper.c"
break;
case 726:
#line 5452 "ripper.y"
{
#if 0
(yyval.val) = internal_id(p);
arg_var(p, (yyval.val));
#endif
{VALUE v1,v2;v1=Qnil;v2=dispatch1(rest_param,v1);(yyval.val)=v2;}
}
#line 12403 "ripper.c"
break;
case 729:
#line 5466 "ripper.y"
{
arg_var(p, shadowing_lvar(p, get_id((yyvsp[0].val))));
#if 0
(yyval.val) = (yyvsp[0].val);
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(blockarg,v1);(yyval.val)=v2;}
}
#line 12415 "ripper.c"
break;
case 730:
#line 5476 "ripper.y"
{
(yyval.val) = (yyvsp[0].val);
}
#line 12423 "ripper.c"
break;
case 731:
#line 5480 "ripper.y"
{
(yyval.val) = Qnull;
}
#line 12431 "ripper.c"
break;
case 732:
#line 5486 "ripper.y"
{
value_expr((yyvsp[0].val));
(yyval.val) = (yyvsp[0].val);
}
#line 12440 "ripper.c"
break;
case 733:
#line 5490 "ripper.y"
{SET_LEX_STATE(EXPR_BEG);}
#line 12446 "ripper.c"
break;
case 734:
#line 5491 "ripper.y"
{
#if 0
switch (nd_type((yyvsp[-1].val))) {
case NODE_STR:
case NODE_DSTR:
case NODE_XSTR:
case NODE_DXSTR:
case NODE_DREGX:
case NODE_LIT:
case NODE_LIST:
case NODE_ZLIST:
yyerror1(&(yylsp[-1]), "can't define singleton method for literals");
break;
default:
value_expr((yyvsp[-1].val));
break;
}
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(paren,v1);(yyval.val)=v2;}
}
#line 12472 "ripper.c"
break;
case 736:
#line 5516 "ripper.y"
{
#if 0
(yyval.val) = (yyvsp[-1].val);
#endif
{VALUE v1,v2;v1=(yyvsp[-1].val);v2=dispatch1(assoclist_from_args,v1);(yyval.val)=v2;}
}
#line 12483 "ripper.c"
break;
case 737:
#line 5525 "ripper.y"
{(yyval.val)=rb_ary_new3(1, get_value((yyvsp[0].val)));}
#line 12489 "ripper.c"
break;
case 738:
#line 5527 "ripper.y"
{
#if 0
NODE *assocs = (yyvsp[-2].val);
NODE *tail = (yyvsp[0].val);
if (!assocs) {
assocs = tail;
}
else if (tail) {
if (assocs->nd_head &&
!tail->nd_head && nd_type(tail->nd_next) == NODE_LIST &&
nd_type(tail->nd_next->nd_head) == NODE_HASH) {
/* DSTAR */
tail = tail->nd_next->nd_head->nd_head;
}
assocs = list_concat(assocs, tail);
}
(yyval.val) = assocs;
#endif
(yyval.val)=rb_ary_push((yyvsp[-2].val), get_value((yyvsp[0].val)));
}
#line 12514 "ripper.c"
break;
case 739:
#line 5550 "ripper.y"
{
#if 0
if (nd_type((yyvsp[-2].val)) == NODE_STR) {
nd_set_type((yyvsp[-2].val), NODE_LIT);
RB_OBJ_WRITE(p->ast, &(yyvsp[-2].val)->nd_lit, rb_fstring((yyvsp[-2].val)->nd_lit));
}
(yyval.val) = list_append(p, NEW_LIST((yyvsp[-2].val), &(yyloc)), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-2].val);v2=(yyvsp[0].val);v3=dispatch2(assoc_new,v1,v2);(yyval.val)=v3;}
}
#line 12529 "ripper.c"
break;
case 740:
#line 5561 "ripper.y"
{
#if 0
(yyval.val) = list_append(p, NEW_LIST(NEW_LIT(ID2SYM((yyvsp[-1].val)), &(yylsp[-1])), &(yyloc)), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3;v1=(yyvsp[-1].val);v2=(yyvsp[0].val);v3=dispatch2(assoc_new,v1,v2);(yyval.val)=v3;}
}
#line 12540 "ripper.c"
break;
case 741:
#line 5568 "ripper.y"
{
#if 0
YYLTYPE loc = code_loc_gen(&(yylsp[-3]), &(yylsp[-1]));
(yyval.val) = list_append(p, NEW_LIST(dsym_node(p, (yyvsp[-2].val), &loc), &loc), (yyvsp[0].val));
#endif
{VALUE v1,v2,v3,v4,v5;v1=(yyvsp[-2].val);v2=dispatch1(dyna_symbol,v1);v3=v2;v4=(yyvsp[0].val);v5=dispatch2(assoc_new,v3,v4);(yyval.val)=v5;}
}
#line 12552 "ripper.c"
break;
case 742:
#line 5576 "ripper.y"
{
#if 0
if (nd_type((yyvsp[0].val)) == NODE_HASH &&
!((yyvsp[0].val)->nd_head && (yyvsp[0].val)->nd_head->nd_alen)) {
static VALUE empty_hash;
if (!empty_hash) {
empty_hash = rb_obj_freeze(rb_hash_new());
rb_gc_register_mark_object(empty_hash);
}
(yyval.val) = list_append(p, NEW_LIST(0, &(yyloc)), NEW_LIT(empty_hash, &(yyloc)));
}
else
(yyval.val) = list_append(p, NEW_LIST(0, &(yyloc)), (yyvsp[0].val));
#endif
{VALUE v1,v2;v1=(yyvsp[0].val);v2=dispatch1(assoc_splat,v1);(yyval.val)=v2;}
}
#line 12573 "ripper.c"
break;
case 769:
#line 5644 "ripper.y"
{yyerrok;token_flush(p);}
#line 12579 "ripper.c"
break;
case 770:
#line 5645 "ripper.y"
{token_flush(p);}
#line 12585 "ripper.c"
break;
case 772:
#line 5649 "ripper.y"
{yyerrok;}
#line 12591 "ripper.c"
break;
case 773:
#line 5653 "ripper.y"
{
(yyval.val) = Qnull;
}
#line 12599 "ripper.c"
break;
#line 12603 "ripper.c"
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
that yytoken be updated with the new translation. We take the
approach of translating immediately before every use of yytoken.
One alternative is translating here after every semantic action,
but that translation would be missed if the semantic action invokes
YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
incorrect destructor might then be invoked immediately. In the
case of YYERROR or YYBACKUP, subsequent parser actions might lead
to an incorrect destructor call or verbose syntax error message
before the lookahead is translated. */
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
YYPOPSTACK (yylen);
yylen = 0;
YY_STACK_PRINT (yyss, yyssp);
*++yyvsp = yyval;
*++yylsp = yyloc;
/* Now 'shift' the result of the reduction. Determine what state
that goes to, based on the state we popped back to and the rule
number reduced by. */
{
const int yylhs = yyr1[yyn] - YYNTOKENS;
const int yyi = yypgoto[yylhs] + *yyssp;
yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
? yytable[yyi]
: yydefgoto[yylhs]);
}
goto yynewstate;
/*--------------------------------------.
| yyerrlab -- here on detecting error. |
`--------------------------------------*/
yyerrlab:
/* Make sure we have latest lookahead translation. See comments at
user semantic actions for why this is necessary. */
yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
/* If not already recovering from an error, report this error. */
if (!yyerrstatus)
{
++yynerrs;
#if ! YYERROR_VERBOSE
yyerror (&yylloc, p, YY_("syntax error"));
#else
# define YYSYNTAX_ERROR yysyntax_error (p, &yymsg_alloc, &yymsg, \
yyssp, yytoken)
{
char const *yymsgp = YY_("syntax error");
int yysyntax_error_status;
yysyntax_error_status = YYSYNTAX_ERROR;
if (yysyntax_error_status == 0)
yymsgp = yymsg;
else if (yysyntax_error_status == 1)
{
if (yymsg != yymsgbuf)
YYSTACK_FREE (yymsg);
yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
if (!yymsg)
{
yymsg = yymsgbuf;
yymsg_alloc = sizeof yymsgbuf;
yysyntax_error_status = 2;
}
else
{
yysyntax_error_status = YYSYNTAX_ERROR;
yymsgp = yymsg;
}
}
yyerror (&yylloc, p, yymsgp);
if (yysyntax_error_status == 2)
goto yyexhaustedlab;
}
# undef YYSYNTAX_ERROR
#endif
}
yyerror_range[1] = yylloc;
if (yyerrstatus == 3)
{
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= YYEOF)
{
/* Return failure if at end of input. */
if (yychar == YYEOF)
YYABORT;
}
else
{
yydestruct ("Error: discarding",
yytoken, &yylval, &yylloc, p);
yychar = YYEMPTY;
}
}
/* Else will try to reuse lookahead token after shifting the error
token. */
goto yyerrlab1;
/*---------------------------------------------------.
| yyerrorlab -- error raised explicitly by YYERROR. |
`---------------------------------------------------*/
yyerrorlab:
/* Pacify compilers when the user code never invokes YYERROR and the
label yyerrorlab therefore never appears in user code. */
if (0)
YYERROR;
/* Do not reclaim the symbols of the rule whose action triggered
this YYERROR. */
YYPOPSTACK (yylen);
yylen = 0;
YY_STACK_PRINT (yyss, yyssp);
yystate = *yyssp;
goto yyerrlab1;
/*-------------------------------------------------------------.
| yyerrlab1 -- common code for both syntax error and YYERROR. |
`-------------------------------------------------------------*/
yyerrlab1:
yyerrstatus = 3; /* Each real token shifted decrements this. */
for (;;)
{
yyn = yypact[yystate];
if (!yypact_value_is_default (yyn))
{
yyn += YYTERROR;
if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
{
yyn = yytable[yyn];
if (0 < yyn)
break;
}
}
/* Pop the current state because it cannot handle the error token. */
if (yyssp == yyss)
YYABORT;
yyerror_range[1] = *yylsp;
yydestruct ("Error: popping",
yystos[yystate], yyvsp, yylsp, p);
YYPOPSTACK (1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
}
YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
*++yyvsp = yylval;
YY_IGNORE_MAYBE_UNINITIALIZED_END
yyerror_range[2] = yylloc;
/* Using YYLLOC is tempting, but would change the location of
the lookahead. YYLOC is available though. */
YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
*++yylsp = yyloc;
/* Shift the error token. */
YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
yystate = yyn;
goto yynewstate;
/*-------------------------------------.
| yyacceptlab -- YYACCEPT comes here. |
`-------------------------------------*/
yyacceptlab:
yyresult = 0;
goto yyreturn;
/*-----------------------------------.
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
yyresult = 1;
goto yyreturn;
#if !defined yyoverflow || YYERROR_VERBOSE
/*-------------------------------------------------.
| yyexhaustedlab -- memory exhaustion comes here. |
`-------------------------------------------------*/
yyexhaustedlab:
yyerror (&yylloc, p, YY_("memory exhausted"));
yyresult = 2;
/* Fall through. */
#endif
/*-----------------------------------------------------.
| yyreturn -- parsing is finished, return the result. |
`-----------------------------------------------------*/
yyreturn:
if (yychar != YYEMPTY)
{
/* Make sure we have latest lookahead translation. See comments at
user semantic actions for why this is necessary. */
yytoken = YYTRANSLATE (yychar);
yydestruct ("Cleanup: discarding lookahead",
yytoken, &yylval, &yylloc, p);
}
/* Do not reclaim the symbols of the rule whose action triggered
this YYABORT or YYACCEPT. */
YYPOPSTACK (yylen);
YY_STACK_PRINT (yyss, yyssp);
while (yyssp != yyss)
{
yydestruct ("Cleanup: popping",
yystos[+*yyssp], yyvsp, yylsp, p);
YYPOPSTACK (1);
}
#ifndef yyoverflow
if (yyss != yyssa)
YYSTACK_FREE (yyss);
#endif
#if YYERROR_VERBOSE
if (yymsg != yymsgbuf)
YYSTACK_FREE (yymsg);
#endif
return yyresult;
}

(and parser_yylex is 707 lines long)

@eregon
Copy link
Member Author

eregon commented Oct 28, 2022

One longer-term solution is using the new Ruby parser YARP, which should be able to emulate Ripper and that parser would run natively not on Sulong.

@eregon
Copy link
Member Author

eregon commented Nov 28, 2023

With #3118 Ripper is now executed natively and so Ripper (and notably ripper_yyparse) is compiled by gcc/clang.
It's about 10 times faster:

$ ruby -rbenchmark -rripper -e 'c=File.binread("src/main/ruby/truffleruby/core/io.rb"); 10.times { p Benchmark.realtime { Ripper.sexp(c) } }'
using last iteration, all Oracle GraalVM

TruffleRuby 23.1.1 JVM
4.14s
TruffleRuby 23.1.1 Native
9.8s
master Native
0.55s
master JVM
0.48s

Still slower than CRuby 3.2.2 which does it in 0.008s though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant