rubinius-melbourne 2.1.0.0 → 2.2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/ext/rubinius/melbourne/extconf.rb +4 -13
- data/ext/rubinius/melbourne/grammar.cpp +4788 -4044
- data/ext/rubinius/melbourne/grammar.y +919 -485
- data/ext/rubinius/melbourne/melbourne.cpp +3 -8
- data/ext/rubinius/melbourne/node.hpp +25 -1
- data/ext/rubinius/melbourne/node_types.cpp +74 -66
- data/ext/rubinius/melbourne/node_types.hpp +5 -1
- data/ext/rubinius/melbourne/node_types.rb +5 -0
- data/ext/rubinius/melbourne/parser_state.hpp +40 -15
- data/ext/rubinius/melbourne/symbols.cpp +6 -0
- data/ext/rubinius/melbourne/symbols.hpp +3 -0
- data/ext/rubinius/melbourne/visitor.cpp +75 -52
- data/lib/rubinius/melbourne/version.rb +2 -2
- data/lib/rubinius/melbourne.rb +2 -2
- data/rubinius-melbourne.gemspec +1 -4
- data/spec/array_spec.rb +20 -0
- data/spec/custom/matchers/parse_as.rb +2 -1
- data/spec/defn_spec.rb +556 -265
- data/spec/defs_spec.rb +63 -40
- data/spec/dstr_spec.rb +1 -2
- data/spec/ensure_spec.rb +12 -8
- data/spec/flip2_spec.rb +38 -2
- data/spec/hash_spec.rb +47 -0
- data/spec/iter_spec.rb +371 -244
- data/spec/lambda_spec.rb +107 -0
- data/spec/lit_spec.rb +16 -0
- data/spec/masgn_spec.rb +97 -301
- data/spec/rescue_spec.rb +12 -6
- data/spec/spec_helper.rb +6 -7
- data/spec/while_spec.rb +9 -6
- metadata +4 -16
@@ -15,6 +15,8 @@
|
|
15
15
|
#define YYDEBUG 1
|
16
16
|
#define YYERROR_VERBOSE 1
|
17
17
|
|
18
|
+
#include <string.h>
|
19
|
+
|
18
20
|
#include "namespace.h"
|
19
21
|
#include "melbourne.hpp"
|
20
22
|
#include "grammar.hpp"
|
@@ -54,17 +56,17 @@ static int parser_yyerror(rb_parser_state*, const char *);
|
|
54
56
|
|
55
57
|
static int yylex(void*, void *);
|
56
58
|
|
57
|
-
#define BITSTACK_PUSH(stack, n)
|
58
|
-
#define BITSTACK_POP(stack)
|
59
|
-
#define BITSTACK_LEXPOP(stack)
|
60
|
-
#define BITSTACK_SET_P(stack)
|
59
|
+
#define BITSTACK_PUSH(stack, n) ((stack) = ((stack)<<1)|((n)&1))
|
60
|
+
#define BITSTACK_POP(stack) ((stack) = (stack) >> 1)
|
61
|
+
#define BITSTACK_LEXPOP(stack) ((stack) = ((stack) >> 1) | ((stack) & 1))
|
62
|
+
#define BITSTACK_SET_P(stack) ((stack)&1)
|
61
63
|
|
62
|
-
#define COND_PUSH(n) BITSTACK_PUSH(cond_stack, n)
|
64
|
+
#define COND_PUSH(n) BITSTACK_PUSH(cond_stack, (n))
|
63
65
|
#define COND_POP() BITSTACK_POP(cond_stack)
|
64
66
|
#define COND_LEXPOP() BITSTACK_LEXPOP(cond_stack)
|
65
67
|
#define COND_P() BITSTACK_SET_P(cond_stack)
|
66
68
|
|
67
|
-
#define CMDARG_PUSH(n) BITSTACK_PUSH(cmdarg_stack, n)
|
69
|
+
#define CMDARG_PUSH(n) BITSTACK_PUSH(cmdarg_stack, (n))
|
68
70
|
#define CMDARG_POP() BITSTACK_POP(cmdarg_stack)
|
69
71
|
#define CMDARG_LEXPOP() BITSTACK_LEXPOP(cmdarg_stack)
|
70
72
|
#define CMDARG_P() BITSTACK_SET_P(cmdarg_stack)
|
@@ -101,7 +103,8 @@ static NODE *parser_new_evstr(rb_parser_state*, NODE*);
|
|
101
103
|
static NODE *parser_evstr2dstr(rb_parser_state*, NODE*);
|
102
104
|
static NODE *parser_call_bin_op(rb_parser_state*, NODE*, ID, NODE*);
|
103
105
|
static NODE *parser_call_uni_op(rb_parser_state*, NODE*, ID);
|
104
|
-
static NODE *parser_new_args(rb_parser_state*, NODE*, NODE*, ID, NODE*,
|
106
|
+
static NODE *parser_new_args(rb_parser_state*, NODE*, NODE*, ID, NODE*, NODE*);
|
107
|
+
static NODE *parser_new_args_tail(rb_parser_state*, NODE*, ID, ID);
|
105
108
|
static NODE *splat_array(NODE*);
|
106
109
|
|
107
110
|
static NODE *parser_negate_lit(rb_parser_state*, NODE*);
|
@@ -125,6 +128,9 @@ static NODE *parser_aryset(rb_parser_state*, NODE*, NODE*);
|
|
125
128
|
static NODE *parser_attrset(rb_parser_state*, NODE*, ID);
|
126
129
|
static void rb_parser_backref_error(rb_parser_state*, NODE*);
|
127
130
|
static NODE *parser_node_assign(rb_parser_state*, NODE*, NODE*);
|
131
|
+
static NODE *parser_new_op_assign(rb_parser_state*, NODE*, ID, NODE*);
|
132
|
+
static NODE *parser_new_attr_op_assign(rb_parser_state*, NODE*, ID, ID, NODE*);
|
133
|
+
static NODE *parser_new_const_op_assign(rb_parser_state*, NODE*, ID, NODE*);
|
128
134
|
|
129
135
|
static NODE *parser_match_op(rb_parser_state*, NODE*, NODE*);
|
130
136
|
static int parser_arg_var(rb_parser_state*, ID);
|
@@ -155,6 +161,7 @@ rb_parser_state *parser_alloc_state() {
|
|
155
161
|
class_nest = 0;
|
156
162
|
in_single = 0;
|
157
163
|
in_def = 0;
|
164
|
+
brace_nest = 0;
|
158
165
|
compile_for_eval = 0;
|
159
166
|
cur_mid = 0;
|
160
167
|
tokenbuf = NULL;
|
@@ -241,6 +248,23 @@ static int rb_compile_error(rb_parser_state* parser_state, const char *fmt, ...)
|
|
241
248
|
return count;
|
242
249
|
}
|
243
250
|
|
251
|
+
static void
|
252
|
+
rb_name_error(ID id, const char *fmt, ...)
|
253
|
+
{
|
254
|
+
char msg[BUFSIZ];
|
255
|
+
VALUE exc, argv[2];
|
256
|
+
va_list args;
|
257
|
+
|
258
|
+
va_start(args, fmt);
|
259
|
+
vsnprintf(msg, BUFSIZ, fmt, args);
|
260
|
+
argv[0] = rb_str_new2(msg);
|
261
|
+
va_end(args);
|
262
|
+
|
263
|
+
argv[1] = ID2SYM(id);
|
264
|
+
exc = rb_class_new_instance(2, argv, rb_eNameError);
|
265
|
+
rb_exc_raise(exc);
|
266
|
+
}
|
267
|
+
|
244
268
|
static int _debug_print(const char *fmt, ...) {
|
245
269
|
#if SHOW_PARSER_WARNS
|
246
270
|
va_list ar;
|
@@ -285,9 +309,13 @@ static int scan_hex(const char *start, size_t len, size_t *retlen);
|
|
285
309
|
#define arg_concat(a, b) parser_arg_concat(parser_state, a, b)
|
286
310
|
#define list_append(l, i) parser_list_append(parser_state, l, i)
|
287
311
|
#define node_assign(a, b) parser_node_assign(parser_state, a, b)
|
312
|
+
#define new_op_assign(l, o, r) parser_new_op_assign(parser_state, l, o, r)
|
313
|
+
#define new_attr_op_assign(l,a,o,r) parser_new_attr_op_assign(parser_state, l, a, o, r)
|
314
|
+
#define new_const_op_assign(l,o,r) parser_new_const_op_assign(parser_state, l, o, r)
|
288
315
|
#define call_bin_op(a, s, b) parser_call_bin_op(parser_state, a, s, b)
|
289
316
|
#define call_uni_op(n, s) parser_call_uni_op(parser_state, n, s)
|
290
|
-
#define new_args(f,o,r,p,
|
317
|
+
#define new_args(f,o,r,p,t) parser_new_args(parser_state, f, o, r, p, t)
|
318
|
+
#define new_args_tail(k,kr,b) parser_new_args_tail(parser_state, k, kr, b)
|
291
319
|
#define negate_lit(n) parser_negate_lit(parser_state, n)
|
292
320
|
#define ret_args(n) parser_ret_args(parser_state, n)
|
293
321
|
#define assignable(a, b) parser_assignable(parser_state, a, b)
|
@@ -378,7 +406,8 @@ static int scan_hex(const char *start, size_t len, size_t *retlen);
|
|
378
406
|
#define ENC_SINGLE(cr) ((cr)==ENC_CODERANGE_7BIT)
|
379
407
|
#define TOK_INTERN(mb) parser_intern3(tok(), toklen(), parser_state->enc)
|
380
408
|
|
381
|
-
#define NEW_BLOCK_VAR(b, v)
|
409
|
+
#define NEW_BLOCK_VAR(b, v) NEW_NODE(NODE_BLOCK_PASS, 0, b, v)
|
410
|
+
#define NEW_REQ_KW NEW_LIT(ID2SYM(parser_intern("*")))
|
382
411
|
|
383
412
|
/* Older versions of Yacc set YYMAXDEPTH to a very low value by default (150,
|
384
413
|
for instance). This is too low for Ruby to parse some files, such as
|
@@ -455,32 +484,34 @@ static int scan_hex(const char *start, size_t len, size_t *retlen);
|
|
455
484
|
keyword__ENCODING__
|
456
485
|
|
457
486
|
%token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL
|
458
|
-
%token <node> tINTEGER tFLOAT tSTRING_CONTENT tCHAR
|
487
|
+
%token <node> tINTEGER tFLOAT tRATIONAL tIMAGINARY tSTRING_CONTENT tCHAR
|
459
488
|
%token <node> tNTH_REF tBACK_REF
|
460
489
|
%token <num> tREGEXP_END
|
461
490
|
|
462
491
|
%type <node> singleton strings string string1 xstring regexp
|
463
492
|
%type <node> string_contents xstring_contents regexp_contents string_content
|
464
|
-
%type <node> words qwords word_list qword_list word
|
465
|
-
%type <node> literal numeric dsym cpath
|
493
|
+
%type <node> words symbols symbol_list qwords qsymbols word_list qword_list qsym_list word
|
494
|
+
%type <node> literal numeric simple_numeric dsym cpath
|
466
495
|
%type <node> top_compstmt top_stmts top_stmt
|
467
|
-
%type <node> bodystmt compstmt stmts stmt expr arg primary command command_call method_call
|
468
|
-
%type <node> expr_value arg_value primary_value
|
496
|
+
%type <node> bodystmt compstmt stmts stmt_or_begin stmt expr arg primary command command_call method_call
|
497
|
+
%type <node> expr_value arg_value primary_value fcall
|
469
498
|
%type <node> if_tail opt_else case_body cases opt_rescue exc_list exc_var opt_ensure
|
470
499
|
%type <node> args call_args opt_call_args
|
471
|
-
%type <node> paren_args opt_paren_args
|
500
|
+
%type <node> paren_args opt_paren_args args_tail opt_args_tail block_args_tail opt_block_args_tail
|
472
501
|
%type <node> command_args aref_args opt_block_arg block_arg var_ref var_lhs
|
473
|
-
%type <node> command_asgn mrhs superclass block_call block_command
|
502
|
+
%type <node> command_asgn mrhs mrhs_arg superclass block_call block_command
|
474
503
|
%type <node> f_block_optarg f_block_opt
|
475
504
|
%type <node> f_arglist f_args f_arg f_arg_item f_optarg f_marg f_marg_list f_margs
|
476
505
|
%type <node> assoc_list assocs assoc undef_list backref string_dvar for_var
|
477
506
|
%type <node> block_param opt_block_param block_param_def f_opt
|
507
|
+
%type <node> f_kwarg f_kw f_block_kwarg f_block_kw
|
478
508
|
%type <node> bv_decls opt_bv_decl bvar
|
479
509
|
%type <node> lambda f_larglist lambda_body
|
480
510
|
%type <node> brace_block cmd_brace_block do_block lhs none fitem
|
481
511
|
%type <node> mlhs mlhs_head mlhs_basic mlhs_item mlhs_node mlhs_post mlhs_inner
|
482
512
|
%type <id> fsym keyword_variable user_variable sym symbol operation operation2 operation3
|
483
513
|
%type <id> cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg f_bad_arg
|
514
|
+
%type <id> f_kwrest f_label
|
484
515
|
|
485
516
|
%token tUPLUS /* unary+ */
|
486
517
|
%token tUMINUS /* unary- */
|
@@ -507,10 +538,11 @@ static int scan_hex(const char *start, size_t len, size_t *retlen);
|
|
507
538
|
%token tLBRACE /* { */
|
508
539
|
%token tLBRACE_ARG /* { */
|
509
540
|
%token tSTAR /* * */
|
541
|
+
%token tDSTAR /* ** */
|
510
542
|
%token tAMPER /* & */
|
511
543
|
%token tLAMBDA /* -> */
|
512
|
-
%token tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG
|
513
|
-
%token tSTRING_DBEG tSTRING_DVAR tSTRING_END tLAMBEG
|
544
|
+
%token tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG tSYMBOLS_BEG tQSYMBOLS_BEG
|
545
|
+
%token tSTRING_DBEG tSTRING_DEND tSTRING_DVAR tSTRING_END tLAMBEG
|
514
546
|
|
515
547
|
/*
|
516
548
|
* precedence table
|
@@ -640,11 +672,11 @@ stmts : none
|
|
640
672
|
{
|
641
673
|
$$ = NEW_BEGIN(0);
|
642
674
|
}
|
643
|
-
|
|
675
|
+
| stmt_or_begin
|
644
676
|
{
|
645
677
|
$$ = newline_node($1);
|
646
678
|
}
|
647
|
-
| stmts terms
|
679
|
+
| stmts terms stmt_or_begin
|
648
680
|
{
|
649
681
|
$$ = block_append($1, newline_node($3));
|
650
682
|
}
|
@@ -654,6 +686,20 @@ stmts : none
|
|
654
686
|
}
|
655
687
|
;
|
656
688
|
|
689
|
+
stmt_or_begin : stmt
|
690
|
+
{
|
691
|
+
$$ = $1;
|
692
|
+
}
|
693
|
+
| keyword_BEGIN
|
694
|
+
{
|
695
|
+
yy_error("BEGIN is permitted only at toplevel");
|
696
|
+
}
|
697
|
+
'{' top_compstmt '}'
|
698
|
+
{
|
699
|
+
$$ = NEW_BEGIN(0);
|
700
|
+
}
|
701
|
+
;
|
702
|
+
|
657
703
|
stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
|
658
704
|
{
|
659
705
|
$$ = NEW_ALIAS($2, $4);
|
@@ -722,30 +768,13 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
|
|
722
768
|
| mlhs '=' command_call
|
723
769
|
{
|
724
770
|
value_expr($3);
|
725
|
-
$1->nd_value =
|
771
|
+
$1->nd_value = $3;
|
726
772
|
$$ = $1;
|
727
773
|
}
|
728
774
|
| var_lhs tOP_ASGN command_call
|
729
775
|
{
|
730
776
|
value_expr($3);
|
731
|
-
|
732
|
-
ID vid = $1->nd_vid;
|
733
|
-
if($2 == tOROP) {
|
734
|
-
$1->nd_value = $3;
|
735
|
-
$$ = NEW_OP_ASGN_OR(gettable(vid), $1);
|
736
|
-
if(is_asgn_or_id(vid)) {
|
737
|
-
$$->nd_aid = vid;
|
738
|
-
}
|
739
|
-
} else if($2 == tANDOP) {
|
740
|
-
$1->nd_value = $3;
|
741
|
-
$$ = NEW_OP_ASGN_AND(gettable(vid), $1);
|
742
|
-
} else {
|
743
|
-
$$ = $1;
|
744
|
-
$$->nd_value = call_bin_op(gettable(vid), $2, $3);
|
745
|
-
}
|
746
|
-
} else {
|
747
|
-
$$ = NEW_BEGIN(0);
|
748
|
-
}
|
777
|
+
$$ = new_op_assign($1, $2, $3);
|
749
778
|
}
|
750
779
|
| primary_value '[' opt_call_args rbracket tOP_ASGN command_call
|
751
780
|
{
|
@@ -767,69 +796,41 @@ stmt : keyword_alias fitem {lex_state = EXPR_FNAME;} fitem
|
|
767
796
|
| primary_value '.' tIDENTIFIER tOP_ASGN command_call
|
768
797
|
{
|
769
798
|
value_expr($5);
|
770
|
-
|
771
|
-
$4 = 0;
|
772
|
-
} else if($4 == tANDOP) {
|
773
|
-
$4 = 1;
|
774
|
-
} else {
|
775
|
-
$4 = convert_op($4);
|
776
|
-
}
|
777
|
-
$$ = NEW_OP_ASGN2($1, $3, $4, $5);
|
778
|
-
fixpos($$, $1);
|
799
|
+
$$ = new_attr_op_assign($1, $3, $4, $5);
|
779
800
|
}
|
780
801
|
| primary_value '.' tCONSTANT tOP_ASGN command_call
|
781
802
|
{
|
782
803
|
value_expr($5);
|
783
|
-
|
784
|
-
$4 = 0;
|
785
|
-
} else if($4 == tANDOP) {
|
786
|
-
$4 = 1;
|
787
|
-
} else {
|
788
|
-
$4 = convert_op($4);
|
789
|
-
}
|
790
|
-
$$ = NEW_OP_ASGN2($1, $3, $4, $5);
|
791
|
-
fixpos($$, $1);
|
804
|
+
$$ = new_attr_op_assign($1, $3, $4, $5);
|
792
805
|
}
|
793
806
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
|
794
807
|
{
|
795
|
-
|
796
|
-
$$ =
|
808
|
+
$$ = NEW_COLON2($1, $3);
|
809
|
+
$$ = new_const_op_assign($$, $4, $5);
|
797
810
|
}
|
798
811
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
|
799
812
|
{
|
800
813
|
value_expr($5);
|
801
|
-
|
802
|
-
$4 = 0;
|
803
|
-
} else if($4 == tANDOP) {
|
804
|
-
$4 = 1;
|
805
|
-
} else {
|
806
|
-
$4 = convert_op($4);
|
807
|
-
}
|
808
|
-
$$ = NEW_OP_ASGN2($1, $3, $4, $5);
|
809
|
-
fixpos($$, $1);
|
814
|
+
$$ = new_attr_op_assign($1, $3, $4, $5);
|
810
815
|
}
|
811
816
|
| backref tOP_ASGN command_call
|
812
817
|
{
|
813
818
|
rb_backref_error($1);
|
814
|
-
$$ = 0;
|
819
|
+
$$ = NEW_BEGIN(0);
|
815
820
|
}
|
816
821
|
| lhs '=' mrhs
|
817
822
|
{
|
818
823
|
value_expr($3);
|
819
824
|
$$ = node_assign($1, $3);
|
820
825
|
}
|
821
|
-
| mlhs '='
|
822
|
-
{
|
823
|
-
$1->nd_value = ($1->nd_head) ? NEW_TO_ARY($3) : NEW_ARRAY($3);
|
824
|
-
$$ = $1;
|
825
|
-
}
|
826
|
-
| mlhs '=' mrhs
|
826
|
+
| mlhs '=' mrhs_arg
|
827
827
|
{
|
828
828
|
$1->nd_value = $3;
|
829
829
|
$$ = $1;
|
830
830
|
}
|
831
831
|
| expr
|
832
832
|
;
|
833
|
+
|
833
834
|
command_asgn : lhs '=' command_call
|
834
835
|
{
|
835
836
|
value_expr($3);
|
@@ -841,6 +842,7 @@ command_asgn : lhs '=' command_call
|
|
841
842
|
$$ = node_assign($1, $3);
|
842
843
|
}
|
843
844
|
;
|
845
|
+
|
844
846
|
expr : command_call
|
845
847
|
| expr keyword_and expr
|
846
848
|
{
|
@@ -874,11 +876,7 @@ command_call : command
|
|
874
876
|
;
|
875
877
|
|
876
878
|
block_command : block_call
|
877
|
-
| block_call
|
878
|
-
{
|
879
|
-
$$ = NEW_CALL($1, $3, $4);
|
880
|
-
}
|
881
|
-
| block_call tCOLON2 operation2 command_args
|
879
|
+
| block_call dot_or_colon operation2 command_args
|
882
880
|
{
|
883
881
|
$$ = NEW_CALL($1, $3, $4);
|
884
882
|
}
|
@@ -899,17 +897,25 @@ cmd_brace_block : tLBRACE_ARG
|
|
899
897
|
}
|
900
898
|
;
|
901
899
|
|
902
|
-
|
900
|
+
fcall : operation
|
903
901
|
{
|
904
|
-
$$ = NEW_FCALL($1,
|
905
|
-
|
902
|
+
$$ = NEW_FCALL($1, 0);
|
903
|
+
nd_set_line($$, tokline);
|
904
|
+
}
|
905
|
+
;
|
906
|
+
|
907
|
+
command : fcall command_args %prec tLOWEST
|
908
|
+
{
|
909
|
+
$$ = $1;
|
910
|
+
$$->nd_args = $2;
|
906
911
|
}
|
907
|
-
|
|
912
|
+
| fcall command_args cmd_brace_block
|
908
913
|
{
|
909
914
|
block_dup_check($2, $3);
|
910
|
-
$
|
915
|
+
$1->nd_args = $2;
|
916
|
+
$3->nd_iter = $1;
|
911
917
|
$$ = $3;
|
912
|
-
fixpos($$, $
|
918
|
+
fixpos($$, $1);
|
913
919
|
}
|
914
920
|
| primary_value '.' operation2 command_args %prec tLOWEST
|
915
921
|
{
|
@@ -1209,6 +1215,7 @@ op : '|' { $$ = '|'; }
|
|
1209
1215
|
| '/' { $$ = '/'; }
|
1210
1216
|
| '%' { $$ = '%'; }
|
1211
1217
|
| tPOW { $$ = tPOW; }
|
1218
|
+
| tDSTAR { $$ = tDSTAR; }
|
1212
1219
|
| '!' { $$ = '!'; }
|
1213
1220
|
| '~' { $$ = '~'; }
|
1214
1221
|
| tUPLUS { $$ = tUPLUS; }
|
@@ -1246,47 +1253,13 @@ arg : lhs '=' arg
|
|
1246
1253
|
| var_lhs tOP_ASGN arg
|
1247
1254
|
{
|
1248
1255
|
value_expr($3);
|
1249
|
-
|
1250
|
-
ID vid = $1->nd_vid;
|
1251
|
-
if($2 == tOROP) {
|
1252
|
-
$1->nd_value = $3;
|
1253
|
-
$$ = NEW_OP_ASGN_OR(gettable(vid), $1);
|
1254
|
-
if(is_asgn_or_id(vid)) {
|
1255
|
-
$$->nd_aid = vid;
|
1256
|
-
}
|
1257
|
-
} else if($2 == tANDOP) {
|
1258
|
-
$1->nd_value = $3;
|
1259
|
-
$$ = NEW_OP_ASGN_AND(gettable(vid), $1);
|
1260
|
-
} else {
|
1261
|
-
$$ = $1;
|
1262
|
-
$$->nd_value = NEW_CALL(gettable(vid), $2, NEW_LIST($3));
|
1263
|
-
}
|
1264
|
-
} else {
|
1265
|
-
$$ = NEW_BEGIN(0);
|
1266
|
-
}
|
1256
|
+
$$ = new_op_assign($1, $2, $3);
|
1267
1257
|
}
|
1268
1258
|
| var_lhs tOP_ASGN arg modifier_rescue arg
|
1269
1259
|
{
|
1270
1260
|
value_expr($3);
|
1271
1261
|
$3 = NEW_RESCUE($3, NEW_RESBODY(0, $5, 0), 0);
|
1272
|
-
|
1273
|
-
ID vid = $1->nd_vid;
|
1274
|
-
if($2 == tOROP) {
|
1275
|
-
$1->nd_value = $3;
|
1276
|
-
$$ = NEW_OP_ASGN_OR(gettable(vid), $1);
|
1277
|
-
if(is_asgn_or_id(vid)) {
|
1278
|
-
$$->nd_aid = vid;
|
1279
|
-
}
|
1280
|
-
} else if($2 == tANDOP) {
|
1281
|
-
$1->nd_value = $3;
|
1282
|
-
$$ = NEW_OP_ASGN_AND(gettable(vid), $1);
|
1283
|
-
} else {
|
1284
|
-
$$ = $1;
|
1285
|
-
$$->nd_value = NEW_CALL(gettable(vid), $2, NEW_LIST($3));
|
1286
|
-
}
|
1287
|
-
} else {
|
1288
|
-
$$ = NEW_BEGIN(0);
|
1289
|
-
}
|
1262
|
+
new_op_assign($1, $2, $3);
|
1290
1263
|
}
|
1291
1264
|
| primary_value '[' opt_call_args rbracket tOP_ASGN arg
|
1292
1265
|
{
|
@@ -1312,51 +1285,27 @@ arg : lhs '=' arg
|
|
1312
1285
|
| primary_value '.' tIDENTIFIER tOP_ASGN arg
|
1313
1286
|
{
|
1314
1287
|
value_expr($5);
|
1315
|
-
|
1316
|
-
$4 = 0;
|
1317
|
-
} else if($4 == tANDOP) {
|
1318
|
-
$4 = 1;
|
1319
|
-
} else {
|
1320
|
-
$4 = convert_op($4);
|
1321
|
-
}
|
1322
|
-
$$ = NEW_OP_ASGN2($1, $3, $4, $5);
|
1323
|
-
fixpos($$, $1);
|
1288
|
+
$$ = new_attr_op_assign($1, $3, $4, $5);
|
1324
1289
|
}
|
1325
1290
|
| primary_value '.' tCONSTANT tOP_ASGN arg
|
1326
1291
|
{
|
1327
1292
|
value_expr($5);
|
1328
|
-
|
1329
|
-
$4 = 0;
|
1330
|
-
} else if($4 == tANDOP) {
|
1331
|
-
$4 = 1;
|
1332
|
-
} else {
|
1333
|
-
$4 = convert_op($4);
|
1334
|
-
}
|
1335
|
-
$$ = NEW_OP_ASGN2($1, $3, $4, $5);
|
1336
|
-
fixpos($$, $1);
|
1293
|
+
$$ = new_attr_op_assign($1, $3, $4, $5);
|
1337
1294
|
}
|
1338
1295
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
|
1339
1296
|
{
|
1340
1297
|
value_expr($5);
|
1341
|
-
|
1342
|
-
$4 = 0;
|
1343
|
-
} else if($4 == tANDOP) {
|
1344
|
-
$4 = 1;
|
1345
|
-
} else {
|
1346
|
-
$4 = convert_op($4);
|
1347
|
-
}
|
1348
|
-
$$ = NEW_OP_ASGN2($1, $3, $4, $5);
|
1349
|
-
fixpos($$, $1);
|
1298
|
+
$$ = new_attr_op_assign($1, $3, $4, $5);
|
1350
1299
|
}
|
1351
1300
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN arg
|
1352
1301
|
{
|
1353
|
-
|
1354
|
-
$$ =
|
1302
|
+
$$ = NEW_COLON2($1, $3);
|
1303
|
+
$$ = new_const_op_assign($$, $4, $5);
|
1355
1304
|
}
|
1356
1305
|
| tCOLON3 tCONSTANT tOP_ASGN arg
|
1357
1306
|
{
|
1358
|
-
|
1359
|
-
$$ =
|
1307
|
+
$$ = NEW_COLON3($2);
|
1308
|
+
$$ = new_const_op_assign($$, $3, $4);
|
1360
1309
|
}
|
1361
1310
|
| backref tOP_ASGN arg
|
1362
1311
|
{
|
@@ -1399,11 +1348,7 @@ arg : lhs '=' arg
|
|
1399
1348
|
{
|
1400
1349
|
$$ = call_bin_op($1, tPOW, $3);
|
1401
1350
|
}
|
1402
|
-
| tUMINUS_NUM
|
1403
|
-
{
|
1404
|
-
$$ = NEW_CALL(call_bin_op($2, tPOW, $4), tUMINUS, 0);
|
1405
|
-
}
|
1406
|
-
| tUMINUS_NUM tFLOAT tPOW arg
|
1351
|
+
| tUMINUS_NUM simple_numeric tPOW arg
|
1407
1352
|
{
|
1408
1353
|
$$ = NEW_CALL(call_bin_op($2, tPOW, $4), tUMINUS, 0);
|
1409
1354
|
}
|
@@ -1549,6 +1494,18 @@ opt_paren_args : none
|
|
1549
1494
|
|
1550
1495
|
opt_call_args : none
|
1551
1496
|
| call_args
|
1497
|
+
| args ','
|
1498
|
+
{
|
1499
|
+
$$ = $1;
|
1500
|
+
}
|
1501
|
+
| args ',' assocs ','
|
1502
|
+
{
|
1503
|
+
$$ = arg_append($1, NEW_HASH($3));
|
1504
|
+
}
|
1505
|
+
| assocs ','
|
1506
|
+
{
|
1507
|
+
$$ = NEW_LIST(NEW_HASH($1));
|
1508
|
+
}
|
1552
1509
|
;
|
1553
1510
|
|
1554
1511
|
call_args : command
|
@@ -1595,10 +1552,6 @@ opt_block_arg : ',' block_arg
|
|
1595
1552
|
{
|
1596
1553
|
$$ = $2;
|
1597
1554
|
}
|
1598
|
-
| ','
|
1599
|
-
{
|
1600
|
-
$$ = 0;
|
1601
|
-
}
|
1602
1555
|
| none
|
1603
1556
|
{
|
1604
1557
|
$$ = 0;
|
@@ -1633,6 +1586,10 @@ args : arg_value
|
|
1633
1586
|
}
|
1634
1587
|
;
|
1635
1588
|
|
1589
|
+
mrhs_arg : mrhs
|
1590
|
+
| arg_value
|
1591
|
+
;
|
1592
|
+
|
1636
1593
|
mrhs : args ',' arg_value
|
1637
1594
|
{
|
1638
1595
|
NODE *n1;
|
@@ -1663,6 +1620,8 @@ primary : literal
|
|
1663
1620
|
| regexp
|
1664
1621
|
| words
|
1665
1622
|
| qwords
|
1623
|
+
| symbols
|
1624
|
+
| qsymbols
|
1666
1625
|
| var_ref
|
1667
1626
|
| backref
|
1668
1627
|
| tFID
|
@@ -1671,11 +1630,14 @@ primary : literal
|
|
1671
1630
|
}
|
1672
1631
|
| k_begin
|
1673
1632
|
{
|
1633
|
+
$<val>1 = cmdarg_stack;
|
1634
|
+
cmdarg_stack = 0;
|
1674
1635
|
$<num>$ = sourceline;
|
1675
1636
|
}
|
1676
1637
|
bodystmt
|
1677
1638
|
k_end
|
1678
1639
|
{
|
1640
|
+
cmdarg_stack = $<val>1;
|
1679
1641
|
if($3 == NULL) {
|
1680
1642
|
$$ = NEW_NIL();
|
1681
1643
|
} else {
|
@@ -1686,9 +1648,12 @@ primary : literal
|
|
1686
1648
|
}
|
1687
1649
|
nd_set_line($$, $<num>2);
|
1688
1650
|
}
|
1651
|
+
| tLPAREN_ARG {lex_state = EXPR_ENDARG;} rparen
|
1652
|
+
{
|
1653
|
+
$$ = 0;
|
1654
|
+
}
|
1689
1655
|
| tLPAREN_ARG expr {lex_state = EXPR_ENDARG;} rparen
|
1690
1656
|
{
|
1691
|
-
rb_warning("(...) interpreted as grouped expression");
|
1692
1657
|
$$ = $2;
|
1693
1658
|
}
|
1694
1659
|
| tLPAREN compstmt ')'
|
@@ -1744,9 +1709,9 @@ primary : literal
|
|
1744
1709
|
{
|
1745
1710
|
$$ = call_uni_op(cond(NEW_NIL()), '!');
|
1746
1711
|
}
|
1747
|
-
|
|
1712
|
+
| fcall brace_block
|
1748
1713
|
{
|
1749
|
-
$2->nd_iter =
|
1714
|
+
$2->nd_iter = $1;
|
1750
1715
|
$$ = $2;
|
1751
1716
|
fixpos($2->nd_iter, $2);
|
1752
1717
|
}
|
@@ -2095,63 +2060,91 @@ f_margs : f_marg_list
|
|
2095
2060
|
}
|
2096
2061
|
;
|
2097
2062
|
|
2098
|
-
|
2063
|
+
block_args_tail : f_block_kwarg ',' f_kwrest opt_f_block_arg
|
2064
|
+
{
|
2065
|
+
$$ = new_args_tail($1, $3, $4);
|
2066
|
+
}
|
2067
|
+
| f_block_kwarg opt_f_block_arg
|
2068
|
+
{
|
2069
|
+
$$ = new_args_tail($1, 0, $2);
|
2070
|
+
}
|
2071
|
+
| f_kwrest opt_f_block_arg
|
2072
|
+
{
|
2073
|
+
$$ = new_args_tail(0, $1, $2);
|
2074
|
+
}
|
2075
|
+
| f_block_arg
|
2076
|
+
{
|
2077
|
+
$$ = new_args_tail(0, 0, $1);
|
2078
|
+
}
|
2079
|
+
;
|
2080
|
+
|
2081
|
+
opt_block_args_tail : ',' block_args_tail
|
2082
|
+
{
|
2083
|
+
$$ = $2;
|
2084
|
+
}
|
2085
|
+
| /* none */
|
2086
|
+
{
|
2087
|
+
$$ = new_args_tail(0, 0, 0);
|
2088
|
+
}
|
2089
|
+
;
|
2090
|
+
|
2091
|
+
block_param : f_arg ',' f_block_optarg ',' f_rest_arg opt_block_args_tail
|
2099
2092
|
{
|
2100
2093
|
$$ = new_args($1, $3, $5, 0, $6);
|
2101
2094
|
}
|
2102
|
-
| f_arg ',' f_block_optarg ',' f_rest_arg ',' f_arg
|
2095
|
+
| f_arg ',' f_block_optarg ',' f_rest_arg ',' f_arg opt_block_args_tail
|
2103
2096
|
{
|
2104
2097
|
$$ = new_args($1, $3, $5, $7, $8);
|
2105
2098
|
}
|
2106
|
-
| f_arg ',' f_block_optarg
|
2099
|
+
| f_arg ',' f_block_optarg opt_block_args_tail
|
2107
2100
|
{
|
2108
2101
|
$$ = new_args($1, $3, 0, 0, $4);
|
2109
2102
|
}
|
2110
|
-
| f_arg ',' f_block_optarg ',' f_arg
|
2103
|
+
| f_arg ',' f_block_optarg ',' f_arg opt_block_args_tail
|
2111
2104
|
{
|
2112
2105
|
$$ = new_args($1, $3, 0, $5, $6);
|
2113
2106
|
}
|
2114
|
-
| f_arg ',' f_rest_arg
|
2107
|
+
| f_arg ',' f_rest_arg opt_block_args_tail
|
2115
2108
|
{
|
2116
2109
|
$$ = new_args($1, 0, $3, 0, $4);
|
2117
2110
|
}
|
2118
2111
|
| f_arg ','
|
2119
2112
|
{
|
2120
|
-
$$ = new_args($1, 0, 1, 0, 0);
|
2113
|
+
$$ = new_args($1, 0, 1, 0, new_args_tail(0, 0, 0));
|
2121
2114
|
}
|
2122
|
-
| f_arg ',' f_rest_arg ',' f_arg
|
2115
|
+
| f_arg ',' f_rest_arg ',' f_arg opt_block_args_tail
|
2123
2116
|
{
|
2124
2117
|
$$ = new_args($1, 0, $3, $5, $6);
|
2125
2118
|
}
|
2126
|
-
| f_arg
|
2119
|
+
| f_arg opt_block_args_tail
|
2127
2120
|
{
|
2128
2121
|
$$ = new_args($1, 0, 0, 0, $2);
|
2129
2122
|
}
|
2130
|
-
| f_block_optarg ',' f_rest_arg
|
2123
|
+
| f_block_optarg ',' f_rest_arg opt_block_args_tail
|
2131
2124
|
{
|
2132
2125
|
$$ = new_args(0, $1, $3, 0, $4);
|
2133
2126
|
}
|
2134
|
-
| f_block_optarg ',' f_rest_arg ',' f_arg
|
2127
|
+
| f_block_optarg ',' f_rest_arg ',' f_arg opt_block_args_tail
|
2135
2128
|
{
|
2136
2129
|
$$ = new_args(0, $1, $3, $5, $6);
|
2137
2130
|
}
|
2138
|
-
| f_block_optarg
|
2131
|
+
| f_block_optarg opt_block_args_tail
|
2139
2132
|
{
|
2140
2133
|
$$ = new_args(0, $1, 0, 0, $2);
|
2141
2134
|
}
|
2142
|
-
| f_block_optarg ',' f_arg
|
2135
|
+
| f_block_optarg ',' f_arg opt_block_args_tail
|
2143
2136
|
{
|
2144
2137
|
$$ = new_args(0, $1, 0, $3, $4);
|
2145
2138
|
}
|
2146
|
-
| f_rest_arg
|
2139
|
+
| f_rest_arg opt_block_args_tail
|
2147
2140
|
{
|
2148
2141
|
$$ = new_args(0, 0, $1, 0, $2);
|
2149
2142
|
}
|
2150
|
-
| f_rest_arg ',' f_arg
|
2143
|
+
| f_rest_arg ',' f_arg opt_block_args_tail
|
2151
2144
|
{
|
2152
2145
|
$$ = new_args(0, 0, $1, $3, $4);
|
2153
2146
|
}
|
2154
|
-
|
|
2147
|
+
| block_args_tail
|
2155
2148
|
{
|
2156
2149
|
$$ = new_args(0, 0, 0, 0, $1);
|
2157
2150
|
}
|
@@ -2166,7 +2159,8 @@ opt_block_param : none
|
|
2166
2159
|
|
2167
2160
|
block_param_def : '|' opt_bv_decl '|'
|
2168
2161
|
{
|
2169
|
-
|
2162
|
+
// This is deliberately different than MRI.
|
2163
|
+
$$ = $2 ? NEW_ARGS_AUX(0, $2) : 0;
|
2170
2164
|
}
|
2171
2165
|
| tOROP
|
2172
2166
|
{
|
@@ -2174,30 +2168,30 @@ block_param_def : '|' opt_bv_decl '|'
|
|
2174
2168
|
}
|
2175
2169
|
| '|' block_param opt_bv_decl '|'
|
2176
2170
|
{
|
2177
|
-
|
2178
|
-
|
2179
|
-
} else {
|
2180
|
-
$$ = $2;
|
2181
|
-
}
|
2171
|
+
// This is deliberately different than MRI.
|
2172
|
+
$$ = $3 ? NEW_ARGS_AUX($2, $3) : $2;
|
2182
2173
|
}
|
2183
2174
|
;
|
2184
2175
|
|
2185
|
-
opt_bv_decl :
|
2176
|
+
opt_bv_decl : opt_nl
|
2186
2177
|
{
|
2187
2178
|
$$ = 0;
|
2188
2179
|
}
|
2189
|
-
| ';' bv_decls
|
2180
|
+
| opt_nl ';' bv_decls
|
2190
2181
|
{
|
2191
|
-
|
2182
|
+
// This is deliberately different than MRI.
|
2183
|
+
$$ = $3;
|
2192
2184
|
}
|
2193
2185
|
;
|
2194
2186
|
|
2195
2187
|
bv_decls : bvar
|
2196
2188
|
{
|
2189
|
+
// This is deliberately different than MRI.
|
2197
2190
|
$$ = NEW_LIST($1);
|
2198
2191
|
}
|
2199
2192
|
| bv_decls ',' bvar
|
2200
2193
|
{
|
2194
|
+
// This is deliberately different than MRI.
|
2201
2195
|
$$ = list_append($1, $3);
|
2202
2196
|
}
|
2203
2197
|
;
|
@@ -2205,6 +2199,7 @@ bv_decls : bvar
|
|
2205
2199
|
bvar : tIDENTIFIER
|
2206
2200
|
{
|
2207
2201
|
new_bv(get_id($1));
|
2202
|
+
// This is deliberately different than MRI.
|
2208
2203
|
$$ = NEW_LIT(ID2SYM(get_id($1)));
|
2209
2204
|
}
|
2210
2205
|
| f_bad_arg
|
@@ -2221,22 +2216,25 @@ lambda : {
|
|
2221
2216
|
lpar_beg = ++paren_nest;
|
2222
2217
|
}
|
2223
2218
|
f_larglist
|
2219
|
+
{
|
2220
|
+
$<num>$ = sourceline;
|
2221
|
+
}
|
2224
2222
|
lambda_body
|
2225
2223
|
{
|
2226
2224
|
lpar_beg = $<num>2;
|
2227
|
-
$$ = $3;
|
2228
|
-
|
2225
|
+
$$ = NEW_LAMBDA($3, $5);
|
2226
|
+
nd_set_line($$, $<num>4);
|
2229
2227
|
bv_pop($<vars>1);
|
2230
2228
|
}
|
2231
2229
|
;
|
2232
2230
|
|
2233
|
-
f_larglist : '(' f_args opt_bv_decl
|
2231
|
+
f_larglist : '(' f_args opt_bv_decl ')'
|
2234
2232
|
{
|
2235
|
-
$$ =
|
2233
|
+
$$ = $2;
|
2236
2234
|
}
|
2237
2235
|
| f_args
|
2238
2236
|
{
|
2239
|
-
$$ =
|
2237
|
+
$$ = $1;
|
2240
2238
|
}
|
2241
2239
|
;
|
2242
2240
|
|
@@ -2276,44 +2274,71 @@ block_call : command do_block
|
|
2276
2274
|
$$ = $2;
|
2277
2275
|
fixpos($$, $1);
|
2278
2276
|
}
|
2279
|
-
| block_call
|
2277
|
+
| block_call dot_or_colon operation2 opt_paren_args
|
2280
2278
|
{
|
2281
2279
|
$$ = NEW_CALL($1, $3, $4);
|
2282
2280
|
}
|
2283
|
-
| block_call
|
2281
|
+
| block_call dot_or_colon operation2 opt_paren_args brace_block
|
2284
2282
|
{
|
2285
|
-
|
2283
|
+
block_dup_check($4, $5);
|
2284
|
+
$5->nd_iter = NEW_CALL($1, $3, $4);
|
2285
|
+
$$ = $5;
|
2286
|
+
fixpos($$, $1);
|
2287
|
+
}
|
2288
|
+
| block_call dot_or_colon operation2 command_args do_block
|
2289
|
+
{
|
2290
|
+
block_dup_check($4, $5);
|
2291
|
+
$5->nd_iter = NEW_CALL($1, $3, $4);
|
2292
|
+
$$ = $5;
|
2293
|
+
fixpos($$, $1);
|
2286
2294
|
}
|
2287
2295
|
;
|
2288
2296
|
|
2289
|
-
method_call :
|
2297
|
+
method_call : fcall paren_args
|
2290
2298
|
{
|
2291
|
-
$$ =
|
2299
|
+
$$ = $1;
|
2300
|
+
$$->nd_args = $2;
|
2292
2301
|
fixpos($$, $2);
|
2293
2302
|
}
|
2294
|
-
| primary_value '.' operation2
|
2303
|
+
| primary_value '.' operation2
|
2295
2304
|
{
|
2296
|
-
|
2297
|
-
fixpos($$, $1);
|
2305
|
+
$<num>$ = sourceline;
|
2298
2306
|
}
|
2299
|
-
|
2307
|
+
opt_paren_args
|
2300
2308
|
{
|
2301
|
-
$$ = NEW_CALL($1, $3, $
|
2302
|
-
|
2309
|
+
$$ = NEW_CALL($1, $3, $5);
|
2310
|
+
nd_set_line($$, $<num>4);
|
2311
|
+
}
|
2312
|
+
| primary_value tCOLON2 operation2
|
2313
|
+
{
|
2314
|
+
$<num>$ = sourceline;
|
2315
|
+
}
|
2316
|
+
paren_args
|
2317
|
+
{
|
2318
|
+
$$ = NEW_CALL($1, $3, $5);
|
2319
|
+
nd_set_line($$, $<num>4);
|
2303
2320
|
}
|
2304
2321
|
| primary_value tCOLON2 operation3
|
2305
2322
|
{
|
2306
2323
|
$$ = NEW_CALL($1, $3, 0);
|
2307
2324
|
}
|
2308
|
-
| primary_value '.'
|
2325
|
+
| primary_value '.'
|
2309
2326
|
{
|
2310
|
-
|
2311
|
-
fixpos($$, $1);
|
2327
|
+
$<num>$ = sourceline;
|
2312
2328
|
}
|
2313
|
-
|
2329
|
+
paren_args
|
2314
2330
|
{
|
2315
|
-
$$ = NEW_CALL($1, parser_intern("call"), $
|
2316
|
-
|
2331
|
+
$$ = NEW_CALL($1, parser_intern("call"), $4);
|
2332
|
+
nd_set_line($$, $<num>3);
|
2333
|
+
}
|
2334
|
+
| primary_value tCOLON2
|
2335
|
+
{
|
2336
|
+
$<num>$ = sourceline;
|
2337
|
+
}
|
2338
|
+
paren_args
|
2339
|
+
{
|
2340
|
+
$$ = NEW_CALL($1, parser_intern("call"), $4);
|
2341
|
+
nd_set_line($$, $<num>3);
|
2317
2342
|
}
|
2318
2343
|
| keyword_super paren_args
|
2319
2344
|
{
|
@@ -2555,6 +2580,28 @@ word : string_content
|
|
2555
2580
|
}
|
2556
2581
|
;
|
2557
2582
|
|
2583
|
+
symbols : tSYMBOLS_BEG ' ' tSTRING_END
|
2584
|
+
{
|
2585
|
+
$$ = NEW_ZARRAY();
|
2586
|
+
}
|
2587
|
+
| tSYMBOLS_BEG symbol_list tSTRING_END
|
2588
|
+
{
|
2589
|
+
$$ = $2;
|
2590
|
+
}
|
2591
|
+
;
|
2592
|
+
|
2593
|
+
symbol_list : /* none */
|
2594
|
+
{
|
2595
|
+
$$ = 0;
|
2596
|
+
}
|
2597
|
+
| symbol_list word ' '
|
2598
|
+
{
|
2599
|
+
$2 = evstr2dstr($2);
|
2600
|
+
nd_set_type($2, NODE_DSYM);
|
2601
|
+
$$ = list_append($1, $2);
|
2602
|
+
}
|
2603
|
+
;
|
2604
|
+
|
2558
2605
|
qwords : tQWORDS_BEG ' ' tSTRING_END
|
2559
2606
|
{
|
2560
2607
|
$$ = NEW_ZARRAY();
|
@@ -2565,6 +2612,16 @@ qwords : tQWORDS_BEG ' ' tSTRING_END
|
|
2565
2612
|
}
|
2566
2613
|
;
|
2567
2614
|
|
2615
|
+
qsymbols : tQSYMBOLS_BEG ' ' tSTRING_END
|
2616
|
+
{
|
2617
|
+
$$ = NEW_ZARRAY();
|
2618
|
+
}
|
2619
|
+
| tQSYMBOLS_BEG qsym_list tSTRING_END
|
2620
|
+
{
|
2621
|
+
$$ = $2;
|
2622
|
+
}
|
2623
|
+
;
|
2624
|
+
|
2568
2625
|
qword_list : /* none */
|
2569
2626
|
{
|
2570
2627
|
$$ = 0;
|
@@ -2575,6 +2632,20 @@ qword_list : /* none */
|
|
2575
2632
|
}
|
2576
2633
|
;
|
2577
2634
|
|
2635
|
+
qsym_list : /* none */
|
2636
|
+
{
|
2637
|
+
$$ = 0;
|
2638
|
+
}
|
2639
|
+
| qsym_list tSTRING_CONTENT ' '
|
2640
|
+
{
|
2641
|
+
VALUE lit;
|
2642
|
+
lit = $2->nd_lit;
|
2643
|
+
$2->nd_lit = ID2SYM(parser_intern_str(lit));
|
2644
|
+
nd_set_type($2, NODE_LIT);
|
2645
|
+
$$ = list_append($1, $2);
|
2646
|
+
}
|
2647
|
+
;
|
2648
|
+
|
2578
2649
|
string_contents : /* none */
|
2579
2650
|
{
|
2580
2651
|
$$ = 0;
|
@@ -2646,14 +2717,19 @@ string_content : tSTRING_CONTENT
|
|
2646
2717
|
lex_strterm = 0;
|
2647
2718
|
lex_state = EXPR_BEG;
|
2648
2719
|
}
|
2649
|
-
|
2720
|
+
{
|
2721
|
+
$<num>$ = brace_nest;
|
2722
|
+
brace_nest = 0;
|
2723
|
+
}
|
2724
|
+
compstmt tSTRING_DEND
|
2650
2725
|
{
|
2651
2726
|
cond_stack = $<val>1;
|
2652
2727
|
cmdarg_stack = $<val>2;
|
2653
2728
|
lex_strterm = $<node>3;
|
2729
|
+
brace_nest = $<num>4;
|
2654
2730
|
|
2655
|
-
if($
|
2656
|
-
$$ = new_evstr($
|
2731
|
+
if($5) $5->flags &= ~NODE_FL_NEWLINE;
|
2732
|
+
$$ = new_evstr($5);
|
2657
2733
|
}
|
2658
2734
|
;
|
2659
2735
|
|
@@ -2679,6 +2755,7 @@ sym : fname
|
|
2679
2755
|
dsym : tSYMBEG xstring_contents tSTRING_END
|
2680
2756
|
{
|
2681
2757
|
lex_state = EXPR_END;
|
2758
|
+
// TODO dsym_node($2);
|
2682
2759
|
if(!($$ = $2)) {
|
2683
2760
|
$$ = NEW_LIT(ID2SYM(parser_intern("")));
|
2684
2761
|
} else {
|
@@ -2701,18 +2778,19 @@ dsym : tSYMBEG xstring_contents tSTRING_END
|
|
2701
2778
|
}
|
2702
2779
|
;
|
2703
2780
|
|
2704
|
-
numeric :
|
2705
|
-
|
|
2706
|
-
| tUMINUS_NUM tINTEGER %prec tLOWEST
|
2707
|
-
{
|
2708
|
-
$$ = negate_lit($2);
|
2709
|
-
}
|
2710
|
-
| tUMINUS_NUM tFLOAT %prec tLOWEST
|
2781
|
+
numeric : simple_numeric
|
2782
|
+
| tUMINUS_NUM simple_numeric %prec tLOWEST
|
2711
2783
|
{
|
2712
2784
|
$$ = negate_lit($2);
|
2713
2785
|
}
|
2714
2786
|
;
|
2715
2787
|
|
2788
|
+
simple_numeric : tINTEGER
|
2789
|
+
| tFLOAT
|
2790
|
+
| tRATIONAL
|
2791
|
+
| tIMAGINARY
|
2792
|
+
;
|
2793
|
+
|
2716
2794
|
user_variable : tIDENTIFIER
|
2717
2795
|
| tIVAR
|
2718
2796
|
| tGVAR
|
@@ -2764,6 +2842,7 @@ superclass : term
|
|
2764
2842
|
| '<'
|
2765
2843
|
{
|
2766
2844
|
lex_state = EXPR_BEG;
|
2845
|
+
command_start = TRUE;
|
2767
2846
|
}
|
2768
2847
|
expr_value term
|
2769
2848
|
{
|
@@ -2790,65 +2869,94 @@ f_arglist : '(' f_args rparen
|
|
2790
2869
|
}
|
2791
2870
|
;
|
2792
2871
|
|
2793
|
-
|
2872
|
+
args_tail : f_kwarg ',' f_kwrest opt_f_block_arg
|
2873
|
+
{
|
2874
|
+
$$ = new_args_tail($1, $3, $4);
|
2875
|
+
}
|
2876
|
+
| f_kwarg opt_f_block_arg
|
2877
|
+
{
|
2878
|
+
$$ = new_args_tail($1, 0, $2);
|
2879
|
+
}
|
2880
|
+
| f_kwrest opt_f_block_arg
|
2881
|
+
{
|
2882
|
+
$$ = new_args_tail(0, $1, $2);
|
2883
|
+
}
|
2884
|
+
| f_block_arg
|
2885
|
+
{
|
2886
|
+
$$ = new_args_tail(0, 0, $1);
|
2887
|
+
}
|
2888
|
+
;
|
2889
|
+
|
2890
|
+
opt_args_tail : ',' args_tail
|
2891
|
+
{
|
2892
|
+
$$ = $2;
|
2893
|
+
}
|
2894
|
+
| /* none */
|
2895
|
+
{
|
2896
|
+
$$ = new_args_tail(0, 0, 0);
|
2897
|
+
}
|
2898
|
+
;
|
2899
|
+
|
2900
|
+
f_args : f_arg ',' f_optarg ',' f_rest_arg opt_args_tail
|
2794
2901
|
{
|
2795
2902
|
$$ = new_args($1, $3, $5, 0, $6);
|
2796
2903
|
}
|
2797
|
-
| f_arg ',' f_optarg ',' f_rest_arg ',' f_arg
|
2904
|
+
| f_arg ',' f_optarg ',' f_rest_arg ',' f_arg opt_args_tail
|
2798
2905
|
{
|
2799
2906
|
$$ = new_args($1, $3, $5, $7, $8);
|
2800
2907
|
}
|
2801
|
-
| f_arg ',' f_optarg
|
2908
|
+
| f_arg ',' f_optarg opt_args_tail
|
2802
2909
|
{
|
2803
2910
|
$$ = new_args($1, $3, 0, 0, $4);
|
2804
2911
|
}
|
2805
|
-
| f_arg ',' f_optarg ',' f_arg
|
2912
|
+
| f_arg ',' f_optarg ',' f_arg opt_args_tail
|
2806
2913
|
{
|
2807
2914
|
$$ = new_args($1, $3, 0, $5, $6);
|
2808
2915
|
}
|
2809
|
-
| f_arg ',' f_rest_arg
|
2916
|
+
| f_arg ',' f_rest_arg opt_args_tail
|
2810
2917
|
{
|
2811
2918
|
$$ = new_args($1, 0, $3, 0, $4);
|
2812
2919
|
}
|
2813
|
-
| f_arg ',' f_rest_arg ',' f_arg
|
2920
|
+
| f_arg ',' f_rest_arg ',' f_arg opt_args_tail
|
2814
2921
|
{
|
2815
2922
|
$$ = new_args($1, 0, $3, $5, $6);
|
2816
2923
|
}
|
2817
|
-
| f_arg
|
2924
|
+
| f_arg opt_args_tail
|
2818
2925
|
{
|
2819
2926
|
$$ = new_args($1, 0, 0, 0, $2);
|
2820
2927
|
}
|
2821
|
-
| f_optarg ',' f_rest_arg
|
2928
|
+
| f_optarg ',' f_rest_arg opt_args_tail
|
2822
2929
|
{
|
2823
2930
|
$$ = new_args(0, $1, $3, 0, $4);
|
2824
2931
|
}
|
2825
|
-
| f_optarg ',' f_rest_arg ',' f_arg
|
2932
|
+
| f_optarg ',' f_rest_arg ',' f_arg opt_args_tail
|
2826
2933
|
{
|
2827
2934
|
$$ = new_args(0, $1, $3, $5, $6);
|
2828
2935
|
}
|
2829
|
-
| f_optarg
|
2936
|
+
| f_optarg opt_args_tail
|
2830
2937
|
{
|
2831
2938
|
$$ = new_args(0, $1, 0, 0, $2);
|
2832
2939
|
}
|
2833
|
-
| f_optarg ',' f_arg
|
2940
|
+
| f_optarg ',' f_arg opt_args_tail
|
2834
2941
|
{
|
2835
2942
|
$$ = new_args(0, $1, 0, $3, $4);
|
2836
2943
|
}
|
2837
|
-
| f_rest_arg
|
2944
|
+
| f_rest_arg opt_args_tail
|
2838
2945
|
{
|
2839
2946
|
$$ = new_args(0, 0, $1, 0, $2);
|
2840
2947
|
}
|
2841
|
-
| f_rest_arg ',' f_arg
|
2948
|
+
| f_rest_arg ',' f_arg opt_args_tail
|
2842
2949
|
{
|
2843
2950
|
$$ = new_args(0, 0, $1, $3, $4);
|
2844
2951
|
}
|
2845
|
-
|
|
2952
|
+
| args_tail
|
2846
2953
|
{
|
2847
2954
|
$$ = new_args(0, 0, 0, 0, $1);
|
2848
2955
|
}
|
2849
2956
|
| /* none */
|
2850
2957
|
{
|
2851
|
-
$$ =
|
2958
|
+
$$ = new_args_tail(0, 0, 0);
|
2959
|
+
$$ = new_args(0, 0, 0, 0, $$);
|
2852
2960
|
}
|
2853
2961
|
;
|
2854
2962
|
|
@@ -2887,36 +2995,112 @@ f_arg_item : f_norm_arg
|
|
2887
2995
|
arg_var(get_id($1));
|
2888
2996
|
$$ = NEW_ARGS_AUX($1, 1);
|
2889
2997
|
}
|
2890
|
-
| tLPAREN f_margs rparen
|
2998
|
+
| tLPAREN f_margs rparen
|
2999
|
+
{
|
3000
|
+
ID tid = internal_id();
|
3001
|
+
arg_var(tid);
|
3002
|
+
$2->nd_value = NEW_LVAR(tid);
|
3003
|
+
$$ = NEW_ARGS_AUX(tid, 1);
|
3004
|
+
$$->nd_next = $2;
|
3005
|
+
}
|
3006
|
+
;
|
3007
|
+
|
3008
|
+
f_arg : f_arg_item
|
3009
|
+
| f_arg ',' f_arg_item
|
3010
|
+
{
|
3011
|
+
$$ = $1;
|
3012
|
+
$$->nd_plen++;
|
3013
|
+
$$->nd_next = block_append($$->nd_next, $3->nd_next);
|
3014
|
+
}
|
3015
|
+
;
|
3016
|
+
|
3017
|
+
f_label : tLABEL
|
3018
|
+
{
|
3019
|
+
arg_var(formal_argument(get_id($1)));
|
3020
|
+
$$ = $1;
|
3021
|
+
}
|
3022
|
+
;
|
3023
|
+
|
3024
|
+
f_kw : f_label arg_value
|
3025
|
+
{
|
3026
|
+
$$ = assignable($1, $2);
|
3027
|
+
$$ = NEW_KW_ARG(0, $$);
|
3028
|
+
}
|
3029
|
+
| f_label
|
3030
|
+
{
|
3031
|
+
$$ = assignable($1, NEW_REQ_KW);
|
3032
|
+
$$ = NEW_KW_ARG(0, $$);
|
3033
|
+
}
|
3034
|
+
;
|
3035
|
+
|
3036
|
+
f_block_kw : f_label primary_value
|
3037
|
+
{
|
3038
|
+
$$ = assignable($1, $2);
|
3039
|
+
$$ = NEW_KW_ARG(0, $$);
|
3040
|
+
}
|
3041
|
+
| f_label
|
3042
|
+
{
|
3043
|
+
$$ = assignable($1, NEW_REQ_KW);
|
3044
|
+
$$ = NEW_KW_ARG(0, $$);
|
3045
|
+
}
|
3046
|
+
;
|
3047
|
+
|
3048
|
+
f_block_kwarg : f_block_kw
|
3049
|
+
{
|
3050
|
+
$$ = $1;
|
3051
|
+
}
|
3052
|
+
| f_block_kwarg ',' f_block_kw
|
3053
|
+
{
|
3054
|
+
NODE *kws = $1;
|
3055
|
+
while (kws->nd_next) {
|
3056
|
+
kws = kws->nd_next;
|
3057
|
+
}
|
3058
|
+
kws->nd_next = $3;
|
3059
|
+
$$ = $1;
|
3060
|
+
}
|
3061
|
+
;
|
3062
|
+
|
3063
|
+
f_kwarg : f_kw
|
3064
|
+
{
|
3065
|
+
$$ = $1;
|
3066
|
+
}
|
3067
|
+
| f_kwarg ',' f_kw
|
2891
3068
|
{
|
2892
|
-
|
2893
|
-
|
2894
|
-
|
2895
|
-
|
2896
|
-
|
3069
|
+
NODE *kws = $1;
|
3070
|
+
while (kws->nd_next) {
|
3071
|
+
kws = kws->nd_next;
|
3072
|
+
}
|
3073
|
+
kws->nd_next = $3;
|
3074
|
+
$$ = $1;
|
2897
3075
|
}
|
2898
3076
|
;
|
2899
3077
|
|
2900
|
-
|
2901
|
-
|
|
3078
|
+
kwrest_mark : tPOW
|
3079
|
+
| tDSTAR
|
3080
|
+
;
|
3081
|
+
|
3082
|
+
f_kwrest : kwrest_mark tIDENTIFIER
|
2902
3083
|
{
|
2903
|
-
|
2904
|
-
|
2905
|
-
|
3084
|
+
shadowing_lvar(get_id($2));
|
3085
|
+
$$ = $2;
|
3086
|
+
}
|
3087
|
+
| kwrest_mark
|
3088
|
+
{
|
3089
|
+
$$ = internal_id();
|
2906
3090
|
}
|
2907
3091
|
;
|
2908
3092
|
|
2909
|
-
f_opt :
|
3093
|
+
f_opt : f_norm_arg '=' arg_value
|
2910
3094
|
{
|
2911
|
-
arg_var(
|
3095
|
+
arg_var(get_id($1));
|
2912
3096
|
$$ = assignable($1, $3);
|
2913
3097
|
$$ = NEW_OPT_ARG(0, $$);
|
2914
3098
|
}
|
2915
3099
|
;
|
2916
3100
|
|
2917
|
-
f_block_opt :
|
3101
|
+
f_block_opt : f_norm_arg '=' primary_value
|
2918
3102
|
{
|
2919
|
-
arg_var(
|
3103
|
+
arg_var(get_id($1));
|
2920
3104
|
$$ = assignable($1, $3);
|
2921
3105
|
$$ = NEW_OPT_ARG(0, $$);
|
2922
3106
|
}
|
@@ -3048,6 +3232,10 @@ assoc : arg_value tASSOC arg_value
|
|
3048
3232
|
{
|
3049
3233
|
$$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2);
|
3050
3234
|
}
|
3235
|
+
| tDSTAR arg_value
|
3236
|
+
{
|
3237
|
+
$$ = list_append(NEW_LIST(0), $2);
|
3238
|
+
}
|
3051
3239
|
;
|
3052
3240
|
|
3053
3241
|
operation : tIDENTIFIER
|
@@ -3114,21 +3302,24 @@ static int parser_here_document(rb_parser_state*, NODE*);
|
|
3114
3302
|
|
3115
3303
|
|
3116
3304
|
#define nextc() parser_nextc(parser_state)
|
3117
|
-
#define pushback(c) parser_pushback(parser_state, c)
|
3305
|
+
#define pushback(c) parser_pushback(parser_state, (c))
|
3118
3306
|
#define newtok() parser_newtok(parser_state)
|
3119
|
-
#define tokspace(n) parser_tokspace(parser_state, n)
|
3120
|
-
#define tokadd(c) parser_tokadd(parser_state, c)
|
3121
|
-
#define tok_hex(numlen) parser_tok_hex(parser_state, numlen)
|
3122
|
-
#define read_escape(flags,e) parser_read_escape(parser_state, flags, e)
|
3123
|
-
#define tokadd_escape(e) parser_tokadd_escape(parser_state, e)
|
3307
|
+
#define tokspace(n) parser_tokspace(parser_state, (n))
|
3308
|
+
#define tokadd(c) parser_tokadd(parser_state, (c))
|
3309
|
+
#define tok_hex(numlen) parser_tok_hex(parser_state, (numlen))
|
3310
|
+
#define read_escape(flags,e) parser_read_escape(parser_state, (flags), (e))
|
3311
|
+
#define tokadd_escape(e) parser_tokadd_escape(parser_state, (e))
|
3124
3312
|
#define regx_options() parser_regx_options(parser_state)
|
3125
|
-
#define tokadd_string(f,t,p,n,e) parser_tokadd_string(parser_state,f,t,p,n,e)
|
3126
|
-
#define parse_string(n) parser_parse_string(parser_state,n)
|
3127
|
-
#define tokaddmbc(c, enc) parser_tokaddmbc(parser_state, c, enc)
|
3128
|
-
#define here_document(n) parser_here_document(parser_state,n)
|
3313
|
+
#define tokadd_string(f,t,p,n,e) parser_tokadd_string(parser_state, (f), (t), (p), (n), (e))
|
3314
|
+
#define parse_string(n) parser_parse_string(parser_state, (n))
|
3315
|
+
#define tokaddmbc(c, enc) parser_tokaddmbc(parser_state, (c), (enc))
|
3316
|
+
#define here_document(n) parser_here_document(parser_state, (n))
|
3129
3317
|
#define heredoc_identifier() parser_heredoc_identifier(parser_state)
|
3130
|
-
#define heredoc_restore(n) parser_heredoc_restore(parser_state,n)
|
3131
|
-
#define whole_match_p(e,l,i) parser_whole_match_p(parser_state,e,l,i)
|
3318
|
+
#define heredoc_restore(n) parser_heredoc_restore(parser_state, (n))
|
3319
|
+
#define whole_match_p(e,l,i) parser_whole_match_p(parser_state, (e), (l), (i))
|
3320
|
+
#define number_literal_suffix(f) parser_number_literal_suffix(parser_state, (f))
|
3321
|
+
#define set_number_literal(v,t,f) parser_set_number_literal(parser_state, (v), (t), (f))
|
3322
|
+
#define set_integer_literal(v,f) parser_set_integer_literal(parser_state, (v), (f))
|
3132
3323
|
|
3133
3324
|
#define set_yylval_str(x) yylval.node = NEW_STR(x)
|
3134
3325
|
#define set_yylval_num(x) yylval.num = x
|
@@ -3137,6 +3328,8 @@ static int parser_here_document(rb_parser_state*, NODE*);
|
|
3137
3328
|
#define set_yylval_literal(x) yylval.node = NEW_LIT(x)
|
3138
3329
|
#define set_yylval_number(x) yylval.node = NEW_NUMBER(x)
|
3139
3330
|
#define set_yylval_float(x) yylval.node = NEW_FLOAT(x)
|
3331
|
+
#define set_yylval_rational(x) yylval.node = NEW_RATIONAL(x)
|
3332
|
+
#define set_yylval_imaginary(x) yylval.node = NEW_IMAGINARY(x)
|
3140
3333
|
#define set_yylval_node(x) yylval.node = x
|
3141
3334
|
#define yylval_id() yylval.id
|
3142
3335
|
|
@@ -3193,7 +3386,6 @@ yycompile(rb_parser_state* parser_state, char *f, int line)
|
|
3193
3386
|
compile_for_eval = 0;
|
3194
3387
|
cond_stack = 0;
|
3195
3388
|
cmdarg_stack = 0;
|
3196
|
-
command_start = TRUE;
|
3197
3389
|
class_nest = 0;
|
3198
3390
|
in_single = 0;
|
3199
3391
|
in_def = 0;
|
@@ -3440,8 +3632,6 @@ parser_pushback(rb_parser_state* parser_state, int c)
|
|
3440
3632
|
lex_p--;
|
3441
3633
|
}
|
3442
3634
|
|
3443
|
-
#define pushback(c) parser_pushback(parser_state, c)
|
3444
|
-
|
3445
3635
|
/* Indicates if we're currently at the beginning of a line. */
|
3446
3636
|
#define was_bol() (lex_p == lex_pbeg + 1)
|
3447
3637
|
|
@@ -3457,6 +3647,7 @@ static char*
|
|
3457
3647
|
parser_newtok(rb_parser_state* parser_state)
|
3458
3648
|
{
|
3459
3649
|
tokidx = 0;
|
3650
|
+
tokline = sourceline;
|
3460
3651
|
if(!tokenbuf) {
|
3461
3652
|
toksiz = 60;
|
3462
3653
|
tokenbuf = ALLOC_N(char, 60);
|
@@ -3849,7 +4040,7 @@ parser_tokadd_string(rb_parser_state *parser_state,
|
|
3849
4040
|
}
|
3850
4041
|
|
3851
4042
|
#define mixed_escape(beg, enc1, enc2) do { \
|
3852
|
-
char *pos = lex_p; \
|
4043
|
+
const char *pos = lex_p; \
|
3853
4044
|
lex_p = beg; \
|
3854
4045
|
mixed_error(enc1, enc2); \
|
3855
4046
|
lex_p = pos; \
|
@@ -3871,7 +4062,7 @@ parser_tokadd_string(rb_parser_state *parser_state,
|
|
3871
4062
|
break;
|
3872
4063
|
}
|
3873
4064
|
} else if(c == '\\') {
|
3874
|
-
char *beg = lex_p - 1;
|
4065
|
+
const char *beg = lex_p - 1;
|
3875
4066
|
c = nextc();
|
3876
4067
|
switch(c) {
|
3877
4068
|
case '\n':
|
@@ -3950,6 +4141,65 @@ parser_tokadd_string(rb_parser_state *parser_state,
|
|
3950
4141
|
node_newnode(NODE_STRTERM, (VALUE)(func), \
|
3951
4142
|
(VALUE)((term) | ((paren) << (CHAR_BIT * 2))), 0)
|
3952
4143
|
#define pslval ((YYSTYPE *)lval)
|
4144
|
+
|
4145
|
+
#define BIT(c, idx) (((c) / 32 - 1 == idx) ? (1U << ((c) % 32)) : 0)
|
4146
|
+
#define SPECIAL_PUNCT(idx) ( \
|
4147
|
+
BIT('~', idx) | BIT('*', idx) | BIT('$', idx) | BIT('?', idx) | \
|
4148
|
+
BIT('!', idx) | BIT('@', idx) | BIT('/', idx) | BIT('\\', idx) | \
|
4149
|
+
BIT(';', idx) | BIT(',', idx) | BIT('.', idx) | BIT('=', idx) | \
|
4150
|
+
BIT(':', idx) | BIT('<', idx) | BIT('>', idx) | BIT('\"', idx) | \
|
4151
|
+
BIT('&', idx) | BIT('`', idx) | BIT('\'', idx) | BIT('+', idx) | \
|
4152
|
+
BIT('0', idx))
|
4153
|
+
const unsigned int ruby_global_name_punct_bits[] = {
|
4154
|
+
SPECIAL_PUNCT(0),
|
4155
|
+
SPECIAL_PUNCT(1),
|
4156
|
+
SPECIAL_PUNCT(2),
|
4157
|
+
};
|
4158
|
+
#undef BIT
|
4159
|
+
#undef SPECIAL_PUNCT
|
4160
|
+
|
4161
|
+
static inline int
|
4162
|
+
is_global_name_punct(const int c)
|
4163
|
+
{
|
4164
|
+
if(c <= 0x20 || 0x7e < c) return 0;
|
4165
|
+
return (ruby_global_name_punct_bits[(c - 0x20) / 32] >> (c % 32)) & 1;
|
4166
|
+
}
|
4167
|
+
|
4168
|
+
static int
|
4169
|
+
parser_peek_variable_name(rb_parser_state* parser_state)
|
4170
|
+
{
|
4171
|
+
int c;
|
4172
|
+
const char *p = lex_p;
|
4173
|
+
|
4174
|
+
if(p + 1 >= lex_pend) return 0;
|
4175
|
+
c = *p++;
|
4176
|
+
switch(c) {
|
4177
|
+
case '$':
|
4178
|
+
if((c = *p) == '-') {
|
4179
|
+
if (++p >= lex_pend) return 0;
|
4180
|
+
c = *p;
|
4181
|
+
} else if(is_global_name_punct(c) || ISDIGIT(c)) {
|
4182
|
+
return tSTRING_DVAR;
|
4183
|
+
}
|
4184
|
+
break;
|
4185
|
+
case '@':
|
4186
|
+
if((c = *p) == '@') {
|
4187
|
+
if(++p >= lex_pend) return 0;
|
4188
|
+
c = *p;
|
4189
|
+
}
|
4190
|
+
break;
|
4191
|
+
case '{':
|
4192
|
+
lex_p = p;
|
4193
|
+
command_start = TRUE;
|
4194
|
+
return tSTRING_DBEG;
|
4195
|
+
default:
|
4196
|
+
return 0;
|
4197
|
+
}
|
4198
|
+
if(!ISASCII(c) || c == '_' || ISALPHA(c)) return tSTRING_DVAR;
|
4199
|
+
|
4200
|
+
return 0;
|
4201
|
+
}
|
4202
|
+
|
3953
4203
|
static int
|
3954
4204
|
parser_parse_string(rb_parser_state* parser_state, NODE *quote)
|
3955
4205
|
{
|
@@ -3982,15 +4232,10 @@ parser_parse_string(rb_parser_state* parser_state, NODE *quote)
|
|
3982
4232
|
}
|
3983
4233
|
newtok();
|
3984
4234
|
if((func & STR_FUNC_EXPAND) && c == '#') {
|
3985
|
-
|
3986
|
-
|
3987
|
-
case '@':
|
3988
|
-
pushback(c);
|
3989
|
-
return tSTRING_DVAR;
|
3990
|
-
case '{':
|
3991
|
-
return tSTRING_DBEG;
|
3992
|
-
}
|
4235
|
+
int t = parser_peek_variable_name(parser_state);
|
4236
|
+
if(t) return t;
|
3993
4237
|
tokadd('#');
|
4238
|
+
c = nextc();
|
3994
4239
|
}
|
3995
4240
|
pushback(c);
|
3996
4241
|
if(tokadd_string(func, term, paren, "e->nd_nest, &enc) == -1) {
|
@@ -4103,6 +4348,7 @@ parser_heredoc_restore(rb_parser_state* parser_state, NODE *here)
|
|
4103
4348
|
{
|
4104
4349
|
VALUE line;
|
4105
4350
|
|
4351
|
+
lex_strterm = 0;
|
4106
4352
|
line = here->nd_orig;
|
4107
4353
|
lex_lastline = line;
|
4108
4354
|
lex_pbeg = RSTRING_PTR(line);
|
@@ -4115,16 +4361,93 @@ parser_heredoc_restore(rb_parser_state* parser_state, NODE *here)
|
|
4115
4361
|
static int
|
4116
4362
|
parser_whole_match_p(rb_parser_state* parser_state, const char *eos, ssize_t len, int indent)
|
4117
4363
|
{
|
4118
|
-
char *p = lex_pbeg;
|
4364
|
+
const char *p = lex_pbeg;
|
4119
4365
|
ssize_t n;
|
4120
4366
|
|
4121
4367
|
if(indent) {
|
4122
4368
|
while(*p && ISSPACE(*p)) p++;
|
4123
4369
|
}
|
4124
4370
|
n = lex_pend - (p + len);
|
4125
|
-
if(n < 0
|
4126
|
-
if(
|
4127
|
-
|
4371
|
+
if(n < 0) return FALSE;
|
4372
|
+
if(n > 0 && p[len] != '\n') {
|
4373
|
+
if(p[len] != '\r') return FALSE;
|
4374
|
+
if(n <= 1 || p[len+1] != '\n') return FALSE;
|
4375
|
+
}
|
4376
|
+
return strncmp(eos, p, len) == 0;
|
4377
|
+
}
|
4378
|
+
|
4379
|
+
#define NUM_SUFFIX_R (1<<0)
|
4380
|
+
#define NUM_SUFFIX_I (1<<1)
|
4381
|
+
#define NUM_SUFFIX_ALL 3
|
4382
|
+
|
4383
|
+
static int
|
4384
|
+
parser_number_literal_suffix(rb_parser_state* parser_state, int mask)
|
4385
|
+
{
|
4386
|
+
int c, result = 0;
|
4387
|
+
const char *lastp = lex_p;
|
4388
|
+
|
4389
|
+
while((c = nextc()) != -1) {
|
4390
|
+
if((mask & NUM_SUFFIX_I) && c == 'i') {
|
4391
|
+
result |= (mask & NUM_SUFFIX_I);
|
4392
|
+
mask &= ~NUM_SUFFIX_I;
|
4393
|
+
/* r after i, rational of complex is disallowed */
|
4394
|
+
mask &= ~NUM_SUFFIX_R;
|
4395
|
+
continue;
|
4396
|
+
}
|
4397
|
+
if((mask & NUM_SUFFIX_R) && c == 'r') {
|
4398
|
+
result |= (mask & NUM_SUFFIX_R);
|
4399
|
+
mask &= ~NUM_SUFFIX_R;
|
4400
|
+
continue;
|
4401
|
+
}
|
4402
|
+
if(!ISASCII(c) || ISALPHA(c) || c == '_') {
|
4403
|
+
lex_p = lastp;
|
4404
|
+
return 0;
|
4405
|
+
}
|
4406
|
+
pushback(c);
|
4407
|
+
break;
|
4408
|
+
}
|
4409
|
+
|
4410
|
+
return result;
|
4411
|
+
}
|
4412
|
+
|
4413
|
+
static int
|
4414
|
+
parser_set_number_literal(rb_parser_state* parser_state, VALUE v, int type, int suffix)
|
4415
|
+
{
|
4416
|
+
if(suffix & NUM_SUFFIX_I) {
|
4417
|
+
v = rb_funcall(rb_cObject, rb_intern("Complex"), 2, INT2FIX(0), v);
|
4418
|
+
type = tIMAGINARY;
|
4419
|
+
}
|
4420
|
+
|
4421
|
+
switch(type) {
|
4422
|
+
case tFLOAT:
|
4423
|
+
set_yylval_float(v);
|
4424
|
+
break;
|
4425
|
+
case tINTEGER:
|
4426
|
+
set_yylval_number(v);
|
4427
|
+
break;
|
4428
|
+
case tRATIONAL:
|
4429
|
+
set_yylval_rational(v);
|
4430
|
+
break;
|
4431
|
+
case tIMAGINARY:
|
4432
|
+
set_yylval_imaginary(v);
|
4433
|
+
break;
|
4434
|
+
default:
|
4435
|
+
set_yylval_literal(v);
|
4436
|
+
break;
|
4437
|
+
}
|
4438
|
+
|
4439
|
+
return type;
|
4440
|
+
}
|
4441
|
+
|
4442
|
+
static int
|
4443
|
+
parser_set_integer_literal(rb_parser_state* parser_state, VALUE v, int suffix)
|
4444
|
+
{
|
4445
|
+
int type = tINTEGER;
|
4446
|
+
if (suffix & NUM_SUFFIX_R) {
|
4447
|
+
v = rb_funcall(rb_cObject, rb_intern("Rational"), 1, v);
|
4448
|
+
type = tRATIONAL;
|
4449
|
+
}
|
4450
|
+
return set_number_literal(v, type, suffix);
|
4128
4451
|
}
|
4129
4452
|
|
4130
4453
|
/* Called when the lexer knows it's inside a heredoc. This function
|
@@ -4135,7 +4458,7 @@ static int
|
|
4135
4458
|
parser_here_document(rb_parser_state* parser_state, NODE *here)
|
4136
4459
|
{
|
4137
4460
|
int c, func, indent = 0;
|
4138
|
-
char *eos, *p, *pend;
|
4461
|
+
const char *eos, *p, *pend;
|
4139
4462
|
ssize_t len;
|
4140
4463
|
VALUE str = 0;
|
4141
4464
|
rb_encoding* enc = parser_state->enc;
|
@@ -4153,7 +4476,6 @@ parser_here_document(rb_parser_state* parser_state, NODE *here)
|
|
4153
4476
|
rb_compile_error(parser_state, "can't find string \"%s\" anywhere before EOF", eos);
|
4154
4477
|
restore:
|
4155
4478
|
heredoc_restore(lex_strterm);
|
4156
|
-
lex_strterm = 0;
|
4157
4479
|
return 0;
|
4158
4480
|
}
|
4159
4481
|
/* Gr. not yet sure what was_bol() means other than it seems like
|
@@ -4196,15 +4518,10 @@ parser_here_document(rb_parser_state* parser_state, NODE *here)
|
|
4196
4518
|
} else {
|
4197
4519
|
newtok();
|
4198
4520
|
if(c == '#') {
|
4199
|
-
|
4200
|
-
|
4201
|
-
case '@':
|
4202
|
-
pushback(c);
|
4203
|
-
return tSTRING_DVAR;
|
4204
|
-
case '{':
|
4205
|
-
return tSTRING_DBEG;
|
4206
|
-
}
|
4521
|
+
int t = parser_peek_variable_name(parser_state);
|
4522
|
+
if(t) return t;
|
4207
4523
|
tokadd('#');
|
4524
|
+
c = nextc();
|
4208
4525
|
}
|
4209
4526
|
|
4210
4527
|
/* Loop while we haven't found a the heredoc ident. */
|
@@ -4245,8 +4562,6 @@ arg_ambiguous()
|
|
4245
4562
|
return 1;
|
4246
4563
|
}
|
4247
4564
|
|
4248
|
-
#define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG)
|
4249
|
-
|
4250
4565
|
static ID
|
4251
4566
|
parser_formal_argument(rb_parser_state* parser_state, ID lhs)
|
4252
4567
|
{
|
@@ -4535,33 +4850,28 @@ parser_prepare(rb_parser_state* parser_state)
|
|
4535
4850
|
parser_state->enc = parser_enc_get(lex_lastline);
|
4536
4851
|
}
|
4537
4852
|
|
4538
|
-
#define IS_ARG()
|
4539
|
-
|
4540
|
-
#define
|
4541
|
-
|
4542
|
-
|
4543
|
-
|
4544
|
-
|
4545
|
-
|
4546
|
-
|| lex_state == EXPR_CLASS)
|
4547
|
-
#define IS_SPCARG(c) (IS_ARG() && space_seen && !ISSPACE(c))
|
4548
|
-
#define IS_LABEL_POSSIBLE() ((lex_state == EXPR_BEG && !cmd_state) || IS_ARG())
|
4549
|
-
#define IS_LABEL_SUFFIX(n) (peek_n(':',(n)) && !peek_n(':', (n)+1))
|
4853
|
+
#define IS_ARG() lex_state_p(EXPR_ARG_ANY)
|
4854
|
+
#define IS_END() lex_state_p(EXPR_END_ANY)
|
4855
|
+
#define IS_BEG() lex_state_p(EXPR_BEG_ANY)
|
4856
|
+
#define IS_SPCARG(c) (IS_ARG() && space_seen && !ISSPACE(c))
|
4857
|
+
#define IS_LABEL_POSSIBLE() ((lex_state_p(EXPR_BEG | EXPR_ENDFN) && !cmd_state) \
|
4858
|
+
|| IS_ARG())
|
4859
|
+
#define IS_LABEL_SUFFIX(n) (peek_n(':',(n)) && !peek_n(':', (n)+1))
|
4860
|
+
#define IS_AFTER_OPERATOR() lex_state_p(EXPR_FNAME | EXPR_DOT)
|
4550
4861
|
|
4551
4862
|
#define ambiguous_operator(op, syn) ( \
|
4552
|
-
rb_warning0("`"op"' after local variable is interpreted as binary operator"), \
|
4553
|
-
rb_warning0("even though it seems like "syn""))
|
4554
|
-
#define warn_balanced(op, syn) \
|
4555
|
-
(last_state
|
4556
|
-
|
4557
|
-
|
4558
|
-
|
4559
|
-
(ambiguous_operator(op, syn), 0))
|
4863
|
+
rb_warning0("`" op "' after local variable is interpreted as binary operator"), \
|
4864
|
+
rb_warning0("even though it seems like " syn ""))
|
4865
|
+
#define warn_balanced(op, syn) ((void) \
|
4866
|
+
(!lex_state_of_p(last_state, \
|
4867
|
+
EXPR_CLASS|EXPR_DOT|EXPR_FNAME|EXPR_ENDFN|EXPR_ENDARG) && \
|
4868
|
+
space_seen && !ISSPACE(c) && \
|
4869
|
+
(ambiguous_operator(op, syn), 0)))
|
4560
4870
|
|
4561
4871
|
static int
|
4562
4872
|
parser_yylex(rb_parser_state *parser_state)
|
4563
4873
|
{
|
4564
|
-
|
4874
|
+
int c;
|
4565
4875
|
int space_seen = 0;
|
4566
4876
|
int cmd_state;
|
4567
4877
|
enum lex_state_e last_state;
|
@@ -4614,15 +4924,8 @@ retry:
|
|
4614
4924
|
lex_p = lex_pend;
|
4615
4925
|
/* fall through */
|
4616
4926
|
case '\n':
|
4617
|
-
|
4618
|
-
case EXPR_BEG:
|
4619
|
-
case EXPR_FNAME:
|
4620
|
-
case EXPR_DOT:
|
4621
|
-
case EXPR_CLASS:
|
4622
|
-
case EXPR_VALUE:
|
4927
|
+
if(lex_state_p(EXPR_BEG | EXPR_VALUE | EXPR_CLASS | EXPR_FNAME | EXPR_DOT)) {
|
4623
4928
|
goto retry;
|
4624
|
-
default:
|
4625
|
-
break;
|
4626
4929
|
}
|
4627
4930
|
|
4628
4931
|
while((c = nextc())) {
|
@@ -4660,7 +4963,15 @@ retry:
|
|
4660
4963
|
return tOP_ASGN;
|
4661
4964
|
}
|
4662
4965
|
pushback(c);
|
4663
|
-
c
|
4966
|
+
if (IS_SPCARG(c)) {
|
4967
|
+
rb_warning0("`**' interpreted as argument prefix");
|
4968
|
+
c = tDSTAR;
|
4969
|
+
} else if (IS_BEG()) {
|
4970
|
+
c = tDSTAR;
|
4971
|
+
} else {
|
4972
|
+
warn_balanced("**", "argument prefix");
|
4973
|
+
c = tPOW;
|
4974
|
+
}
|
4664
4975
|
} else {
|
4665
4976
|
if(c == '=') {
|
4666
4977
|
set_yylval_id('*');
|
@@ -4678,17 +4989,12 @@ retry:
|
|
4678
4989
|
c = '*';
|
4679
4990
|
}
|
4680
4991
|
}
|
4681
|
-
|
4682
|
-
case EXPR_FNAME: case EXPR_DOT:
|
4683
|
-
lex_state = EXPR_ARG; break;
|
4684
|
-
default:
|
4685
|
-
lex_state = EXPR_BEG; break;
|
4686
|
-
}
|
4992
|
+
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
4687
4993
|
return c;
|
4688
4994
|
|
4689
4995
|
case '!':
|
4690
4996
|
c = nextc();
|
4691
|
-
if(
|
4997
|
+
if(IS_AFTER_OPERATOR()) {
|
4692
4998
|
lex_state = EXPR_ARG;
|
4693
4999
|
if(c == '@') {
|
4694
5000
|
return '!';
|
@@ -4727,12 +5033,7 @@ retry:
|
|
4727
5033
|
}
|
4728
5034
|
}
|
4729
5035
|
|
4730
|
-
|
4731
|
-
case EXPR_FNAME: case EXPR_DOT:
|
4732
|
-
lex_state = EXPR_ARG; break;
|
4733
|
-
default:
|
4734
|
-
lex_state = EXPR_BEG; break;
|
4735
|
-
}
|
5036
|
+
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
4736
5037
|
if((c = nextc()) == '=') {
|
4737
5038
|
if((c = nextc()) == '=') {
|
4738
5039
|
return tEQQ;
|
@@ -4752,18 +5053,19 @@ retry:
|
|
4752
5053
|
last_state = lex_state;
|
4753
5054
|
c = nextc();
|
4754
5055
|
if(c == '<' &&
|
4755
|
-
|
4756
|
-
lex_state != EXPR_CLASS &&
|
5056
|
+
!lex_state_p(EXPR_DOT | EXPR_CLASS) &&
|
4757
5057
|
!IS_END() &&
|
4758
5058
|
(!IS_ARG() || space_seen)) {
|
4759
5059
|
int token = heredoc_identifier();
|
4760
5060
|
if(token) return token;
|
4761
5061
|
}
|
4762
|
-
|
4763
|
-
|
4764
|
-
|
4765
|
-
|
4766
|
-
|
5062
|
+
if(IS_AFTER_OPERATOR()) {
|
5063
|
+
lex_state = EXPR_ARG;
|
5064
|
+
} else {
|
5065
|
+
if(lex_state_p(EXPR_CLASS)) {
|
5066
|
+
command_start = TRUE;
|
5067
|
+
}
|
5068
|
+
lex_state = EXPR_BEG;
|
4767
5069
|
}
|
4768
5070
|
if(c == '=') {
|
4769
5071
|
if((c = nextc()) == '>') {
|
@@ -4786,12 +5088,7 @@ retry:
|
|
4786
5088
|
return '<';
|
4787
5089
|
|
4788
5090
|
case '>':
|
4789
|
-
|
4790
|
-
case EXPR_FNAME: case EXPR_DOT:
|
4791
|
-
lex_state = EXPR_ARG; break;
|
4792
|
-
default:
|
4793
|
-
lex_state = EXPR_BEG; break;
|
4794
|
-
}
|
5091
|
+
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
4795
5092
|
if((c = nextc()) == '=') {
|
4796
5093
|
return tGEQ;
|
4797
5094
|
}
|
@@ -4812,15 +5109,16 @@ retry:
|
|
4812
5109
|
return tSTRING_BEG;
|
4813
5110
|
|
4814
5111
|
case '`':
|
4815
|
-
if(
|
5112
|
+
if(lex_state_p(EXPR_FNAME)) {
|
4816
5113
|
lex_state = EXPR_ENDFN;
|
4817
5114
|
return c;
|
4818
5115
|
}
|
4819
|
-
if(
|
4820
|
-
if(cmd_state)
|
5116
|
+
if(lex_state_p(EXPR_DOT)) {
|
5117
|
+
if(cmd_state) {
|
4821
5118
|
lex_state = EXPR_CMDARG;
|
4822
|
-
else
|
5119
|
+
} else {
|
4823
5120
|
lex_state = EXPR_ARG;
|
5121
|
+
}
|
4824
5122
|
return c;
|
4825
5123
|
}
|
4826
5124
|
lex_strterm = NEW_STRTERM(str_xquote, '`', 0);
|
@@ -4929,13 +5227,7 @@ retry:
|
|
4929
5227
|
warn_balanced("&", "argument prefix");
|
4930
5228
|
c = '&';
|
4931
5229
|
}
|
4932
|
-
|
4933
|
-
case EXPR_FNAME: case EXPR_DOT:
|
4934
|
-
lex_state = EXPR_ARG;
|
4935
|
-
break;
|
4936
|
-
default:
|
4937
|
-
lex_state = EXPR_BEG;
|
4938
|
-
}
|
5230
|
+
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
4939
5231
|
return c;
|
4940
5232
|
|
4941
5233
|
case '|':
|
@@ -4954,17 +5246,13 @@ retry:
|
|
4954
5246
|
lex_state = EXPR_BEG;
|
4955
5247
|
return tOP_ASGN;
|
4956
5248
|
}
|
4957
|
-
|
4958
|
-
lex_state = EXPR_ARG;
|
4959
|
-
} else {
|
4960
|
-
lex_state = EXPR_BEG;
|
4961
|
-
}
|
5249
|
+
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
4962
5250
|
pushback(c);
|
4963
5251
|
return '|';
|
4964
5252
|
|
4965
5253
|
case '+':
|
4966
5254
|
c = nextc();
|
4967
|
-
if(
|
5255
|
+
if(IS_AFTER_OPERATOR()) {
|
4968
5256
|
lex_state = EXPR_ARG;
|
4969
5257
|
if(c == '@') {
|
4970
5258
|
return tUPLUS;
|
@@ -4993,7 +5281,7 @@ retry:
|
|
4993
5281
|
|
4994
5282
|
case '-':
|
4995
5283
|
c = nextc();
|
4996
|
-
if(
|
5284
|
+
if(IS_AFTER_OPERATOR()) {
|
4997
5285
|
lex_state = EXPR_ARG;
|
4998
5286
|
if(c == '@') {
|
4999
5287
|
return tUMINUS;
|
@@ -5007,7 +5295,7 @@ retry:
|
|
5007
5295
|
return tOP_ASGN;
|
5008
5296
|
}
|
5009
5297
|
if(c == '>') {
|
5010
|
-
lex_state =
|
5298
|
+
lex_state = EXPR_ENDFN;
|
5011
5299
|
return tLAMBDA;
|
5012
5300
|
}
|
5013
5301
|
if(IS_BEG() || (IS_SPCARG(c) && arg_ambiguous())) {
|
@@ -5043,7 +5331,7 @@ retry:
|
|
5043
5331
|
case '0': case '1': case '2': case '3': case '4':
|
5044
5332
|
case '5': case '6': case '7': case '8': case '9':
|
5045
5333
|
{
|
5046
|
-
int is_float, seen_point, seen_e, nondigit;
|
5334
|
+
int is_float, seen_point, seen_e, nondigit, suffix;
|
5047
5335
|
|
5048
5336
|
is_float = seen_point = seen_e = nondigit = 0;
|
5049
5337
|
lex_state = EXPR_END;
|
@@ -5078,8 +5366,8 @@ retry:
|
|
5078
5366
|
} else if(nondigit) {
|
5079
5367
|
goto trailing_uc;
|
5080
5368
|
}
|
5081
|
-
|
5082
|
-
return
|
5369
|
+
suffix = number_literal_suffix(NUM_SUFFIX_ALL);
|
5370
|
+
return set_integer_literal(rb_cstr_to_inum(tok(), 16, FALSE), suffix);
|
5083
5371
|
}
|
5084
5372
|
|
5085
5373
|
if(c == 'b' || c == 'B') {
|
@@ -5104,8 +5392,8 @@ retry:
|
|
5104
5392
|
} else if(nondigit) {
|
5105
5393
|
goto trailing_uc;
|
5106
5394
|
}
|
5107
|
-
|
5108
|
-
return
|
5395
|
+
suffix = number_literal_suffix(NUM_SUFFIX_ALL);
|
5396
|
+
return set_integer_literal(rb_cstr_to_inum(tok(), 2, FALSE), suffix);
|
5109
5397
|
}
|
5110
5398
|
|
5111
5399
|
if(c == 'd' || c == 'D') {
|
@@ -5130,8 +5418,8 @@ retry:
|
|
5130
5418
|
} else if(nondigit) {
|
5131
5419
|
goto trailing_uc;
|
5132
5420
|
}
|
5133
|
-
|
5134
|
-
return
|
5421
|
+
suffix = number_literal_suffix(NUM_SUFFIX_ALL);
|
5422
|
+
return set_integer_literal(rb_cstr_to_inum(tok(), 10, FALSE), suffix);
|
5135
5423
|
}
|
5136
5424
|
|
5137
5425
|
if(c == '_') {
|
@@ -5166,8 +5454,8 @@ retry:
|
|
5166
5454
|
pushback(c);
|
5167
5455
|
tokfix();
|
5168
5456
|
if(nondigit) goto trailing_uc;
|
5169
|
-
|
5170
|
-
return
|
5457
|
+
suffix = number_literal_suffix(NUM_SUFFIX_ALL);
|
5458
|
+
return set_integer_literal(rb_cstr_to_inum(tok(), 8, FALSE), suffix);
|
5171
5459
|
}
|
5172
5460
|
if(nondigit) {
|
5173
5461
|
pushback(c);
|
@@ -5182,8 +5470,8 @@ retry:
|
|
5182
5470
|
tokadd('0');
|
5183
5471
|
} else {
|
5184
5472
|
pushback(c);
|
5185
|
-
|
5186
|
-
return
|
5473
|
+
suffix = number_literal_suffix(NUM_SUFFIX_ALL);
|
5474
|
+
return set_integer_literal(INT2FIX(0), suffix);
|
5187
5475
|
}
|
5188
5476
|
}
|
5189
5477
|
|
@@ -5207,10 +5495,10 @@ retry:
|
|
5207
5495
|
}
|
5208
5496
|
c = c0;
|
5209
5497
|
}
|
5498
|
+
seen_point = toklen();
|
5210
5499
|
tokadd('.');
|
5211
5500
|
tokadd(c);
|
5212
5501
|
is_float++;
|
5213
|
-
seen_point++;
|
5214
5502
|
nondigit = 0;
|
5215
5503
|
break;
|
5216
5504
|
|
@@ -5224,14 +5512,18 @@ retry:
|
|
5224
5512
|
if(seen_e) {
|
5225
5513
|
goto decode_num;
|
5226
5514
|
}
|
5227
|
-
tokadd(c);
|
5228
|
-
seen_e++;
|
5229
|
-
is_float++;
|
5230
5515
|
nondigit = c;
|
5231
5516
|
c = nextc();
|
5232
|
-
if(c != '-' && c != '+')
|
5517
|
+
if(c != '-' && c != '+' && !ISDIGIT(c)) {
|
5518
|
+
pushback(c);
|
5519
|
+
nondigit = 0;
|
5520
|
+
goto decode_num;
|
5521
|
+
}
|
5522
|
+
tokadd(nondigit);
|
5523
|
+
seen_e++;
|
5524
|
+
is_float++;
|
5233
5525
|
tokadd(c);
|
5234
|
-
nondigit = c;
|
5526
|
+
nondigit = (c == '-' || c == '+') ? c : 0;
|
5235
5527
|
break;
|
5236
5528
|
|
5237
5529
|
case '_': /* `_' in number just ignored */
|
@@ -5255,16 +5547,30 @@ retry:
|
|
5255
5547
|
}
|
5256
5548
|
tokfix();
|
5257
5549
|
if(is_float) {
|
5258
|
-
|
5259
|
-
|
5260
|
-
|
5261
|
-
|
5550
|
+
int type = tFLOAT;
|
5551
|
+
VALUE v;
|
5552
|
+
|
5553
|
+
suffix = number_literal_suffix(seen_e ? NUM_SUFFIX_I : NUM_SUFFIX_ALL);
|
5554
|
+
if(suffix & NUM_SUFFIX_R) {
|
5555
|
+
char *point = &tok()[seen_point];
|
5556
|
+
size_t fraclen = toklen()-seen_point-1;
|
5557
|
+
type = tRATIONAL;
|
5558
|
+
memmove(point, point+1, fraclen+1);
|
5559
|
+
v = rb_cstr_to_inum(tok(), 10, FALSE);
|
5560
|
+
v = rb_rational_new(v,
|
5561
|
+
rb_funcall(INT2FIX(10), rb_intern("**"), 1, INT2NUM(fraclen)));
|
5562
|
+
} else {
|
5563
|
+
double d = strtod(tok(), 0);
|
5564
|
+
if(errno == ERANGE) {
|
5565
|
+
rb_warningS("Float %s out of range", tok());
|
5566
|
+
errno = 0;
|
5567
|
+
}
|
5568
|
+
v = rb_float_new(d);
|
5262
5569
|
}
|
5263
|
-
|
5264
|
-
return tFLOAT;
|
5570
|
+
return set_number_literal(v, type, suffix);
|
5265
5571
|
}
|
5266
|
-
|
5267
|
-
return
|
5572
|
+
suffix = number_literal_suffix(NUM_SUFFIX_ALL);
|
5573
|
+
return set_integer_literal(rb_cstr_to_inum(tok(), 10, FALSE), suffix);
|
5268
5574
|
}
|
5269
5575
|
|
5270
5576
|
case ')':
|
@@ -5278,12 +5584,15 @@ retry:
|
|
5278
5584
|
} else {
|
5279
5585
|
lex_state = EXPR_ENDARG;
|
5280
5586
|
}
|
5587
|
+
if(c == '}') {
|
5588
|
+
if (!brace_nest--) c = tSTRING_DEND;
|
5589
|
+
}
|
5281
5590
|
return c;
|
5282
5591
|
|
5283
5592
|
case ':':
|
5284
5593
|
c = nextc();
|
5285
5594
|
if(c == ':') {
|
5286
|
-
if(IS_BEG() ||
|
5595
|
+
if(IS_BEG() || lex_state_p(EXPR_CLASS) || IS_SPCARG(-1)) {
|
5287
5596
|
lex_state = EXPR_BEG;
|
5288
5597
|
return tCOLON3;
|
5289
5598
|
}
|
@@ -5311,7 +5620,7 @@ retry:
|
|
5311
5620
|
return tSYMBEG;
|
5312
5621
|
|
5313
5622
|
case '/':
|
5314
|
-
if(
|
5623
|
+
if(lex_state_p(EXPR_BEG_ANY)) {
|
5315
5624
|
lex_strterm = NEW_STRTERM(str_regexp, '/', 0);
|
5316
5625
|
return tREGEXP_BEG;
|
5317
5626
|
}
|
@@ -5326,14 +5635,7 @@ retry:
|
|
5326
5635
|
lex_strterm = NEW_STRTERM(str_regexp, '/', 0);
|
5327
5636
|
return tREGEXP_BEG;
|
5328
5637
|
}
|
5329
|
-
|
5330
|
-
case EXPR_FNAME: case EXPR_DOT:
|
5331
|
-
lex_state = EXPR_ARG;
|
5332
|
-
break;
|
5333
|
-
default:
|
5334
|
-
lex_state = EXPR_BEG;
|
5335
|
-
break;
|
5336
|
-
}
|
5638
|
+
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
5337
5639
|
warn_balanced("/", "regexp literal");
|
5338
5640
|
return '/';
|
5339
5641
|
|
@@ -5343,14 +5645,7 @@ retry:
|
|
5343
5645
|
lex_state = EXPR_BEG;
|
5344
5646
|
return tOP_ASGN;
|
5345
5647
|
}
|
5346
|
-
|
5347
|
-
case EXPR_FNAME: case EXPR_DOT:
|
5348
|
-
lex_state = EXPR_ARG;
|
5349
|
-
break;
|
5350
|
-
default:
|
5351
|
-
lex_state = EXPR_BEG;
|
5352
|
-
break;
|
5353
|
-
}
|
5648
|
+
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
5354
5649
|
pushback(c);
|
5355
5650
|
return '^';
|
5356
5651
|
|
@@ -5358,12 +5653,13 @@ retry:
|
|
5358
5653
|
lex_state = EXPR_BEG;
|
5359
5654
|
command_start = TRUE;
|
5360
5655
|
return ';';
|
5656
|
+
|
5361
5657
|
case ',':
|
5362
5658
|
lex_state = EXPR_BEG;
|
5363
5659
|
return ',';
|
5364
5660
|
|
5365
5661
|
case '~':
|
5366
|
-
if(
|
5662
|
+
if(IS_AFTER_OPERATOR()) {
|
5367
5663
|
if((c = nextc()) != '@') {
|
5368
5664
|
pushback(c);
|
5369
5665
|
}
|
@@ -5387,7 +5683,7 @@ retry:
|
|
5387
5683
|
|
5388
5684
|
case '[':
|
5389
5685
|
paren_nest++;
|
5390
|
-
if(
|
5686
|
+
if(IS_AFTER_OPERATOR()) {
|
5391
5687
|
lex_state = EXPR_ARG;
|
5392
5688
|
if((c = nextc()) == ']') {
|
5393
5689
|
if((c = nextc()) == '=') {
|
@@ -5409,6 +5705,7 @@ retry:
|
|
5409
5705
|
return c;
|
5410
5706
|
|
5411
5707
|
case '{':
|
5708
|
+
++brace_nest;
|
5412
5709
|
if(lpar_beg && lpar_beg == paren_nest) {
|
5413
5710
|
lex_state = EXPR_BEG;
|
5414
5711
|
lpar_beg = 0;
|
@@ -5417,12 +5714,13 @@ retry:
|
|
5417
5714
|
CMDARG_PUSH(0);
|
5418
5715
|
return tLAMBEG;
|
5419
5716
|
}
|
5420
|
-
if(IS_ARG() ||
|
5717
|
+
if(IS_ARG() || lex_state_p(EXPR_END | EXPR_ENDFN)) {
|
5421
5718
|
c = '{'; /* block (primary) */
|
5422
|
-
else if(
|
5719
|
+
} else if(lex_state_p(EXPR_ENDARG)) {
|
5423
5720
|
c = tLBRACE_ARG; /* block (expr) */
|
5424
|
-
else
|
5721
|
+
} else {
|
5425
5722
|
c = tLBRACE; /* hash */
|
5723
|
+
}
|
5426
5724
|
COND_PUSH(0);
|
5427
5725
|
CMDARG_PUSH(0);
|
5428
5726
|
lex_state = EXPR_BEG;
|
@@ -5439,7 +5737,7 @@ retry:
|
|
5439
5737
|
return '\\';
|
5440
5738
|
|
5441
5739
|
case '%':
|
5442
|
-
if(
|
5740
|
+
if(lex_state_p(EXPR_BEG_ANY)) {
|
5443
5741
|
intptr_t term;
|
5444
5742
|
intptr_t paren;
|
5445
5743
|
|
@@ -5487,6 +5785,18 @@ retry:
|
|
5487
5785
|
pushback(c);
|
5488
5786
|
return tQWORDS_BEG;
|
5489
5787
|
|
5788
|
+
case 'I':
|
5789
|
+
lex_strterm = NEW_STRTERM(str_dword, term, paren);
|
5790
|
+
do {c = nextc();} while (ISSPACE(c));
|
5791
|
+
pushback(c);
|
5792
|
+
return tSYMBOLS_BEG;
|
5793
|
+
|
5794
|
+
case 'i':
|
5795
|
+
lex_strterm = NEW_STRTERM(str_sword, term, paren);
|
5796
|
+
do {c = nextc();} while (ISSPACE(c));
|
5797
|
+
pushback(c);
|
5798
|
+
return tQSYMBOLS_BEG;
|
5799
|
+
|
5490
5800
|
case 'x':
|
5491
5801
|
lex_strterm = NEW_STRTERM(str_xquote, term, paren);
|
5492
5802
|
return tXSTRING_BEG;
|
@@ -5513,14 +5823,7 @@ retry:
|
|
5513
5823
|
if(IS_SPCARG(c)) {
|
5514
5824
|
goto quotation;
|
5515
5825
|
}
|
5516
|
-
|
5517
|
-
case EXPR_FNAME: case EXPR_DOT:
|
5518
|
-
lex_state = EXPR_ARG;
|
5519
|
-
break;
|
5520
|
-
default:
|
5521
|
-
lex_state = EXPR_BEG;
|
5522
|
-
break;
|
5523
|
-
}
|
5826
|
+
lex_state = IS_AFTER_OPERATOR() ? EXPR_ARG : EXPR_BEG;
|
5524
5827
|
pushback(c);
|
5525
5828
|
warn_balanced("%%", "string literal");
|
5526
5829
|
return '%';
|
@@ -5558,9 +5861,7 @@ retry:
|
|
5558
5861
|
case '\"': /* $": already loaded files */
|
5559
5862
|
tokadd('$');
|
5560
5863
|
tokadd(c);
|
5561
|
-
|
5562
|
-
set_yylval_name(parser_intern(tok()));
|
5563
|
-
return tGVAR;
|
5864
|
+
goto gvar;
|
5564
5865
|
|
5565
5866
|
case '-':
|
5566
5867
|
tokadd('$');
|
@@ -5570,9 +5871,12 @@ retry:
|
|
5570
5871
|
if(tokadd_mbchar(c) == -1) return 0;
|
5571
5872
|
} else {
|
5572
5873
|
pushback(c);
|
5874
|
+
pushback('-');
|
5875
|
+
return '$';
|
5573
5876
|
}
|
5574
5877
|
gvar:
|
5575
5878
|
tokfix();
|
5879
|
+
// TODO rb_intern3(tok(), tokidx, current_enc);
|
5576
5880
|
set_yylval_name(parser_intern(tok()));
|
5577
5881
|
return tGVAR;
|
5578
5882
|
|
@@ -5580,7 +5884,7 @@ retry:
|
|
5580
5884
|
case '`': /* $`: string before last match */
|
5581
5885
|
case '\'': /* $': string after last match */
|
5582
5886
|
case '+': /* $+: string matches last paren. */
|
5583
|
-
if(last_state
|
5887
|
+
if(lex_state_of_p(last_state, EXPR_FNAME)) {
|
5584
5888
|
tokadd('$');
|
5585
5889
|
tokadd(c);
|
5586
5890
|
goto gvar;
|
@@ -5597,7 +5901,7 @@ retry:
|
|
5597
5901
|
c = nextc();
|
5598
5902
|
} while(c != -1 && ISDIGIT(c));
|
5599
5903
|
pushback(c);
|
5600
|
-
if(last_state
|
5904
|
+
if(lex_state_of_p(last_state, EXPR_FNAME)) goto gvar;
|
5601
5905
|
tokfix();
|
5602
5906
|
set_yylval_node(NEW_NTH_REF(atoi(tok()+1)));
|
5603
5907
|
return tNTH_REF;
|
@@ -5605,7 +5909,9 @@ retry:
|
|
5605
5909
|
default:
|
5606
5910
|
if(!parser_is_identchar()) {
|
5607
5911
|
pushback(c);
|
5608
|
-
|
5912
|
+
rb_compile_error(parser_state,
|
5913
|
+
"`$%c' is not allowed as a global variable name", c);
|
5914
|
+
return 0;
|
5609
5915
|
}
|
5610
5916
|
case '0':
|
5611
5917
|
tokadd('$');
|
@@ -5620,7 +5926,7 @@ retry:
|
|
5620
5926
|
tokadd('@');
|
5621
5927
|
c = nextc();
|
5622
5928
|
}
|
5623
|
-
if(c != -1 && ISDIGIT(c)) {
|
5929
|
+
if(c != -1 && (ISDIGIT(c) || !parser_is_identchar())) {
|
5624
5930
|
if(tokidx == 1) {
|
5625
5931
|
rb_compile_error(parser_state,
|
5626
5932
|
"`@%c' is not allowed as an instance variable name", c);
|
@@ -5630,10 +5936,6 @@ retry:
|
|
5630
5936
|
}
|
5631
5937
|
return 0;
|
5632
5938
|
}
|
5633
|
-
if(!parser_is_identchar()) {
|
5634
|
-
pushback(c);
|
5635
|
-
return '@';
|
5636
|
-
}
|
5637
5939
|
break;
|
5638
5940
|
|
5639
5941
|
case '_':
|
@@ -5694,7 +5996,7 @@ retry:
|
|
5694
5996
|
if(toklast() == '!' || toklast() == '?') {
|
5695
5997
|
result = tFID;
|
5696
5998
|
} else {
|
5697
|
-
if(
|
5999
|
+
if(lex_state_p(EXPR_FNAME)) {
|
5698
6000
|
if((c = nextc()) == '=' && !peek('~') && !peek('>') &&
|
5699
6001
|
(!peek('=') || (peek_n('>', 1)))) {
|
5700
6002
|
result = tIDENTIFIER;
|
@@ -5727,25 +6029,27 @@ retry:
|
|
5727
6029
|
if(kw) {
|
5728
6030
|
enum lex_state_e state = lex_state;
|
5729
6031
|
lex_state = kw->state;
|
5730
|
-
if(state
|
6032
|
+
if(lex_state_of_p(state, EXPR_FNAME)) {
|
5731
6033
|
set_yylval_name(parser_intern(kw->name));
|
5732
6034
|
return kw->id[0];
|
5733
6035
|
}
|
5734
|
-
if(
|
6036
|
+
if(lex_state_p(EXPR_BEG)) {
|
5735
6037
|
command_start = TRUE;
|
6038
|
+
}
|
6039
|
+
if(kw->id[0] == keyword_do) {
|
5736
6040
|
if(lpar_beg && lpar_beg == paren_nest) {
|
5737
6041
|
lpar_beg = 0;
|
5738
6042
|
--paren_nest;
|
5739
6043
|
return keyword_do_LAMBDA;
|
5740
6044
|
}
|
5741
6045
|
if(COND_P()) return keyword_do_cond;
|
5742
|
-
if(CMDARG_P() && state
|
6046
|
+
if(CMDARG_P() && !lex_state_of_p(state, EXPR_CMDARG))
|
5743
6047
|
return keyword_do_block;
|
5744
|
-
if(state
|
6048
|
+
if(lex_state_of_p(state, EXPR_BEG | EXPR_ENDARG))
|
5745
6049
|
return keyword_do_block;
|
5746
6050
|
return keyword_do;
|
5747
6051
|
}
|
5748
|
-
if(state
|
6052
|
+
if(lex_state_of_p(state, EXPR_BEG | EXPR_VALUE))
|
5749
6053
|
return kw->id[0];
|
5750
6054
|
else {
|
5751
6055
|
if(kw->id[0] != kw->id[1])
|
@@ -5755,9 +6059,7 @@ retry:
|
|
5755
6059
|
}
|
5756
6060
|
}
|
5757
6061
|
|
5758
|
-
if(
|
5759
|
-
lex_state == EXPR_DOT ||
|
5760
|
-
IS_ARG()) {
|
6062
|
+
if(lex_state_p(EXPR_BEG_ANY | EXPR_ARG_ANY | EXPR_DOT)) {
|
5761
6063
|
if(cmd_state) {
|
5762
6064
|
lex_state = EXPR_CMDARG;
|
5763
6065
|
} else {
|
@@ -5773,7 +6075,7 @@ retry:
|
|
5773
6075
|
ID ident = TOK_INTERN(!ENC_SINGLE(mb));
|
5774
6076
|
|
5775
6077
|
set_yylval_name(ident);
|
5776
|
-
if(last_state
|
6078
|
+
if(!lex_state_of_p(last_state, EXPR_DOT | EXPR_FNAME) &&
|
5777
6079
|
is_local_id(ident) && lvar_defined(ident)) {
|
5778
6080
|
lex_state = EXPR_END;
|
5779
6081
|
}
|
@@ -6031,6 +6333,8 @@ static NODE *
|
|
6031
6333
|
parser_literal_concat(rb_parser_state* parser_state, NODE *head, NODE *tail)
|
6032
6334
|
{
|
6033
6335
|
enum node_type htype;
|
6336
|
+
NODE *headlast;
|
6337
|
+
VALUE lit;
|
6034
6338
|
|
6035
6339
|
if(!head) return tail;
|
6036
6340
|
if(!tail) return head;
|
@@ -6039,11 +6343,20 @@ parser_literal_concat(rb_parser_state* parser_state, NODE *head, NODE *tail)
|
|
6039
6343
|
if(htype == NODE_EVSTR) {
|
6040
6344
|
NODE *node = NEW_DSTR(STR_NEW0());
|
6041
6345
|
head = list_append(node, head);
|
6346
|
+
htype = NODE_DSTR;
|
6042
6347
|
}
|
6043
6348
|
switch(nd_type(tail)) {
|
6044
6349
|
case NODE_STR:
|
6350
|
+
if(htype == NODE_DSTR
|
6351
|
+
&& (headlast = head->nd_next->nd_end->nd_head)
|
6352
|
+
&& nd_type(headlast) == NODE_STR) {
|
6353
|
+
htype = NODE_STR;
|
6354
|
+
lit = headlast->nd_lit;
|
6355
|
+
} else {
|
6356
|
+
lit = head->nd_lit;
|
6357
|
+
}
|
6045
6358
|
if(htype == NODE_STR) {
|
6046
|
-
if(!literal_concat0(
|
6359
|
+
if(!literal_concat0(lit, tail->nd_lit)) {
|
6047
6360
|
error:
|
6048
6361
|
return 0;
|
6049
6362
|
}
|
@@ -6059,9 +6372,18 @@ parser_literal_concat(rb_parser_state* parser_state, NODE *head, NODE *tail)
|
|
6059
6372
|
tail->nd_lit = head->nd_lit;
|
6060
6373
|
head = tail;
|
6061
6374
|
} else if(NIL_P(tail->nd_lit)) {
|
6375
|
+
append:
|
6062
6376
|
head->nd_alen += tail->nd_alen - 1;
|
6063
6377
|
head->nd_next->nd_end->nd_next = tail->nd_next;
|
6064
6378
|
head->nd_next->nd_end = tail->nd_next->nd_end;
|
6379
|
+
} else if(htype == NODE_DSTR
|
6380
|
+
&& (headlast = head->nd_next->nd_end->nd_head)
|
6381
|
+
&& nd_type(headlast) == NODE_STR) {
|
6382
|
+
lit = headlast->nd_lit;
|
6383
|
+
if (!literal_concat0(lit, tail->nd_lit))
|
6384
|
+
goto error;
|
6385
|
+
tail->nd_lit = Qnil;
|
6386
|
+
goto append;
|
6065
6387
|
} else {
|
6066
6388
|
nd_set_type(tail, NODE_ARRAY);
|
6067
6389
|
tail->nd_head = NEW_STR(tail->nd_lit);
|
@@ -6125,6 +6447,7 @@ static const struct {
|
|
6125
6447
|
{tDOT2, ".."},
|
6126
6448
|
{tDOT3, "..."},
|
6127
6449
|
{tPOW, "**"},
|
6450
|
+
{tDSTAR, "**"},
|
6128
6451
|
{tUPLUS, "+@"},
|
6129
6452
|
{tUMINUS, "-@"},
|
6130
6453
|
{tCMP, "<=>"},
|
@@ -6379,8 +6702,6 @@ parser_aryset(rb_parser_state* parser_state, NODE *recv, NODE *idx)
|
|
6379
6702
|
{
|
6380
6703
|
if(recv && nd_type(recv) == NODE_SELF) {
|
6381
6704
|
recv = (NODE *)1;
|
6382
|
-
} else {
|
6383
|
-
value_expr(recv);
|
6384
6705
|
}
|
6385
6706
|
return NEW_ATTRASGN(recv, convert_op(tASET), idx);
|
6386
6707
|
}
|
@@ -6393,9 +6714,44 @@ parser_block_dup_check(rb_parser_state* parser_state, NODE *node1, NODE *node2)
|
|
6393
6714
|
}
|
6394
6715
|
}
|
6395
6716
|
|
6717
|
+
static const char id_type_names[][9] = {
|
6718
|
+
"LOCAL",
|
6719
|
+
"INSTANCE",
|
6720
|
+
"", /* INSTANCE2 */
|
6721
|
+
"GLOBAL",
|
6722
|
+
"ATTRSET",
|
6723
|
+
"CONST",
|
6724
|
+
"CLASS",
|
6725
|
+
"JUNK",
|
6726
|
+
};
|
6727
|
+
|
6396
6728
|
static ID
|
6397
6729
|
rb_id_attrset(ID id)
|
6398
6730
|
{
|
6731
|
+
if(!is_notop_id(id)) {
|
6732
|
+
switch (id) {
|
6733
|
+
case tAREF:
|
6734
|
+
case tASET:
|
6735
|
+
return tASET; /* only exception */
|
6736
|
+
}
|
6737
|
+
rb_name_error(id, "cannot make operator ID :%s attrset", rb_id2name(id));
|
6738
|
+
} else {
|
6739
|
+
int scope = (int)(id & ID_SCOPE_MASK);
|
6740
|
+
switch(scope) {
|
6741
|
+
case ID_LOCAL:
|
6742
|
+
case ID_INSTANCE:
|
6743
|
+
case ID_GLOBAL:
|
6744
|
+
case ID_CONST:
|
6745
|
+
case ID_CLASS:
|
6746
|
+
case ID_JUNK:
|
6747
|
+
break;
|
6748
|
+
case ID_ATTRSET:
|
6749
|
+
return id;
|
6750
|
+
default:
|
6751
|
+
rb_name_error(id, "cannot make %s ID %+ld attrset",
|
6752
|
+
id_type_names[scope], ID2SYM(id));
|
6753
|
+
}
|
6754
|
+
}
|
6399
6755
|
id &= ~ID_SCOPE_MASK;
|
6400
6756
|
id |= ID_ATTRSET;
|
6401
6757
|
return id;
|
@@ -6448,18 +6804,6 @@ parser_arg_append(rb_parser_state* parser_state, NODE *node1, NODE *node2)
|
|
6448
6804
|
return NEW_ARGSPUSH(node1, node2);
|
6449
6805
|
}
|
6450
6806
|
|
6451
|
-
static NODE *
|
6452
|
-
arg_add(rb_parser_state* parser_state, NODE *node1, NODE *node2)
|
6453
|
-
{
|
6454
|
-
if(!node1) return NEW_LIST(node2);
|
6455
|
-
if(nd_type(node1) == NODE_ARRAY) {
|
6456
|
-
return list_append(node1, node2);
|
6457
|
-
}
|
6458
|
-
else {
|
6459
|
-
return NEW_ARGSPUSH(node1, node2);
|
6460
|
-
}
|
6461
|
-
}
|
6462
|
-
|
6463
6807
|
static NODE *
|
6464
6808
|
splat_array(NODE* node)
|
6465
6809
|
{
|
@@ -6473,7 +6817,6 @@ parser_node_assign(rb_parser_state* parser_state, NODE *lhs, NODE *rhs)
|
|
6473
6817
|
{
|
6474
6818
|
if(!lhs) return 0;
|
6475
6819
|
|
6476
|
-
value_expr(rhs);
|
6477
6820
|
switch(nd_type(lhs)) {
|
6478
6821
|
case NODE_GASGN:
|
6479
6822
|
case NODE_IASGN:
|
@@ -6482,14 +6825,13 @@ parser_node_assign(rb_parser_state* parser_state, NODE *lhs, NODE *rhs)
|
|
6482
6825
|
case NODE_DASGN_CURR:
|
6483
6826
|
case NODE_MASGN:
|
6484
6827
|
case NODE_CDECL:
|
6485
|
-
case NODE_CVDECL:
|
6486
6828
|
case NODE_CVASGN:
|
6487
6829
|
lhs->nd_value = rhs;
|
6488
6830
|
break;
|
6489
6831
|
|
6490
6832
|
case NODE_ATTRASGN:
|
6491
6833
|
case NODE_CALL:
|
6492
|
-
lhs->nd_args =
|
6834
|
+
lhs->nd_args = arg_append(lhs->nd_args, rhs);
|
6493
6835
|
break;
|
6494
6836
|
|
6495
6837
|
default:
|
@@ -6500,6 +6842,76 @@ parser_node_assign(rb_parser_state* parser_state, NODE *lhs, NODE *rhs)
|
|
6500
6842
|
return lhs;
|
6501
6843
|
}
|
6502
6844
|
|
6845
|
+
static NODE*
|
6846
|
+
parser_new_op_assign(rb_parser_state* parser_state, NODE *lhs, ID op, NODE *rhs)
|
6847
|
+
{
|
6848
|
+
NODE *asgn;
|
6849
|
+
|
6850
|
+
if(lhs) {
|
6851
|
+
ID vid = lhs->nd_vid;
|
6852
|
+
if(op == tOROP) {
|
6853
|
+
lhs->nd_value = rhs;
|
6854
|
+
asgn = NEW_OP_ASGN_OR(gettable(vid), lhs);
|
6855
|
+
if(is_asgn_or_id(vid)) {
|
6856
|
+
asgn->nd_aid = vid;
|
6857
|
+
}
|
6858
|
+
} else if(op == tANDOP) {
|
6859
|
+
lhs->nd_value = rhs;
|
6860
|
+
asgn = NEW_OP_ASGN_AND(gettable(vid), lhs);
|
6861
|
+
} else {
|
6862
|
+
asgn = lhs;
|
6863
|
+
// TODO: is NEW_LIST(rhs) needed?
|
6864
|
+
asgn->nd_value = call_bin_op(gettable(vid), op, rhs);
|
6865
|
+
}
|
6866
|
+
} else {
|
6867
|
+
asgn = NEW_BEGIN(0);
|
6868
|
+
}
|
6869
|
+
|
6870
|
+
return asgn;
|
6871
|
+
}
|
6872
|
+
|
6873
|
+
static NODE*
|
6874
|
+
parser_new_attr_op_assign(rb_parser_state* parser_state,
|
6875
|
+
NODE *lhs, ID attr, ID op, NODE *rhs)
|
6876
|
+
{
|
6877
|
+
NODE *asgn;
|
6878
|
+
|
6879
|
+
if(op == tOROP) {
|
6880
|
+
op = 0;
|
6881
|
+
} else if(op == tANDOP) {
|
6882
|
+
op = 1;
|
6883
|
+
} else {
|
6884
|
+
op = convert_op(op);
|
6885
|
+
}
|
6886
|
+
asgn = NEW_OP_ASGN2(lhs, attr, op, rhs);
|
6887
|
+
fixpos(asgn, lhs);
|
6888
|
+
|
6889
|
+
return asgn;
|
6890
|
+
}
|
6891
|
+
|
6892
|
+
static NODE*
|
6893
|
+
parser_new_const_op_assign(rb_parser_state* parser_state, NODE *lhs, ID op, NODE *rhs)
|
6894
|
+
{
|
6895
|
+
NODE *asgn;
|
6896
|
+
|
6897
|
+
if(op == tOROP) {
|
6898
|
+
op = 0;
|
6899
|
+
} else if(op == tANDOP) {
|
6900
|
+
op = 1;
|
6901
|
+
} else {
|
6902
|
+
op = convert_op(op);
|
6903
|
+
}
|
6904
|
+
|
6905
|
+
if(lhs) {
|
6906
|
+
asgn = NEW_OP_CDECL(lhs, op, rhs);
|
6907
|
+
} else {
|
6908
|
+
asgn = NEW_BEGIN(0);
|
6909
|
+
}
|
6910
|
+
fixpos(asgn, lhs);
|
6911
|
+
|
6912
|
+
return asgn;
|
6913
|
+
}
|
6914
|
+
|
6503
6915
|
static int
|
6504
6916
|
parser_value_expr(rb_parser_state* parser_state, NODE *node)
|
6505
6917
|
{
|
@@ -6511,11 +6923,6 @@ parser_value_expr(rb_parser_state* parser_state, NODE *node)
|
|
6511
6923
|
|
6512
6924
|
while(node) {
|
6513
6925
|
switch(nd_type(node)) {
|
6514
|
-
case NODE_DEFN:
|
6515
|
-
case NODE_DEFS:
|
6516
|
-
parser_warning(node, "void value expression");
|
6517
|
-
return FALSE;
|
6518
|
-
|
6519
6926
|
case NODE_RETURN:
|
6520
6927
|
case NODE_BREAK:
|
6521
6928
|
case NODE_NEXT:
|
@@ -6899,6 +7306,8 @@ parser_negate_lit(rb_parser_state* parser_state, NODE *node)
|
|
6899
7306
|
node->nd_lit = LONG2FIX(-FIX2LONG(node->nd_lit));
|
6900
7307
|
break;
|
6901
7308
|
case T_BIGNUM:
|
7309
|
+
case T_RATIONAL:
|
7310
|
+
case T_COMPLEX:
|
6902
7311
|
node->nd_lit = REF(rb_funcall(node->nd_lit, rb_intern("-@"), 0, 0));
|
6903
7312
|
break;
|
6904
7313
|
case T_FLOAT:
|
@@ -6921,25 +7330,50 @@ arg_blk_pass(NODE *node1, NODE *node2)
|
|
6921
7330
|
}
|
6922
7331
|
|
6923
7332
|
static NODE*
|
6924
|
-
parser_new_args(rb_parser_state* parser_state, NODE *m, NODE *o, ID r, NODE *p,
|
7333
|
+
parser_new_args(rb_parser_state* parser_state, NODE *m, NODE *o, ID r, NODE *p, NODE *tail)
|
7334
|
+
{
|
7335
|
+
int saved_line = sourceline;
|
7336
|
+
struct rb_args_info *args = tail->nd_ainfo;
|
7337
|
+
|
7338
|
+
args->pre_args_num = m ? rb_long2int(m->nd_plen) : 0;
|
7339
|
+
args->pre_init = m ? m->nd_next : 0;
|
7340
|
+
|
7341
|
+
args->post_args_num = p ? rb_long2int(p->nd_plen) : 0;
|
7342
|
+
args->post_init = p ? p->nd_next : 0;
|
7343
|
+
args->first_post_arg = p ? p->nd_pid : 0;
|
7344
|
+
|
7345
|
+
args->rest_arg = r;
|
7346
|
+
|
7347
|
+
args->opt_args = o;
|
7348
|
+
|
7349
|
+
sourceline = saved_line;
|
7350
|
+
return tail;
|
7351
|
+
}
|
7352
|
+
|
7353
|
+
static NODE*
|
7354
|
+
parser_new_args_tail(rb_parser_state* parser_state, NODE *k, ID kr, ID b)
|
6925
7355
|
{
|
6926
7356
|
int saved_line = sourceline;
|
7357
|
+
struct rb_args_info *args;
|
7358
|
+
NODE *kw_rest_arg = 0;
|
6927
7359
|
NODE *node;
|
6928
|
-
NODE *i1, *i2 = 0;
|
6929
7360
|
|
6930
|
-
|
6931
|
-
|
6932
|
-
node
|
7361
|
+
args = ALLOC(struct rb_args_info);
|
7362
|
+
MEMZERO(args, struct rb_args_info, 1);
|
7363
|
+
node = NEW_NODE(NODE_ARGS, 0, 0, args);
|
6933
7364
|
|
6934
|
-
|
6935
|
-
|
6936
|
-
|
6937
|
-
|
6938
|
-
|
6939
|
-
|
6940
|
-
|
6941
|
-
|
7365
|
+
args->block_arg = b;
|
7366
|
+
args->kw_args = k;
|
7367
|
+
if(kr) {
|
7368
|
+
if(kr == 1) {
|
7369
|
+
kw_rest_arg = (NODE*)kr;
|
7370
|
+
} else {
|
7371
|
+
arg_var(kr);
|
7372
|
+
kw_rest_arg = NEW_DVAR(kr);
|
7373
|
+
}
|
6942
7374
|
}
|
7375
|
+
args->kw_rest_arg = kw_rest_arg;
|
7376
|
+
|
6943
7377
|
sourceline = saved_line;
|
6944
7378
|
return node;
|
6945
7379
|
}
|
@@ -7109,8 +7543,8 @@ parser_id2name(ID id)
|
|
7109
7543
|
static int
|
7110
7544
|
scan_oct(const char *start, size_t len, size_t *retlen)
|
7111
7545
|
{
|
7112
|
-
|
7113
|
-
|
7546
|
+
const char *s = start;
|
7547
|
+
int retval = 0;
|
7114
7548
|
|
7115
7549
|
while(len-- && *s >= '0' && *s <= '7') {
|
7116
7550
|
retval <<= 3;
|
@@ -7124,8 +7558,8 @@ static int
|
|
7124
7558
|
scan_hex(const char *start, size_t len, size_t *retlen)
|
7125
7559
|
{
|
7126
7560
|
static const char hexdigit[] = "0123456789abcdef0123456789ABCDEF";
|
7127
|
-
|
7128
|
-
|
7561
|
+
const char *s = start;
|
7562
|
+
int retval = 0;
|
7129
7563
|
const char *tmp;
|
7130
7564
|
|
7131
7565
|
while(len-- && *s && (tmp = strchr(hexdigit, *s))) {
|