From 30d9c59b5f3cba8b5d632d20c2370e82d8ba69ca Mon Sep 17 00:00:00 2001 From: Zefram Date: Sat, 1 Feb 2014 01:27:13 +0000 Subject: [PATCH] subroutine signatures Declarative syntax to unwrap argument list into lexical variables. "sub foo ($a,$b) {...}" checks number of arguments and puts the arguments into lexical variables. Signatures are not equivalent to the existing idiom of "sub foo { my($a,$b) = @_; ... }". Signatures are only available by enabling a non-default feature, and generate warnings about being experimental. The syntactic clash with prototypes is managed by disabling the short prototype syntax when signatures are enabled. --- MANIFEST | 1 + embed.fnc | 1 + embed.h | 1 + feature.h | 6 + lib/feature.pm | 25 +- lib/warnings.pm | 25 +- op.h | 2 +- perly.act | 573 +++++++++++++----------- perly.c | 1 + perly.h | 34 +- perly.tab | 1244 ++++++++++++++++++++++++++------------------------- perly.y | 44 +- pod/perldiag.pod | 71 +++ pod/perllexwarn.pod | 2 + pod/perlsub.pod | 215 ++++++++- proto.h | 3 + regen/feature.pl | 23 +- regen/warnings.pl | 2 + t/lib/warnings/op | 17 + t/op/lexsub.t | 8 +- t/op/signatures.t | 1092 ++++++++++++++++++++++++++++++++++++++++++++ toke.c | 214 ++++++++- warnings.h | 3 +- 23 files changed, 2673 insertions(+), 934 deletions(-) create mode 100644 t/op/signatures.t diff --git a/MANIFEST b/MANIFEST index 5e47478..acc3355 100644 --- a/MANIFEST +++ b/MANIFEST @@ -5262,6 +5262,7 @@ t/op/runlevel.t See if die() works from perl_call_*() t/op/select.t See if 0- and 1-argument select works t/op/setpgrpstack.t See if setpgrp works t/op/sigdispatch.t See if signals are always dispatched +t/op/signatures.t See if sub signatures work t/op/sigsystem.t See if system and SIGCHLD handlers play together nicely t/op/sleep.t See if sleep works t/op/smartkve.t See if smart deref for keys/values/each works diff --git a/embed.fnc b/embed.fnc index e00be7a..f8487d0 100644 --- a/embed.fnc +++ b/embed.fnc @@ -435,6 +435,7 @@ Apd |void |fbm_compile |NN SV* sv|U32 flags ApdR |char* |fbm_instr |NN unsigned char* big|NN unsigned char* bigend \ |NN SV* littlestr|U32 flags p |CV * |find_lexical_cv|PADOFFSET off +pR |OP * |parse_subsignature : Defined in util.c, used only in perl.c p |char* |find_script |NN const char *scriptname|bool dosearch \ |NULLOK const char *const *const search_ext|I32 flags diff --git a/embed.h b/embed.h index d172248..15ccb77 100644 --- a/embed.h +++ b/embed.h @@ -1212,6 +1212,7 @@ #define pad_push(a,b) Perl_pad_push(aTHX_ a,b) #define pad_swipe(a,b) Perl_pad_swipe(aTHX_ a,b) #define padlist_store(a,b,c) Perl_padlist_store(aTHX_ a,b,c) +#define parse_subsignature() Perl_parse_subsignature(aTHX) #define parse_unicode_opts(a) Perl_parse_unicode_opts(aTHX_ a) #define parser_free(a) Perl_parser_free(aTHX_ a) #define peep(a) Perl_peep(aTHX_ a) diff --git a/feature.h b/feature.h index c98a5b3..698302c 100644 --- a/feature.h +++ b/feature.h @@ -80,6 +80,12 @@ FEATURE_IS_ENABLED("arybase")) \ ) +#define FEATURE_SIGNATURES_IS_ENABLED \ + ( \ + CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \ + FEATURE_IS_ENABLED("signatures") \ + ) + #define FEATURE___SUB___IS_ENABLED \ ( \ CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_515 \ diff --git a/lib/feature.pm b/lib/feature.pm index 84ad9cb..32dc930 100644 --- a/lib/feature.pm +++ b/lib/feature.pm @@ -5,7 +5,7 @@ package feature; -our $VERSION = '1.34'; +our $VERSION = '1.35'; our %feature = ( fc => 'feature_fc', @@ -15,6 +15,7 @@ our %feature = ( evalbytes => 'feature_evalbytes', postderef => 'feature_postderef', array_base => 'feature_arybase', + signatures => 'feature_signatures', current_sub => 'feature___SUB__', lexical_subs => 'feature_lexsubs', postderef_qq => 'feature_postderef_qq', @@ -26,7 +27,7 @@ our %feature_bundle = ( "5.10" => [qw(array_base say state switch)], "5.11" => [qw(array_base say state switch unicode_strings)], "5.15" => [qw(current_sub evalbytes fc say state switch unicode_eval unicode_strings)], - "all" => [qw(array_base current_sub evalbytes fc lexical_subs postderef postderef_qq say state switch unicode_eval unicode_strings)], + "all" => [qw(array_base current_sub evalbytes fc lexical_subs postderef postderef_qq say signatures state switch unicode_eval unicode_strings)], "default" => [qw(array_base)], ); @@ -245,6 +246,26 @@ and C syntax. See L for details. This feature is available from Perl 5.18 onwards. +=head2 The 'signatures' feature + +B: This feature is still experimental and the implementation may +change in future versions of Perl. For this reason, Perl will +warn when you use the feature, unless you have explicitly disabled the +warning: + + no warnings "experimental::signatures"; + +This enables unpacking of subroutine arguments into lexical variables +by syntax such as + + sub foo ($left, $right) { + return $left + $right; + } + +See L for details. + +This feature is available from Perl 5.20 onwards. + =head1 FEATURE BUNDLES It's possible to load multiple features together, using diff --git a/lib/warnings.pm b/lib/warnings.pm index e09712a..38f9ce2 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -238,11 +238,12 @@ our %Offsets = ( 'experimental::autoderef'=> 112, 'experimental::postderef'=> 114, - 'syscalls' => 116, + 'experimental::signatures'=> 116, + 'syscalls' => 118, ); our %Bits = ( - 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x15", # [0..58] + 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55", # [0..59] 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [29] 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [30] 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] @@ -252,19 +253,20 @@ our %Bits = ( 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x55\x05", # [51..57] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x55\x15", # [51..58] 'experimental::autoderef'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [56] 'experimental::lexical_subs'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [52] 'experimental::lexical_topic'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [53] 'experimental::postderef'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [57] 'experimental::regex_sets'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [54] + 'experimental::signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [58] 'experimental::smartmatch'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [55] 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [5..11,58] + 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [5..11,59] 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] @@ -292,7 +294,7 @@ our %Bits = ( 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [27] 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [50] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [58] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [59] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [41] @@ -304,7 +306,7 @@ our %Bits = ( ); our %DeadBits = ( - 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x2a", # [0..58] + 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", # [0..59] 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [29] 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [30] 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] @@ -314,19 +316,20 @@ our %DeadBits = ( 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaa\x0a", # [51..57] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaa\x2a", # [51..58] 'experimental::autoderef'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [56] 'experimental::lexical_subs'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [52] 'experimental::lexical_topic'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [53] 'experimental::postderef'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [57] 'experimental::regex_sets'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [54] + 'experimental::signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [58] 'experimental::smartmatch'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [55] 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [5..11,58] + 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [5..11,59] 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] @@ -354,7 +357,7 @@ our %DeadBits = ( 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [27] 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [50] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [58] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [59] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [41] @@ -366,8 +369,8 @@ our %DeadBits = ( ); $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -$DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x55\x05", # [2,56,52,53,57,54,55,4,22,23,25] -$LAST_BIT = 118 ; +$DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x55\x15", # [2,56,52,53,57,54,58,55,4,22,23,25] +$LAST_BIT = 120 ; $BYTES = 15 ; $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ; diff --git a/op.h b/op.h index 1dce791..a93e759 100644 --- a/op.h +++ b/op.h @@ -695,7 +695,7 @@ struct loop { #define PERL_LOADMOD_NOIMPORT 0x2 /* use Module () */ #define PERL_LOADMOD_IMPORT_OPS 0x4 /* use Module (...) */ -#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) +#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C) || defined(PERL_IN_TOKE_C) #define ref(o, type) doref(o, type, TRUE) #endif diff --git a/perly.act b/perly.act index d261d06..cb5e9ba 100644 --- a/perly.act +++ b/perly.act @@ -760,11 +760,50 @@ case 2: case 90: #line 732 "perly.y" - { (yyval.opval) = (ps[(1) - (1)].val.opval); } + { (yyval.opval) = (OP*)NULL; } break; case 91: -#line 733 "perly.y" +#line 734 "perly.y" + { + if (!FEATURE_SIGNATURES_IS_ENABLED) + Perl_croak(aTHX_ "Experimental " + "subroutine signatures not enabled"); + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__SIGNATURES), + "The signatures feature is experimental"); + (yyval.opval) = parse_subsignature(); + } + break; + + case 92: +#line 744 "perly.y" + { + (yyval.opval) = op_append_list(OP_LINESEQ, (ps[(2) - (3)].val.opval), + newSTATEOP(0, NULL, sawparens(newNULLLIST()))); + PL_parser->expect = XBLOCK; + } + break; + + case 93: +#line 753 "perly.y" + { + if (PL_parser->copline > (line_t)IVAL((ps[(3) - (5)].val.i_tkval))) + PL_parser->copline = (line_t)IVAL((ps[(3) - (5)].val.i_tkval)); + (yyval.opval) = block_end((ps[(1) - (5)].val.ival), + op_append_list(OP_LINESEQ, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval))); + TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'{'); + TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}'); + } + break; + + case 94: +#line 764 "perly.y" + { (yyval.opval) = (ps[(1) - (1)].val.opval); } + break; + + case 95: +#line 765 "perly.y" { (yyval.opval) = IF_MAD( newOP(OP_NULL,0), (OP*)NULL @@ -774,29 +813,29 @@ case 2: } break; - case 92: -#line 744 "perly.y" + case 96: +#line 776 "perly.y" { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 93: -#line 748 "perly.y" + case 97: +#line 780 "perly.y" { (yyval.opval) = newLOGOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 94: -#line 752 "perly.y" + case 98: +#line 784 "perly.y" { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 96: -#line 760 "perly.y" + case 100: +#line 792 "perly.y" { #ifdef MAD OP* op = newNULLLIST(); @@ -808,8 +847,8 @@ case 2: } break; - case 97: -#line 770 "perly.y" + case 101: +#line 802 "perly.y" { OP* term = (ps[(3) - (3)].val.opval); DO_MAD( @@ -820,16 +859,16 @@ case 2: } break; - case 99: -#line 783 "perly.y" + case 103: +#line 815 "perly.y" { (yyval.opval) = convert(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_STACKED, op_prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (3)].val.i_tkval)),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) ); TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 100: -#line 788 "perly.y" + case 104: +#line 820 "perly.y" { (yyval.opval) = convert(IVAL((ps[(1) - (5)].val.i_tkval)), OPf_STACKED, op_prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (5)].val.i_tkval)),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) ); TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o'); @@ -838,8 +877,8 @@ case 2: } break; - case 101: -#line 795 "perly.y" + case 105: +#line 827 "perly.y" { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, scalar((ps[(1) - (6)].val.opval)), (ps[(5) - (6)].val.opval)), @@ -850,8 +889,8 @@ case 2: } break; - case 102: -#line 804 "perly.y" + case 106: +#line 836 "perly.y" { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, scalar((ps[(1) - (3)].val.opval)), newUNOP(OP_METHOD, 0, (ps[(3) - (3)].val.opval)))); @@ -859,8 +898,8 @@ case 2: } break; - case 103: -#line 810 "perly.y" + case 107: +#line 842 "perly.y" { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval)), @@ -868,8 +907,8 @@ case 2: } break; - case 104: -#line 816 "perly.y" + case 108: +#line 848 "perly.y" { (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval)), @@ -879,15 +918,15 @@ case 2: } break; - case 105: -#line 824 "perly.y" + case 109: +#line 856 "perly.y" { (yyval.opval) = convert(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 106: -#line 828 "perly.y" + case 110: +#line 860 "perly.y" { (yyval.opval) = convert(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval)); TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o'); TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'('); @@ -895,22 +934,22 @@ case 2: } break; - case 107: -#line 834 "perly.y" + case 111: +#line 866 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, (OP*)NULL, (ps[(3) - (3)].val.opval)); } break; - case 108: -#line 837 "perly.y" + case 112: +#line 869 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, op_prepend_elem(OP_LIST, (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)), (ps[(1) - (5)].val.opval))); } break; - case 111: -#line 852 "perly.y" + case 115: +#line 884 "perly.y" { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[(1) - (5)].val.opval), scalar((ps[(3) - (5)].val.opval))); PL_parser->expect = XOPERATOR; TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{'); @@ -919,16 +958,16 @@ case 2: } break; - case 112: -#line 859 "perly.y" + case 116: +#line 891 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[(1) - (4)].val.opval)), scalar((ps[(3) - (4)].val.opval))); TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'['); TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']'); } break; - case 113: -#line 864 "perly.y" + case 117: +#line 896 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[(1) - (5)].val.opval)),OP_RV2AV), scalar((ps[(4) - (5)].val.opval))); @@ -938,8 +977,8 @@ case 2: } break; - case 114: -#line 872 "perly.y" + case 118: +#line 904 "perly.y" { (yyval.opval) = newBINOP(OP_AELEM, 0, ref(newAVREF((ps[(1) - (4)].val.opval)),OP_RV2AV), scalar((ps[(3) - (4)].val.opval))); @@ -948,8 +987,8 @@ case 2: } break; - case 115: -#line 879 "perly.y" + case 119: +#line 911 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[(1) - (5)].val.opval)), jmaybe((ps[(3) - (5)].val.opval))); PL_parser->expect = XOPERATOR; TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{'); @@ -958,8 +997,8 @@ case 2: } break; - case 116: -#line 886 "perly.y" + case 120: +#line 918 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[(1) - (6)].val.opval)),OP_RV2HV), jmaybe((ps[(4) - (6)].val.opval))); @@ -971,8 +1010,8 @@ case 2: } break; - case 117: -#line 896 "perly.y" + case 121: +#line 928 "perly.y" { (yyval.opval) = newBINOP(OP_HELEM, 0, ref(newHVREF((ps[(1) - (5)].val.opval)),OP_RV2HV), jmaybe((ps[(3) - (5)].val.opval))); @@ -983,8 +1022,8 @@ case 2: } break; - case 118: -#line 905 "perly.y" + case 122: +#line 937 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar((ps[(1) - (4)].val.opval)))); TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'a'); @@ -993,8 +1032,8 @@ case 2: } break; - case 119: -#line 912 "perly.y" + case 123: +#line 944 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[(4) - (5)].val.opval), newCVREF(0, scalar((ps[(1) - (5)].val.opval))))); @@ -1004,8 +1043,8 @@ case 2: } break; - case 120: -#line 921 "perly.y" + case 124: +#line 953 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), newCVREF(0, scalar((ps[(1) - (4)].val.opval))))); @@ -1014,8 +1053,8 @@ case 2: } break; - case 121: -#line 928 "perly.y" + case 125: +#line 960 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, newCVREF(0, scalar((ps[(1) - (3)].val.opval)))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); @@ -1023,8 +1062,8 @@ case 2: } break; - case 122: -#line 934 "perly.y" + case 126: +#line 966 "perly.y" { (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval)); TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),')'); @@ -1033,16 +1072,16 @@ case 2: } break; - case 123: -#line 941 "perly.y" + case 127: +#line 973 "perly.y" { (yyval.opval) = newSLICEOP(0, (ps[(3) - (4)].val.opval), (ps[(1) - (4)].val.opval)); TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'['); TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']'); } break; - case 124: -#line 946 "perly.y" + case 128: +#line 978 "perly.y" { (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), (OP*)NULL); TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),')'); @@ -1051,22 +1090,22 @@ case 2: } break; - case 125: -#line 956 "perly.y" + case 129: +#line 988 "perly.y" { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(3) - (3)].val.opval)); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 126: -#line 960 "perly.y" + case 130: +#line 992 "perly.y" { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 127: -#line 964 "perly.y" + case 131: +#line 996 "perly.y" { if (IVAL((ps[(2) - (3)].val.i_tkval)) != OP_REPEAT) scalar((ps[(1) - (3)].val.opval)); (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval))); @@ -1074,50 +1113,50 @@ case 2: } break; - case 128: -#line 970 "perly.y" + case 132: +#line 1002 "perly.y" { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 129: -#line 974 "perly.y" + case 133: +#line 1006 "perly.y" { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 130: -#line 978 "perly.y" + case 134: +#line 1010 "perly.y" { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 131: -#line 982 "perly.y" + case 135: +#line 1014 "perly.y" { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 132: -#line 986 "perly.y" + case 136: +#line 1018 "perly.y" { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 133: -#line 990 "perly.y" + case 137: +#line 1022 "perly.y" { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 134: -#line 994 "perly.y" + case 138: +#line 1026 "perly.y" { (yyval.opval) = newRANGE(IVAL((ps[(2) - (3)].val.i_tkval)), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval))); DO_MAD({ @@ -1131,29 +1170,29 @@ case 2: } break; - case 135: -#line 1006 "perly.y" + case 139: +#line 1038 "perly.y" { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 136: -#line 1010 "perly.y" + case 140: +#line 1042 "perly.y" { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 137: -#line 1014 "perly.y" + case 141: +#line 1046 "perly.y" { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 138: -#line 1018 "perly.y" + case 142: +#line 1050 "perly.y" { (yyval.opval) = bind_match(IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval)); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval), ((yyval.opval)->op_type == OP_NOT @@ -1162,15 +1201,15 @@ case 2: } break; - case 139: -#line 1028 "perly.y" + case 143: +#line 1060 "perly.y" { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval))); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 140: -#line 1032 "perly.y" + case 144: +#line 1064 "perly.y" { (yyval.opval) = IF_MAD( newUNOP(OP_NULL, 0, (ps[(2) - (2)].val.opval)), (ps[(2) - (2)].val.opval) @@ -1179,38 +1218,38 @@ case 2: } break; - case 141: -#line 1039 "perly.y" + case 145: +#line 1071 "perly.y" { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 142: -#line 1043 "perly.y" + case 146: +#line 1075 "perly.y" { (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval))); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 143: -#line 1047 "perly.y" + case 147: +#line 1079 "perly.y" { (yyval.opval) = newUNOP(OP_POSTINC, 0, op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC)); TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 144: -#line 1052 "perly.y" + case 148: +#line 1084 "perly.y" { (yyval.opval) = newUNOP(OP_POSTDEC, 0, op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC)); TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 145: -#line 1057 "perly.y" + case 149: +#line 1089 "perly.y" { (yyval.opval) = convert(OP_JOIN, 0, op_append_elem( OP_LIST, @@ -1224,40 +1263,40 @@ case 2: } break; - case 146: -#line 1069 "perly.y" + case 150: +#line 1101 "perly.y" { (yyval.opval) = newUNOP(OP_PREINC, 0, op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREINC)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 147: -#line 1074 "perly.y" + case 151: +#line 1106 "perly.y" { (yyval.opval) = newUNOP(OP_PREDEC, 0, op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 148: -#line 1083 "perly.y" + case 152: +#line 1115 "perly.y" { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval)); TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'['); TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),']'); } break; - case 149: -#line 1088 "perly.y" + case 153: +#line 1120 "perly.y" { (yyval.opval) = newANONLIST((OP*)NULL); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'['); TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),']'); } break; - case 150: -#line 1093 "perly.y" + case 154: +#line 1125 "perly.y" { (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval)); TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{'); TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),';'); @@ -1265,8 +1304,8 @@ case 2: } break; - case 151: -#line 1099 "perly.y" + case 155: +#line 1131 "perly.y" { (yyval.opval) = newANONHASH((OP*)NULL); TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'{'); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),';'); @@ -1274,8 +1313,8 @@ case 2: } break; - case 152: -#line 1105 "perly.y" + case 156: +#line 1137 "perly.y" { SvREFCNT_inc_simple_void(PL_compcv); (yyval.opval) = newANONATTRSUB((ps[(2) - (5)].val.ival), (ps[(3) - (5)].val.opval), (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)); TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o'); @@ -1284,100 +1323,100 @@ case 2: } break; - case 153: -#line 1116 "perly.y" + case 157: +#line 1148 "perly.y" { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), IVAL((ps[(1) - (2)].val.i_tkval))); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 154: -#line 1120 "perly.y" + case 158: +#line 1152 "perly.y" { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[(2) - (2)].val.opval))); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'D'); } break; - case 159: -#line 1130 "perly.y" + case 163: +#line 1162 "perly.y" { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval)); TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'?'); TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),':'); } break; - case 160: -#line 1135 "perly.y" + case 164: +#line 1167 "perly.y" { (yyval.opval) = newUNOP(OP_REFGEN, 0, op_lvalue((ps[(2) - (2)].val.opval),OP_REFGEN)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 161: -#line 1139 "perly.y" + case 165: +#line 1171 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 162: -#line 1141 "perly.y" + case 166: +#line 1173 "perly.y" { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval))); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'k'); } break; - case 163: -#line 1145 "perly.y" + case 167: +#line 1177 "perly.y" { (yyval.opval) = sawparens(IF_MAD(newUNOP(OP_NULL,0,(ps[(2) - (3)].val.opval)), (ps[(2) - (3)].val.opval))); TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); } break; - case 164: -#line 1150 "perly.y" + case 168: +#line 1182 "perly.y" { (yyval.opval) = IF_MAD(newUNOP(OP_NULL,0,(ps[(1) - (1)].val.opval)), (ps[(1) - (1)].val.opval)); } break; - case 165: -#line 1152 "perly.y" + case 169: +#line 1184 "perly.y" { (yyval.opval) = sawparens(newNULLLIST()); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')'); } break; - case 166: -#line 1157 "perly.y" + case 170: +#line 1189 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 167: -#line 1159 "perly.y" + case 171: +#line 1191 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 168: -#line 1161 "perly.y" + case 172: +#line 1193 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 169: -#line 1163 "perly.y" + case 173: +#line 1195 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 170: -#line 1165 "perly.y" + case 174: +#line 1197 "perly.y" { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));} break; - case 171: -#line 1167 "perly.y" + case 175: +#line 1199 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 172: -#line 1169 "perly.y" + case 176: +#line 1201 "perly.y" { (yyval.opval) = op_prepend_elem(OP_ASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_ASLICE, 0, @@ -1391,8 +1430,8 @@ case 2: } break; - case 173: -#line 1181 "perly.y" + case 177: +#line 1213 "perly.y" { (yyval.opval) = op_prepend_elem(OP_KVASLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVASLICE, 0, @@ -1406,8 +1445,8 @@ case 2: } break; - case 174: -#line 1193 "perly.y" + case 178: +#line 1225 "perly.y" { (yyval.opval) = op_prepend_elem(OP_HSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_HSLICE, 0, @@ -1423,8 +1462,8 @@ case 2: } break; - case 175: -#line 1207 "perly.y" + case 179: +#line 1239 "perly.y" { (yyval.opval) = op_prepend_elem(OP_KVHSLICE, newOP(OP_PUSHMARK, 0), newLISTOP(OP_KVHSLICE, 0, @@ -1440,26 +1479,26 @@ case 2: } break; - case 176: -#line 1221 "perly.y" + case 180: +#line 1253 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 177: -#line 1223 "perly.y" + case 181: +#line 1255 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); } break; - case 178: -#line 1225 "perly.y" + case 182: +#line 1257 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (3)].val.opval))); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); } break; - case 179: -#line 1230 "perly.y" + case 183: +#line 1262 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), scalar((ps[(1) - (4)].val.opval)))); @@ -1474,127 +1513,127 @@ case 2: } break; - case 180: -#line 1243 "perly.y" + case 184: +#line 1275 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[(3) - (3)].val.opval), scalar((ps[(2) - (3)].val.opval)))); TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o'); } break; - case 181: -#line 1248 "perly.y" + case 185: +#line 1280 "perly.y" { (yyval.opval) = newSVREF((ps[(1) - (4)].val.opval)); TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'$'); } break; - case 182: -#line 1252 "perly.y" + case 186: +#line 1284 "perly.y" { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'@'); } break; - case 183: -#line 1256 "perly.y" + case 187: +#line 1288 "perly.y" { (yyval.opval) = newHVREF((ps[(1) - (4)].val.opval)); TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'%'); } break; - case 184: -#line 1260 "perly.y" + case 188: +#line 1292 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar(newCVREF(IVAL((ps[(3) - (4)].val.i_tkval)),(ps[(1) - (4)].val.opval)))); TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'&'); } break; - case 185: -#line 1265 "perly.y" + case 189: +#line 1297 "perly.y" { (yyval.opval) = newGVREF(0,(ps[(1) - (4)].val.opval)); TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'*'); } break; - case 186: -#line 1269 "perly.y" + case 190: +#line 1301 "perly.y" { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), OPf_SPECIAL); PL_hints |= HINT_BLOCK_SCOPE; TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o'); } break; - case 187: -#line 1274 "perly.y" + case 191: +#line 1306 "perly.y" { (yyval.opval) = newLOOPEX(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 188: -#line 1278 "perly.y" + case 192: +#line 1310 "perly.y" { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval))); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 189: -#line 1282 "perly.y" + case 193: +#line 1314 "perly.y" { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0); TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o'); } break; - case 190: -#line 1286 "perly.y" + case 194: +#line 1318 "perly.y" { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 191: -#line 1290 "perly.y" + case 195: +#line 1322 "perly.y" { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 192: -#line 1294 "perly.y" + case 196: +#line 1326 "perly.y" { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.i_tkval) ? OPf_SPECIAL : 0); TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o'); } break; - case 193: -#line 1298 "perly.y" + case 197: +#line 1330 "perly.y" { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.i_tkval) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o'); } break; - case 194: -#line 1302 "perly.y" + case 198: +#line 1334 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); } break; - case 195: -#line 1304 "perly.y" + case 199: +#line 1336 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); } break; - case 196: -#line 1307 "perly.y" + case 200: +#line 1339 "perly.y" { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0); TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o'); } break; - case 197: -#line 1311 "perly.y" + case 201: +#line 1343 "perly.y" { (yyval.opval) = newOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0); TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o'); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); @@ -1602,27 +1641,27 @@ case 2: } break; - case 198: -#line 1317 "perly.y" + case 202: +#line 1349 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 199: -#line 1319 "perly.y" + case 203: +#line 1351 "perly.y" { (yyval.opval) = (ps[(1) - (3)].val.opval); TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); } break; - case 200: -#line 1324 "perly.y" + case 204: +#line 1356 "perly.y" { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); } break; - case 201: -#line 1327 "perly.y" + case 205: +#line 1359 "perly.y" { (yyval.opval) = (IVAL((ps[(1) - (3)].val.i_tkval)) == OP_NOT) ? newUNOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0, newSVOP(OP_CONST, 0, newSViv(0))) : newOP(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_SPECIAL); @@ -1633,8 +1672,8 @@ case 2: } break; - case 202: -#line 1336 "perly.y" + case 206: +#line 1368 "perly.y" { (yyval.opval) = newUNOP(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval)); TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o'); TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'('); @@ -1642,8 +1681,8 @@ case 2: } break; - case 203: -#line 1342 "perly.y" + case 207: +#line 1374 "perly.y" { if ( (ps[(1) - (1)].val.opval)->op_type != OP_TRANS && (ps[(1) - (1)].val.opval)->op_type != OP_TRANSR @@ -1656,16 +1695,16 @@ case 2: } break; - case 204: -#line 1353 "perly.y" + case 208: +#line 1385 "perly.y" { (yyval.opval) = pmruntime((ps[(1) - (5)].val.opval), (ps[(4) - (5)].val.opval), 1, (ps[(2) - (5)].val.ival)); TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')'); } break; - case 207: -#line 1360 "perly.y" + case 211: +#line 1392 "perly.y" { (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), newSVOP(OP_CONST, 0, newSVpvs("Unimplemented"))); @@ -1673,8 +1712,8 @@ case 2: } break; - case 209: -#line 1370 "perly.y" + case 213: +#line 1402 "perly.y" { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval)); DO_MAD( token_getmad((ps[(1) - (3)].val.i_tkval),(yyval.opval),'d'); @@ -1684,158 +1723,158 @@ case 2: } break; - case 210: -#line 1378 "perly.y" + case 214: +#line 1410 "perly.y" { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval))); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'d'); } break; - case 211: -#line 1385 "perly.y" + case 215: +#line 1417 "perly.y" { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval)); TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')'); } break; - case 212: -#line 1390 "perly.y" + case 216: +#line 1422 "perly.y" { (yyval.opval) = sawparens(newNULLLIST()); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'('); TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')'); } break; - case 213: -#line 1395 "perly.y" + case 217: +#line 1427 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 214: -#line 1397 "perly.y" + case 218: +#line 1429 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 215: -#line 1399 "perly.y" + case 219: +#line 1431 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 216: -#line 1404 "perly.y" + case 220: +#line 1436 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 217: -#line 1406 "perly.y" + case 221: +#line 1438 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 218: -#line 1410 "perly.y" + case 222: +#line 1442 "perly.y" { (yyval.opval) = (OP*)NULL; } break; - case 219: -#line 1412 "perly.y" + case 223: +#line 1444 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; - case 220: -#line 1418 "perly.y" + case 224: +#line 1450 "perly.y" { PL_parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); } break; - case 221: -#line 1422 "perly.y" + case 225: +#line 1454 "perly.y" { (yyval.opval) = newCVREF(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'&'); } break; - case 222: -#line 1428 "perly.y" + case 226: +#line 1460 "perly.y" { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'$'); } break; - case 223: -#line 1434 "perly.y" + case 227: +#line 1466 "perly.y" { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); if ((yyval.opval)) (yyval.opval)->op_private |= IVAL((ps[(1) - (2)].val.i_tkval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'@'); } break; - case 224: -#line 1441 "perly.y" + case 228: +#line 1473 "perly.y" { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval)); if ((yyval.opval)) (yyval.opval)->op_private |= IVAL((ps[(1) - (2)].val.i_tkval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'%'); } break; - case 225: -#line 1448 "perly.y" + case 229: +#line 1480 "perly.y" { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'l'); } break; - case 226: -#line 1452 "perly.y" + case 230: +#line 1484 "perly.y" { (yyval.opval) = newAVREF((ps[(1) - (4)].val.opval)); TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'l'); } break; - case 227: -#line 1458 "perly.y" + case 231: +#line 1490 "perly.y" { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval)); TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'*'); } break; - case 229: -#line 1465 "perly.y" + case 233: +#line 1497 "perly.y" { (yyval.opval) = newAVREF((ps[(1) - (3)].val.opval)); TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'@'); } break; - case 231: -#line 1472 "perly.y" + case 235: +#line 1504 "perly.y" { (yyval.opval) = newHVREF((ps[(1) - (3)].val.opval)); TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'@'); } break; - case 233: -#line 1479 "perly.y" + case 237: +#line 1511 "perly.y" { (yyval.opval) = newGVREF(0,(ps[(1) - (3)].val.opval)); TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'*'); } break; - case 234: -#line 1486 "perly.y" + case 238: +#line 1518 "perly.y" { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); } break; - case 235: -#line 1488 "perly.y" + case 239: +#line 1520 "perly.y" { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); } break; - case 236: -#line 1490 "perly.y" + case 240: +#line 1522 "perly.y" { (yyval.opval) = op_scope((ps[(1) - (1)].val.opval)); } break; - case 237: -#line 1493 "perly.y" + case 241: +#line 1525 "perly.y" { (yyval.opval) = (ps[(1) - (1)].val.opval); } break; @@ -1843,6 +1882,6 @@ case 2: /* Generated from: - * 911fbbcab275e0f9645397ee5b80a7c2384e6b24f793c15e6d6e918ebfd4e384 perly.y + * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl * ex: set ro: */ diff --git a/perly.c b/perly.c index d8eedf2..a7115b3 100644 --- a/perly.c +++ b/perly.c @@ -28,6 +28,7 @@ #include "EXTERN.h" #define PERL_IN_PERLY_C #include "perl.h" +#include "feature.h" typedef unsigned char yytype_uint8; typedef signed char yytype_int8; diff --git a/perly.h b/perly.h index 2886bd3..e6426df 100644 --- a/perly.h +++ b/perly.h @@ -5,11 +5,11 @@ */ #ifdef PERL_CORE -/* A Bison parser, made by GNU Bison 2.7.12-4996. */ +/* A Bison parser, made by GNU Bison 2.5. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,13 +37,6 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int yydebug; -#endif /* Tokens. */ #ifndef YYTOKENTYPE @@ -219,6 +212,7 @@ extern int yydebug; #define PEG 338 + #ifdef PERL_IN_TOKE_C static bool S_is_opval_token(int type) { @@ -245,7 +239,8 @@ S_is_opval_token(int type) { #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { -/* Line 2053 of yacc.c */ + +/* Line 2068 of yacc.c */ I32 ival; /* __DEFAULT__ (marker for regen_perly.pl; must always be 1st union member) */ @@ -264,7 +259,8 @@ typedef union YYSTYPE #endif -/* Line 2053 of yacc.c */ + +/* Line 2068 of yacc.c */ } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -272,22 +268,10 @@ typedef union YYSTYPE #endif -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ + /* Generated from: - * 911fbbcab275e0f9645397ee5b80a7c2384e6b24f793c15e6d6e918ebfd4e384 perly.y + * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl * ex: set ro: */ diff --git a/perly.tab b/perly.tab index 84e1c82..4f5a86a 100644 --- a/perly.tab +++ b/perly.tab @@ -6,16 +6,16 @@ #define YYFINAL 14 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2627 +#define YYLAST 2731 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 105 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 69 +#define YYNNTS 72 /* YYNRULES -- Number of rules. */ -#define YYNRULES 237 +#define YYNRULES 241 /* YYNRULES -- Number of states. */ -#define YYNSTATES 467 +#define YYNSTATES 475 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -77,108 +77,110 @@ static const yytype_uint16 yyprhs[] = 240, 244, 248, 249, 252, 259, 260, 263, 264, 265, 267, 268, 270, 272, 274, 276, 278, 280, 281, 282, 283, 284, 286, 288, 289, 291, 292, 295, 297, 300, - 302, 304, 306, 310, 314, 318, 320, 323, 327, 329, - 333, 339, 346, 350, 354, 360, 363, 368, 369, 375, - 377, 379, 385, 390, 396, 401, 407, 414, 420, 425, - 431, 436, 440, 447, 452, 458, 462, 466, 470, 474, - 478, 482, 486, 490, 494, 498, 502, 506, 510, 514, - 517, 520, 523, 526, 529, 532, 535, 538, 541, 545, - 548, 553, 557, 563, 566, 569, 571, 573, 575, 577, - 583, 586, 588, 591, 595, 597, 600, 602, 604, 606, - 608, 610, 612, 617, 622, 628, 634, 636, 638, 642, - 647, 651, 656, 661, 666, 671, 676, 678, 681, 684, - 686, 689, 692, 694, 697, 699, 702, 704, 708, 710, - 714, 716, 720, 725, 726, 732, 734, 736, 738, 740, - 744, 747, 751, 754, 756, 758, 760, 761, 763, 764, - 766, 768, 771, 774, 777, 780, 783, 788, 791, 793, - 797, 799, 803, 805, 809, 811, 813, 815 + 302, 303, 304, 308, 314, 316, 318, 322, 326, 330, + 332, 335, 339, 341, 345, 351, 358, 362, 366, 372, + 375, 380, 381, 387, 389, 391, 397, 402, 408, 413, + 419, 426, 432, 437, 443, 448, 452, 459, 464, 470, + 474, 478, 482, 486, 490, 494, 498, 502, 506, 510, + 514, 518, 522, 526, 529, 532, 535, 538, 541, 544, + 547, 550, 553, 557, 560, 565, 569, 575, 578, 581, + 583, 585, 587, 589, 595, 598, 600, 603, 607, 609, + 612, 614, 616, 618, 620, 622, 624, 629, 634, 640, + 646, 648, 650, 654, 659, 663, 668, 673, 678, 683, + 688, 690, 693, 696, 698, 701, 704, 706, 709, 711, + 714, 716, 720, 722, 726, 728, 732, 737, 738, 744, + 746, 748, 750, 752, 756, 759, 763, 766, 768, 770, + 772, 773, 775, 776, 778, 780, 783, 786, 789, 792, + 795, 800, 803, 805, 809, 811, 815, 817, 821, 823, + 825, 827 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 106, 0, -1, -1, 3, 107, 115, 118, -1, -1, - 4, 108, 162, -1, -1, 5, 109, 113, -1, -1, + 4, 108, 165, -1, -1, 5, 109, 113, -1, -1, 6, 110, 122, -1, -1, 7, 111, 120, -1, -1, 8, 112, 118, -1, 9, 115, 118, 10, -1, 21, 115, 20, 74, 119, 20, 22, -1, -1, 9, 117, 118, 10, -1, -1, -1, 118, 120, -1, -1, 119, 126, -1, 122, -1, 121, -1, 36, 122, -1, 36, 121, -1, 35, -1, 104, -1, 37, 141, 138, 114, - -1, -1, 38, 142, 139, 123, 143, 144, 146, -1, + -1, -1, 38, 142, 139, 123, 143, 144, 149, -1, 40, 23, 23, 20, -1, -1, 41, 139, 124, 23, - 23, 161, 20, -1, 44, 103, 115, 135, 102, 116, + 23, 164, 20, -1, 44, 103, 115, 135, 102, 116, 129, -1, 45, 103, 115, 137, 102, 116, 129, -1, 50, 103, 115, 135, 102, 116, -1, 51, 103, 115, 135, 102, 116, -1, 52, 113, -1, 42, 103, 115, 133, 102, 131, 116, 130, -1, 43, 103, 115, 134, 102, 131, 116, 130, -1, 49, 103, 115, 136, 20, 133, 20, 131, 136, 102, 116, -1, 49, 70, 115, - 163, 103, 135, 102, 116, 130, -1, 49, 165, 103, + 166, 103, 135, 102, 116, 130, -1, 49, 168, 103, 115, 135, 102, 116, 130, -1, 49, 103, 115, 135, 102, 116, 130, -1, 113, 130, -1, -1, 40, 23, 23, 9, 115, 125, 118, 10, -1, 128, 20, -1, 20, -1, 26, 127, -1, -1, 73, 118, 74, -1, - 1, -1, 147, -1, 147, 44, 147, -1, 147, 45, - 147, -1, 147, 42, 147, -1, 147, 43, 134, -1, - 147, 49, 147, -1, 147, 51, 147, -1, -1, 46, + 1, -1, 150, -1, 150, 44, 150, -1, 150, 45, + 150, -1, 150, 42, 150, -1, 150, 43, 134, -1, + 150, 49, 150, -1, 150, 51, 150, -1, -1, 46, 116, -1, 47, 103, 135, 102, 116, 129, -1, -1, - 48, 113, -1, -1, -1, 128, -1, -1, 147, -1, - 147, -1, 147, -1, 132, -1, 134, -1, 23, -1, + 48, 113, -1, -1, -1, 128, -1, -1, 150, -1, + 150, -1, 150, -1, 132, -1, 134, -1, 23, -1, -1, -1, -1, -1, 23, -1, 28, -1, -1, 26, -1, -1, 72, 26, -1, 72, -1, 72, 26, -1, - 72, -1, 113, -1, 20, -1, 147, 78, 147, -1, - 147, 77, 147, -1, 147, 76, 147, -1, 148, -1, - 148, 80, -1, 148, 80, 157, -1, 157, -1, 60, - 173, 148, -1, 58, 103, 173, 147, 102, -1, 157, - 101, 151, 103, 162, 102, -1, 157, 101, 151, -1, - 24, 173, 161, -1, 25, 173, 103, 162, 102, -1, - 60, 161, -1, 58, 103, 162, 102, -1, -1, 33, - 140, 113, 150, 161, -1, 24, -1, 165, -1, 172, - 9, 147, 20, 10, -1, 165, 11, 147, 12, -1, - 157, 101, 11, 147, 12, -1, 152, 11, 147, 12, - -1, 165, 9, 147, 20, 10, -1, 157, 101, 9, - 147, 20, 10, -1, 152, 9, 147, 20, 10, -1, - 157, 101, 103, 102, -1, 157, 101, 103, 147, 102, - -1, 152, 103, 147, 102, -1, 152, 103, 102, -1, - 103, 147, 102, 11, 147, 12, -1, 29, 11, 147, - 12, -1, 103, 102, 11, 147, 12, -1, 157, 81, - 157, -1, 157, 95, 157, -1, 157, 63, 157, -1, - 157, 64, 157, -1, 157, 89, 157, -1, 157, 61, - 157, -1, 157, 62, 157, -1, 157, 88, 157, -1, - 157, 87, 157, -1, 157, 54, 157, -1, 157, 86, - 157, -1, 157, 85, 157, -1, 157, 84, 157, -1, - 157, 90, 157, -1, 13, 157, -1, 14, 157, -1, - 91, 157, -1, 92, 157, -1, 157, 98, -1, 157, - 97, -1, 157, 96, -1, 100, 157, -1, 99, 157, - -1, 11, 147, 12, -1, 11, 12, -1, 67, 147, - 20, 10, -1, 67, 20, 10, -1, 39, 140, 143, - 144, 113, -1, 66, 157, -1, 66, 113, -1, 153, - -1, 154, -1, 155, -1, 156, -1, 157, 82, 157, - 83, 157, -1, 93, 157, -1, 159, -1, 69, 157, - -1, 103, 147, 102, -1, 29, -1, 103, 102, -1, - 165, -1, 169, -1, 167, -1, 166, -1, 168, -1, - 152, -1, 170, 11, 147, 12, -1, 171, 11, 147, - 12, -1, 170, 9, 147, 20, 10, -1, 171, 9, - 147, 20, 10, -1, 26, -1, 164, -1, 164, 103, - 102, -1, 164, 103, 147, 102, -1, 68, 142, 161, - -1, 157, 101, 15, 18, -1, 157, 101, 16, 18, - -1, 157, 101, 17, 18, -1, 157, 101, 19, 18, - -1, 157, 101, 18, 18, -1, 53, -1, 53, 157, - -1, 79, 148, -1, 59, -1, 59, 113, -1, 59, - 157, -1, 71, -1, 71, 157, -1, 32, -1, 32, - 157, -1, 56, -1, 56, 103, 102, -1, 30, -1, - 30, 103, 102, -1, 31, -1, 57, 103, 102, -1, - 57, 103, 147, 102, -1, -1, 27, 158, 103, 148, - 102, -1, 23, -1, 149, -1, 55, -1, 34, -1, - 70, 160, 145, -1, 70, 160, -1, 103, 147, 102, - -1, 103, 102, -1, 165, -1, 167, -1, 166, -1, - -1, 148, -1, -1, 147, -1, 165, -1, 19, 173, - -1, 15, 173, -1, 16, 173, -1, 17, 173, -1, - 65, 173, -1, 157, 101, 65, 18, -1, 18, 173, - -1, 166, -1, 157, 101, 16, -1, 167, -1, 157, - 101, 17, -1, 169, -1, 157, 101, 18, -1, 23, - -1, 165, -1, 113, -1, 28, -1 + 72, -1, -1, -1, 103, 147, 102, -1, 115, 146, + 9, 118, 10, -1, 148, -1, 20, -1, 150, 78, + 150, -1, 150, 77, 150, -1, 150, 76, 150, -1, + 151, -1, 151, 80, -1, 151, 80, 160, -1, 160, + -1, 60, 176, 151, -1, 58, 103, 176, 150, 102, + -1, 160, 101, 154, 103, 165, 102, -1, 160, 101, + 154, -1, 24, 176, 164, -1, 25, 176, 103, 165, + 102, -1, 60, 164, -1, 58, 103, 165, 102, -1, + -1, 33, 140, 113, 153, 164, -1, 24, -1, 168, + -1, 175, 9, 150, 20, 10, -1, 168, 11, 150, + 12, -1, 160, 101, 11, 150, 12, -1, 155, 11, + 150, 12, -1, 168, 9, 150, 20, 10, -1, 160, + 101, 9, 150, 20, 10, -1, 155, 9, 150, 20, + 10, -1, 160, 101, 103, 102, -1, 160, 101, 103, + 150, 102, -1, 155, 103, 150, 102, -1, 155, 103, + 102, -1, 103, 150, 102, 11, 150, 12, -1, 29, + 11, 150, 12, -1, 103, 102, 11, 150, 12, -1, + 160, 81, 160, -1, 160, 95, 160, -1, 160, 63, + 160, -1, 160, 64, 160, -1, 160, 89, 160, -1, + 160, 61, 160, -1, 160, 62, 160, -1, 160, 88, + 160, -1, 160, 87, 160, -1, 160, 54, 160, -1, + 160, 86, 160, -1, 160, 85, 160, -1, 160, 84, + 160, -1, 160, 90, 160, -1, 13, 160, -1, 14, + 160, -1, 91, 160, -1, 92, 160, -1, 160, 98, + -1, 160, 97, -1, 160, 96, -1, 100, 160, -1, + 99, 160, -1, 11, 150, 12, -1, 11, 12, -1, + 67, 150, 20, 10, -1, 67, 20, 10, -1, 39, + 140, 143, 144, 148, -1, 66, 160, -1, 66, 113, + -1, 156, -1, 157, -1, 158, -1, 159, -1, 160, + 82, 160, 83, 160, -1, 93, 160, -1, 162, -1, + 69, 160, -1, 103, 150, 102, -1, 29, -1, 103, + 102, -1, 168, -1, 172, -1, 170, -1, 169, -1, + 171, -1, 155, -1, 173, 11, 150, 12, -1, 174, + 11, 150, 12, -1, 173, 9, 150, 20, 10, -1, + 174, 9, 150, 20, 10, -1, 26, -1, 167, -1, + 167, 103, 102, -1, 167, 103, 150, 102, -1, 68, + 142, 164, -1, 160, 101, 15, 18, -1, 160, 101, + 16, 18, -1, 160, 101, 17, 18, -1, 160, 101, + 19, 18, -1, 160, 101, 18, 18, -1, 53, -1, + 53, 160, -1, 79, 151, -1, 59, -1, 59, 113, + -1, 59, 160, -1, 71, -1, 71, 160, -1, 32, + -1, 32, 160, -1, 56, -1, 56, 103, 102, -1, + 30, -1, 30, 103, 102, -1, 31, -1, 57, 103, + 102, -1, 57, 103, 150, 102, -1, -1, 27, 161, + 103, 151, 102, -1, 23, -1, 152, -1, 55, -1, + 34, -1, 70, 163, 145, -1, 70, 163, -1, 103, + 150, 102, -1, 103, 102, -1, 168, -1, 170, -1, + 169, -1, -1, 151, -1, -1, 150, -1, 168, -1, + 19, 176, -1, 15, 176, -1, 16, 176, -1, 17, + 176, -1, 65, 176, -1, 160, 101, 65, 18, -1, + 18, 176, -1, 169, -1, 160, 101, 16, -1, 170, + -1, 160, 101, 17, -1, 172, -1, 160, 101, 18, + -1, 23, -1, 168, -1, 113, -1, 28, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -193,25 +195,26 @@ static const yytype_uint16 yyrline[] = 592, 597, 603, 604, 610, 624, 625, 634, 640, 641, 646, 649, 653, 658, 662, 666, 670, 671, 675, 681, 686, 691, 692, 697, 698, 703, 704, 708, 718, 722, - 732, 733, 743, 747, 751, 755, 759, 769, 778, 782, - 787, 794, 803, 809, 815, 823, 827, 834, 833, 844, - 845, 849, 858, 863, 871, 878, 885, 895, 904, 911, - 920, 927, 933, 940, 945, 955, 959, 963, 969, 973, - 977, 981, 985, 989, 993, 1005, 1009, 1013, 1017, 1027, - 1031, 1038, 1042, 1046, 1051, 1056, 1068, 1073, 1082, 1087, - 1092, 1098, 1104, 1115, 1119, 1125, 1126, 1127, 1128, 1129, - 1134, 1138, 1140, 1144, 1149, 1151, 1156, 1158, 1160, 1162, - 1164, 1166, 1168, 1180, 1192, 1206, 1220, 1222, 1224, 1229, - 1242, 1247, 1251, 1255, 1259, 1264, 1268, 1273, 1277, 1281, - 1285, 1289, 1293, 1297, 1301, 1303, 1306, 1310, 1316, 1318, - 1323, 1326, 1335, 1342, 1341, 1357, 1358, 1359, 1365, 1369, - 1377, 1384, 1389, 1394, 1396, 1398, 1403, 1405, 1410, 1411, - 1417, 1421, 1427, 1433, 1440, 1447, 1451, 1457, 1463, 1464, - 1470, 1471, 1477, 1478, 1485, 1487, 1489, 1492 + 732, 734, 733, 752, 764, 765, 775, 779, 783, 787, + 791, 801, 810, 814, 819, 826, 835, 841, 847, 855, + 859, 866, 865, 876, 877, 881, 890, 895, 903, 910, + 917, 927, 936, 943, 952, 959, 965, 972, 977, 987, + 991, 995, 1001, 1005, 1009, 1013, 1017, 1021, 1025, 1037, + 1041, 1045, 1049, 1059, 1063, 1070, 1074, 1078, 1083, 1088, + 1100, 1105, 1114, 1119, 1124, 1130, 1136, 1147, 1151, 1157, + 1158, 1159, 1160, 1161, 1166, 1170, 1172, 1176, 1181, 1183, + 1188, 1190, 1192, 1194, 1196, 1198, 1200, 1212, 1224, 1238, + 1252, 1254, 1256, 1261, 1274, 1279, 1283, 1287, 1291, 1296, + 1300, 1305, 1309, 1313, 1317, 1321, 1325, 1329, 1333, 1335, + 1338, 1342, 1348, 1350, 1355, 1358, 1367, 1374, 1373, 1389, + 1390, 1391, 1397, 1401, 1409, 1416, 1421, 1426, 1428, 1430, + 1435, 1437, 1442, 1443, 1449, 1453, 1459, 1465, 1472, 1479, + 1483, 1489, 1495, 1496, 1502, 1503, 1509, 1510, 1517, 1519, + 1521, 1524 }; #endif -#if YYDEBUG || YYERROR_VERBOSE || 0 +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = @@ -237,11 +240,11 @@ static const char *const yytname[] = "sideff", "else", "cont", "mintro", "nexpr", "texpr", "iexpr", "mexpr", "mnexpr", "miexpr", "formname", "startsub", "startanonsub", "startformsub", "subname", "proto", "subattrlist", "myattrlist", - "subbody", "expr", "listexpr", "listop", "@10", "method", "subscripted", - "termbinop", "termunop", "anonymous", "termdo", "term", "@11", - "myattrterm", "myterm", "optlistexpr", "optexpr", "my_scalar", "amper", - "scalar", "ary", "hsh", "arylen", "star", "sliceme", "kvslice", "gelem", - "indirob", YY_NULL + "subsignature", "@10", "realsubbody", "optsubbody", "expr", "listexpr", + "listop", "@11", "method", "subscripted", "termbinop", "termunop", + "anonymous", "termdo", "term", "@12", "myattrterm", "myterm", + "optlistexpr", "optexpr", "my_scalar", "amper", "scalar", "ary", "hsh", + "arylen", "star", "sliceme", "kvslice", "gelem", "indirob", 0 }; #endif @@ -276,21 +279,22 @@ static const yytype_uint8 yyr1[] = 128, 128, 129, 129, 129, 130, 130, 131, 132, 132, 133, 133, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 142, 143, 143, 144, 144, 144, 145, 145, - 146, 146, 147, 147, 147, 147, 148, 148, 148, 149, - 149, 149, 149, 149, 149, 149, 149, 150, 149, 151, - 151, 152, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 152, 152, 152, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 155, 155, - 155, 155, 155, 156, 156, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 158, 157, 157, 157, 157, 157, 159, - 159, 160, 160, 160, 160, 160, 161, 161, 162, 162, - 163, 164, 165, 166, 167, 168, 168, 169, 170, 170, - 171, 171, 172, 172, 173, 173, 173, 173 + 146, 147, 146, 148, 149, 149, 150, 150, 150, 150, + 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, + 152, 153, 152, 154, 154, 155, 155, 155, 155, 155, + 155, 155, 155, 155, 155, 155, 155, 155, 155, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 158, 158, 158, 158, 158, 159, 159, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, + 160, 160, 160, 162, 162, 163, 163, 163, 163, 163, + 164, 164, 165, 165, 166, 167, 168, 169, 170, 171, + 171, 172, 173, 173, 174, 174, 175, 175, 176, 176, + 176, 176 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -305,21 +309,22 @@ static const yytype_uint8 yyr2[] = 3, 3, 0, 2, 6, 0, 2, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 2, 1, 2, 1, - 1, 1, 3, 3, 3, 1, 2, 3, 1, 3, - 5, 6, 3, 3, 5, 2, 4, 0, 5, 1, - 1, 5, 4, 5, 4, 5, 6, 5, 4, 5, - 4, 3, 6, 4, 5, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, - 4, 3, 5, 2, 2, 1, 1, 1, 1, 5, - 2, 1, 2, 3, 1, 2, 1, 1, 1, 1, - 1, 1, 4, 4, 5, 5, 1, 1, 3, 4, - 3, 4, 4, 4, 4, 4, 1, 2, 2, 1, - 2, 2, 1, 2, 1, 2, 1, 3, 1, 3, - 1, 3, 4, 0, 5, 1, 1, 1, 1, 3, - 2, 3, 2, 1, 1, 1, 0, 1, 0, 1, - 1, 2, 2, 2, 2, 2, 4, 2, 1, 3, - 1, 3, 1, 3, 1, 1, 1, 1 + 0, 0, 3, 5, 1, 1, 3, 3, 3, 1, + 2, 3, 1, 3, 5, 6, 3, 3, 5, 2, + 4, 0, 5, 1, 1, 5, 4, 5, 4, 5, + 6, 5, 4, 5, 4, 3, 6, 4, 5, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 3, 2, 4, 3, 5, 2, 2, 1, + 1, 1, 1, 5, 2, 1, 2, 3, 1, 2, + 1, 1, 1, 1, 1, 1, 4, 4, 5, 5, + 1, 1, 3, 4, 3, 4, 4, 4, 4, 4, + 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, + 1, 3, 1, 3, 1, 3, 4, 0, 5, 1, + 1, 1, 1, 3, 2, 3, 2, 1, 1, 1, + 0, 1, 0, 1, 1, 2, 2, 2, 2, 2, + 4, 2, 1, 3, 1, 3, 1, 3, 1, 1, + 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. @@ -327,213 +332,237 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 2, 4, 6, 8, 10, 12, 0, 16, 218, + 0, 2, 4, 6, 8, 10, 12, 0, 16, 222, 0, 0, 0, 19, 1, 19, 0, 0, 0, 0, - 0, 0, 0, 0, 205, 0, 0, 176, 203, 164, - 198, 200, 194, 79, 208, 79, 186, 207, 196, 0, - 0, 189, 216, 0, 0, 0, 0, 0, 0, 192, - 0, 0, 0, 0, 0, 0, 0, 219, 95, 206, - 171, 155, 156, 157, 158, 98, 161, 5, 177, 166, - 169, 168, 170, 167, 0, 0, 0, 16, 7, 54, + 0, 0, 0, 0, 209, 0, 0, 180, 207, 168, + 202, 204, 198, 79, 212, 79, 190, 211, 200, 0, + 0, 193, 220, 0, 0, 0, 0, 0, 0, 196, + 0, 0, 0, 0, 0, 0, 0, 223, 99, 210, + 175, 159, 160, 161, 162, 102, 165, 5, 181, 170, + 173, 172, 174, 171, 0, 0, 0, 16, 7, 54, 50, 27, 80, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 28, 65, 9, 0, 55, 0, - 11, 24, 23, 0, 0, 149, 0, 139, 140, 234, - 237, 236, 235, 222, 223, 224, 227, 221, 216, 0, - 0, 0, 0, 195, 0, 83, 187, 0, 0, 218, - 190, 191, 234, 217, 105, 235, 0, 225, 154, 153, - 0, 0, 81, 82, 216, 162, 0, 210, 213, 215, - 214, 193, 188, 141, 142, 160, 147, 146, 165, 0, - 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, + 11, 24, 23, 0, 0, 153, 0, 143, 144, 238, + 241, 240, 239, 226, 227, 228, 231, 225, 220, 0, + 0, 0, 0, 199, 0, 83, 191, 0, 0, 222, + 194, 195, 238, 221, 109, 239, 0, 229, 158, 157, + 0, 0, 81, 82, 220, 166, 0, 214, 217, 219, + 218, 197, 192, 145, 146, 164, 151, 150, 169, 0, + 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 145, 144, 143, 0, 0, 0, 0, 0, + 0, 0, 149, 148, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 77, 78, 0, 33, 16, 16, 16, 16, 16, 16, 0, 16, 16, 39, 0, 46, 49, 0, 0, 0, 0, 0, 0, 26, 25, - 20, 148, 103, 218, 0, 0, 199, 107, 84, 85, - 197, 201, 0, 0, 0, 99, 151, 0, 180, 212, - 0, 89, 209, 0, 163, 94, 93, 92, 97, 0, - 0, 121, 0, 134, 130, 131, 127, 128, 125, 0, - 137, 136, 135, 133, 132, 129, 138, 126, 0, 0, - 0, 229, 231, 233, 0, 109, 0, 0, 102, 110, - 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 152, 107, 222, 0, 0, 203, 111, 84, 85, + 201, 205, 0, 0, 0, 103, 155, 0, 184, 216, + 0, 89, 213, 0, 167, 98, 97, 96, 101, 0, + 0, 125, 0, 138, 134, 135, 131, 132, 129, 0, + 141, 140, 139, 137, 136, 133, 142, 130, 0, 0, + 0, 233, 235, 237, 0, 113, 0, 0, 106, 114, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 30, 0, 0, 70, 0, 0, 0, 0, 0, 16, 0, 0, 66, 58, 59, 72, 56, 57, - 60, 61, 0, 0, 123, 216, 87, 0, 202, 106, - 0, 150, 211, 88, 0, 0, 0, 114, 120, 0, - 0, 0, 181, 182, 183, 185, 184, 226, 118, 0, - 218, 179, 0, 112, 0, 172, 0, 173, 0, 14, + 60, 61, 0, 0, 127, 220, 87, 16, 206, 110, + 0, 154, 215, 88, 0, 0, 0, 118, 124, 0, + 0, 0, 185, 186, 187, 189, 188, 230, 122, 0, + 222, 183, 0, 116, 0, 176, 0, 177, 0, 14, 16, 29, 83, 16, 32, 0, 0, 71, 0, 0, - 73, 75, 0, 0, 220, 69, 74, 0, 0, 55, - 0, 0, 0, 104, 204, 108, 86, 152, 100, 124, - 0, 117, 159, 0, 113, 119, 0, 115, 174, 175, - 111, 0, 85, 47, 216, 67, 67, 0, 0, 0, - 0, 70, 0, 0, 0, 122, 116, 101, 0, 0, - 19, 0, 0, 0, 18, 62, 62, 0, 65, 0, - 0, 37, 38, 21, 91, 90, 31, 0, 34, 65, - 65, 19, 0, 0, 35, 36, 0, 45, 67, 65, - 0, 48, 40, 41, 0, 63, 0, 65, 0, 44, - 0, 52, 22, 17, 0, 43, 0, 15, 19, 51, - 0, 0, 0, 62, 42, 53, 64 + 73, 75, 0, 0, 224, 69, 74, 0, 0, 55, + 0, 0, 0, 108, 208, 112, 86, 90, 156, 104, + 128, 0, 121, 163, 0, 117, 123, 0, 119, 178, + 179, 115, 0, 85, 47, 220, 67, 67, 0, 0, + 0, 0, 70, 0, 0, 0, 91, 0, 126, 120, + 105, 0, 16, 19, 0, 0, 0, 18, 62, 62, + 0, 65, 0, 0, 37, 38, 0, 19, 21, 95, + 94, 31, 0, 34, 65, 65, 19, 0, 0, 35, + 36, 0, 45, 67, 65, 92, 0, 0, 48, 40, + 41, 0, 63, 0, 65, 0, 44, 93, 0, 52, + 22, 17, 0, 43, 0, 15, 19, 51, 0, 0, + 0, 62, 42, 53, 64 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 7, 8, 9, 10, 11, 12, 13, 111, 351, - 15, 415, 431, 103, 440, 220, 101, 102, 352, 294, - 410, 452, 459, 97, 434, 210, 412, 366, 356, 306, + 377, 418, 436, 103, 447, 220, 101, 102, 352, 294, + 413, 460, 467, 97, 439, 210, 415, 366, 356, 306, 359, 368, 362, 291, 198, 124, 195, 144, 229, 317, - 242, 426, 98, 58, 59, 315, 278, 60, 61, 62, - 63, 64, 65, 120, 66, 147, 134, 67, 363, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 113 + 242, 407, 426, 378, 431, 98, 58, 59, 315, 278, + 60, 61, 62, 63, 64, 65, 120, 66, 147, 134, + 67, 363, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 113 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -395 +#define YYPACT_NINF -401 static const yytype_int16 yypact[] = { - 701, -395, -395, -395, -395, -395, -395, 48, -395, 2461, - 6, 1112, 1016, -395, -395, -395, 1721, 2461, 2461, 397, - 397, 397, 397, 397, -395, 397, 397, -395, -395, 18, - -37, -395, 2461, -395, -395, -395, 2461, -395, -33, -19, - -11, 1628, 1535, 397, 1628, 1812, 59, 2461, 46, 2461, - 2461, 2461, 2461, 2461, 2461, 2461, 1903, 145, -7, -395, - 10, -395, -395, -395, -395, 2481, -395, -395, -6, 112, - 115, 216, -395, 82, 227, 280, 87, -395, -395, -395, - -395, -395, -395, 59, 77, -395, 2, 5, 31, 56, - 8, 57, 72, 6, -395, 61, -395, 158, 1810, 1016, - -395, -395, -395, 440, 536, -395, 41, 144, 144, -395, - -395, -395, -395, -395, -395, -395, -395, -395, 2461, 92, - 97, 2461, 99, 1706, 6, 185, 2481, 117, 1996, 1535, - -395, 1706, 1441, -7, -395, 1362, 2461, -395, -395, 1706, - 94, 107, -395, -395, 2461, 1706, 2089, 154, -395, -395, - -395, 1706, -7, 144, 144, 144, 111, 111, 220, 172, - 2461, 2461, 2461, 2461, 2461, 2461, 2182, 2461, 2461, 2461, - 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, 2461, - 2461, 2461, -395, -395, -395, 9, 2275, 2461, 2461, 2461, - 2461, 2461, 2461, 2461, -395, 223, -395, 250, -395, -395, - -395, -395, -395, -395, -395, 140, -395, -395, -395, 6, - -395, -395, 2461, 2461, 2461, 2461, 2461, 2461, -395, -395, - -395, -395, -395, 2461, 2461, 64, -395, -395, -395, 204, - -395, -395, 233, 178, 2461, -7, -395, 298, -395, -395, - 271, 286, -395, 2461, 270, 235, 235, -395, 2481, 128, - 67, -395, 327, 1194, 1613, 347, 521, 425, 2481, 296, - 1332, 1332, 1411, 326, 1520, 1244, 144, 144, 2461, 2461, - 346, 303, 306, 307, 309, -395, 318, 2368, 234, -395, - -395, 426, 190, 74, 217, 78, 252, 103, 255, 632, - -395, 330, -395, 55, 316, 2461, 2461, 2461, 2461, 337, - 1206, -395, 2461, 2461, -395, 145, -395, 145, 145, 145, - 145, 145, 251, -72, -395, 2461, 328, 6, -395, -395, - 436, -395, -395, -395, 120, 2461, 355, -395, -395, 2461, - 268, 152, -395, -395, -395, -395, -395, -395, -395, 506, - 2461, -395, 356, -395, 357, -395, 358, -395, 360, -395, - -395, -395, 185, -395, -395, 349, 273, 145, 274, 293, - 145, -395, 294, 304, -395, -395, -395, 299, 398, 241, - 2461, 324, 329, -395, -395, -395, -395, -395, -395, -395, - 156, -395, 2526, 418, -395, -395, 331, -395, -395, -395, - -395, 410, 204, -395, 2461, -395, -395, 423, 423, 2461, - 423, 2461, 333, 423, 423, -395, -395, -395, 364, 79, - -395, 419, 423, 423, -395, -2, -2, 348, 61, 441, - 423, -395, -395, -395, -395, -395, -395, 728, -395, 61, - 61, -395, 423, 359, -395, -395, 423, -395, -395, 61, - 15, -395, -395, -395, 824, -395, 2461, 61, 1299, -395, - 446, 413, -395, -395, 385, -395, 392, -395, -395, -395, - 423, 423, 920, -2, -395, -395, -395 + 709, -401, -401, -401, -401, -401, -401, 15, -401, 2565, + 19, 1216, 1120, -401, -401, -401, 1825, 2565, 2565, 379, + 379, 379, 379, 379, -401, 379, 379, -401, -401, 13, + -51, -401, 2565, -401, -401, -401, 2565, -401, -45, -39, + -17, 1732, 1639, 379, 1732, 1916, 26, 2565, 10, 2565, + 2565, 2565, 2565, 2565, 2565, 2565, 2007, -21, 11, -401, + 1, -401, -401, -401, -401, 2585, -401, -401, -7, 54, + 108, 131, -401, 91, 156, 221, 92, -401, -401, -401, + -401, -401, -401, 26, 99, -401, 20, 52, 53, 65, + -11, 69, 89, 19, -401, 116, -401, 158, 368, 1120, + -401, -401, -401, 448, 544, -401, -1, 250, 250, -401, + -401, -401, -401, -401, -401, -401, -401, -401, 2565, 90, + 94, 2565, 96, 1901, 19, 182, 2585, 125, 2100, 1639, + -401, 1901, 1545, 11, -401, 1466, 2565, -401, -401, 1901, + 208, 68, -401, -401, 2565, 1901, 2193, 167, -401, -401, + -401, 1901, 11, 250, 250, 250, 520, 520, 231, 139, + 2565, 2565, 2565, 2565, 2565, 2565, 2286, 2565, 2565, 2565, + 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2565, + 2565, 2565, -401, -401, -401, 63, 2379, 2565, 2565, 2565, + 2565, 2565, 2565, 2565, -401, 222, -401, 223, -401, -401, + -401, -401, -401, -401, -401, 141, -401, -401, -401, 19, + -401, -401, 2565, 2565, 2565, 2565, 2565, 2565, -401, -401, + -401, -401, -401, 2565, 2565, 61, -401, -401, -401, 191, + -401, -401, 160, 162, 2565, 11, -401, 257, -401, -401, + 213, 247, -401, 2565, 269, 199, 199, -401, 2585, 75, + 72, -401, 233, 1298, 1810, 1624, 529, 273, 2585, 295, + 342, 342, 1436, 1515, 1717, 1348, 250, 250, 2565, 2565, + 515, 267, 288, 289, 290, -401, 296, 2472, 178, -401, + -401, 349, 157, 93, 248, 98, 255, 103, 263, 640, + -401, 297, -401, 12, 264, 2565, 2565, 2565, 2565, 301, + 1310, -401, 2565, 2565, -401, -21, -401, -21, -21, -21, + -21, -21, 217, -66, -401, 2565, 302, -401, -401, -401, + 418, -401, -401, -401, 118, 2565, 311, -401, -401, 2565, + 266, 124, -401, -401, -401, -401, -401, -401, -401, 434, + 2565, -401, 317, -401, 320, -401, 340, -401, 343, -401, + -401, -401, 182, -401, -401, 329, 252, -21, 253, 258, + -21, -401, 259, 261, -401, -401, -401, 271, 366, 227, + 2565, 285, 287, -401, -401, -401, -401, 292, -401, -401, + -401, 129, -401, 2630, 388, -401, -401, 298, -401, -401, + -401, -401, 394, 191, -401, 2565, -401, -401, 399, 399, + 2565, 399, 2565, 314, 399, 399, -401, 409, -401, -401, + -401, 346, 401, -401, 403, 399, 399, -401, 23, 23, + 331, 116, 414, 399, -401, -401, 333, -401, -401, -401, + -401, -401, 736, -401, 116, 116, -401, 399, 339, -401, + -401, 399, -401, -401, 116, -401, 832, 9, -401, -401, + -401, 928, -401, 2565, 116, 1403, -401, -401, 425, 380, + -401, -401, 350, -401, 353, -401, -401, -401, 399, 399, + 1024, 23, -401, -401, -401 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -395, -395, -395, -395, -395, -395, -395, -395, -10, -395, - -30, -98, -395, -12, -395, 489, 417, -4, -395, -395, - -395, -395, -395, -295, -394, -362, -380, -395, 116, 44, - -289, 70, -395, -395, 334, 490, -395, 444, 177, 132, - -395, -395, 1, -38, -395, -395, -395, -395, -395, -395, - -395, -395, 84, -395, -395, -395, -112, -120, -395, -395, - 17, 486, 487, -395, -395, -395, -395, -395, 29 + -401, -401, -401, -401, -401, -401, -401, -401, -10, -401, + 22, -103, -401, -12, -401, 444, 359, 7, -401, -401, + -401, -401, -401, -295, -400, 88, -381, -401, 67, -189, + -280, 21, -401, -401, 274, 467, -401, 438, 173, 133, + -401, -401, -401, 117, -401, -3, -33, -401, -401, -401, + -401, -401, -401, -401, -401, 80, -401, -401, -401, -111, + -121, -401, -401, 18, 480, 483, -401, -401, -401, -401, + -401, 25 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -233 +#define YYTABLE_NINF -237 static const yytype_int16 yytable[] = { - 78, 95, 95, 104, 133, 365, 222, 96, 163, 233, - 57, 367, 152, 371, 372, 77, 413, 106, 268, 164, - 269, 165, 435, 19, 270, 271, 272, 273, 274, 121, - 374, 130, 238, 275, 138, 450, 112, 112, 112, 112, - 112, 451, 112, 112, 432, 433, 141, 194, 14, 114, - 115, 116, 117, 221, 118, 119, 437, 159, 448, 135, - 112, 19, 20, 21, 353, 148, 122, 442, 443, 466, - 127, 136, 137, 163, 276, 354, 314, 449, 203, 327, - 133, 402, 142, 208, 128, 455, 343, 143, 77, 95, - 345, -232, 129, 95, 95, 219, 193, 186, 235, 424, - 197, 107, 108, 312, 236, 199, 133, 205, 200, 209, - 417, 204, 277, 166, 227, 347, 123, 160, 161, 162, - 126, 187, 225, 188, -228, 131, -228, 237, 139, 232, - 57, 145, 379, 151, 201, 153, 154, 155, 156, 157, - 160, 161, 162, 160, 161, 162, 135, 240, 326, 146, - 160, 161, 162, 365, 160, 161, 162, 454, 234, 202, - 206, 245, 246, 247, 384, 249, 250, 252, 405, 295, - 296, 297, 298, 299, 300, 207, 302, 303, 211, 160, - 161, 162, 289, 160, 161, 162, 313, 281, 282, 283, - 284, 285, 286, 287, 288, 223, 160, 161, 162, 304, - 224, 226, 279, 375, 160, 161, 162, -233, -233, -233, - 342, 228, 185, 305, 307, 308, 309, 310, 311, 230, - 386, 160, 161, 162, 57, -230, 241, -230, 160, 161, - 162, 243, 160, 161, 162, 320, 189, 344, 190, 181, - 182, 183, 184, 301, 324, 185, 290, 248, 160, 161, - 162, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 160, 161, 162, 330, - 331, 370, 346, 293, 244, 348, 316, 133, 339, 95, - 319, 325, 411, 212, 213, 214, 215, 112, 383, 191, - 216, 192, 217, 160, 161, 162, 357, 307, 360, 307, - 416, 369, 418, 360, 360, 421, 422, 377, 321, 160, - 161, 162, 323, 162, 429, 430, 364, 160, 161, 162, - 391, 333, 439, 393, 334, 335, 380, 336, 160, 161, - 162, 160, 161, 162, 445, 318, 337, 340, 447, 355, - 358, 57, 361, -73, 160, 161, 162, 160, 161, 162, - 167, 350, 19, 373, 376, 77, 133, 168, 169, 170, - 171, 19, 463, 464, 332, 381, 387, 388, 389, 109, - 390, 360, 394, 322, 110, 395, 396, 172, 173, 329, - 174, 175, 176, 177, 178, 179, 180, 168, 169, 170, - 171, 181, 182, 183, 184, 397, 398, 185, 427, 425, - 360, 400, 357, 160, 161, 162, 77, 399, 168, -233, - 170, 171, 19, 382, 178, 179, 180, 95, 401, 444, - 109, 181, 182, 183, 184, 110, 403, 185, 406, 328, - 408, 404, 414, 407, 95, 420, 179, 180, 423, 428, - -13, 79, 181, 182, 183, 184, 462, 360, 185, 77, - 436, 16, 95, 17, 18, 19, 20, 21, 22, 23, - 80, 438, 446, 24, 25, 26, 27, 28, 457, 29, + 78, 95, 95, 104, 19, 365, 57, 222, 233, 133, + 164, 221, 165, 106, 163, 14, 416, 152, 96, 440, + 367, 353, 371, 372, 121, 19, 20, 21, 77, 458, + 15, 130, 354, 238, 138, 459, 374, 112, 112, 112, + 112, 112, 141, 112, 112, 114, 115, 116, 117, 142, + 118, 119, 122, 159, 143, 160, 161, 162, 127, 203, + 135, 112, 455, 187, 128, 188, 148, 136, 137, 437, + 438, 474, 268, 314, 269, 160, 161, 162, 270, 271, + 272, 273, 274, 208, 327, 133, 129, 275, 237, 95, + 403, 163, 204, 95, 95, 326, 186, 107, 108, 194, + -236, 193, 312, 235, 166, 343, 219, 358, 205, 361, + 345, 133, 123, 146, 227, 347, 126, -232, 225, -232, + 420, 131, 197, 199, 139, 232, 57, 145, 276, 151, + 380, 153, 154, 155, 156, 157, 385, 160, 161, 162, + -234, 408, -234, 240, 160, 161, 162, 135, 160, 161, + 162, 160, 161, 162, 234, 200, 201, 245, 246, 247, + 365, 249, 250, 252, 209, 189, 277, 190, 202, 160, + 161, 162, 206, 462, 160, 161, 162, 342, 211, 160, + 161, 162, 289, 281, 282, 283, 284, 285, 286, 287, + 288, 313, 207, 223, 160, 161, 162, 224, 226, 304, + 160, 161, 162, 279, 375, 160, 161, 162, 228, 305, + 307, 308, 309, 310, 311, 160, 161, 162, 236, 387, + 57, 295, 296, 297, 298, 299, 300, 230, 302, 303, + 191, 320, 192, 160, 161, 162, 160, 161, 162, 241, + 324, 244, 243, 248, 301, 290, 293, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 318, 316, 319, 330, 331, 321, 344, 212, + 213, 214, 215, 323, 339, 346, 216, 162, 217, 95, + 325, 340, 133, 348, 414, 333, 384, 355, 112, 160, + 161, 162, 357, 307, 360, 307, 419, 369, 421, 360, + 360, 424, 425, 160, 161, 162, 334, 335, 336, 160, + 161, 162, 434, 435, 337, 322, 19, 364, 350, 373, + 444, 382, 381, 370, 160, 161, 162, 388, 376, -73, + 389, 160, 161, 162, 452, 328, 170, 57, 454, 160, + 161, 162, 160, 161, 162, 181, 182, 183, 184, 167, + 390, 185, 395, 391, 396, 397, 168, 169, 170, 171, + 398, 399, 133, 180, 400, 471, 472, 360, 181, 182, + 183, 184, 392, 401, 185, 394, 172, 173, 329, 174, + 175, 176, 177, 178, 179, 180, 402, 404, 77, 405, + 181, 182, 183, 184, 19, 406, 185, 360, 409, 357, + 410, 432, 109, 168, 169, 170, 171, 110, 417, 383, + 212, 213, 214, 215, 411, 446, 423, 216, 427, 217, + 428, 429, 95, 433, 451, 160, 161, 162, 176, 177, + 178, 179, 180, 441, 443, 445, 95, 181, 182, 183, + 184, 95, 453, 185, 160, 161, 162, 465, -13, 79, + 360, 341, 468, 466, 470, 469, 100, 77, 218, 16, + 95, 17, 18, 19, 20, 21, 22, 23, 80, 422, + 292, 24, 25, 26, 27, 28, 464, 29, 30, 31, + 32, 33, 34, 81, 99, 82, 83, 35, 84, 85, + 86, 87, 88, 89, 160, 161, 162, 90, 91, 92, + 93, 36, 125, 37, 38, 39, 40, 41, 42, 442, + 160, 161, 162, 43, 44, 45, 46, 47, 48, 49, + 379, 196, 449, 450, 77, 393, 412, 50, 149, 430, + 19, 150, 456, 332, 0, 0, 386, 0, 109, 51, + 52, 53, 463, 110, -3, 79, 0, 54, 55, 0, + 0, 56, 94, 77, 0, 16, 0, 17, 18, 19, + 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, + 27, 28, 0, 29, 30, 31, 32, 33, 34, 81, + 99, 82, 83, 35, 84, 85, 86, 87, 88, 89, + 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, + 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, + 44, 45, 46, 47, 48, 49, -237, -237, -237, 180, + 0, 185, 0, 50, 181, 182, 183, 184, 0, 0, + 185, 0, 0, 0, 0, 51, 52, 53, 0, 0, + 0, 79, 0, 54, 55, 0, 0, 56, 94, 77, + 349, 16, 0, 17, 18, 19, 20, 21, 22, 23, + 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 81, 99, 82, 83, 35, - 84, 85, 86, 87, 88, 89, 458, 460, 170, 90, - 91, 92, 93, 36, 461, 37, 38, 39, 40, 41, - 42, 100, 160, 161, 162, 43, 44, 45, 46, 47, - 48, 49, 160, 161, 162, 180, 218, 419, 456, 50, - 181, 182, 183, 184, 409, 125, 185, 196, 341, 392, - 292, 51, 52, 53, 149, 150, -3, 79, 378, 54, - 55, 0, 0, 56, 94, 77, 0, 16, 0, 17, + 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, + 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, + 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, + 48, 49, 1, 2, 3, 4, 5, 6, 0, 50, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 51, 52, 53, 0, 0, 0, 79, 0, 54, + 55, 0, 0, 56, 94, 77, 448, 16, 0, 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 81, 99, 82, 83, 35, 84, 85, 86, 87, - 88, 89, 160, 161, 162, 90, 91, 92, 93, 36, + 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, - 0, 43, 44, 45, 46, 47, 48, 49, 385, 0, - 0, 180, 0, 0, 0, 50, 181, 182, 183, 184, - 0, 0, 185, 0, 0, 0, 0, 51, 52, 53, + 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, + 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 79, 0, 54, 55, 0, 0, 56, - 94, 77, 349, 16, 0, 17, 18, 19, 20, 21, + 94, 77, 457, 16, 0, 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 81, 99, 82, 83, 35, 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, - 46, 47, 48, 49, 1, 2, 3, 4, 5, 6, + 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 79, - 0, 54, 55, 0, 0, 56, 94, 77, 441, 16, + 0, 54, 55, 0, 0, 56, 94, 77, 461, 16, 0, 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 81, 99, 82, 83, 35, 84, 85, @@ -543,13 +572,13 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 79, 0, 54, 55, 0, - 0, 56, 94, 77, 453, 16, 0, 17, 18, 19, + 0, 56, 94, 77, 0, 16, 0, 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 81, 99, 82, 83, 35, 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, - 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, + 44, 45, 46, 47, 48, 49, 0, 0, 473, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 79, 0, 54, 55, 0, 0, 56, 94, 77, @@ -559,99 +588,108 @@ static const yytype_int16 yytable[] = 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, - 48, 49, 0, 0, 465, 0, 0, 0, 0, 50, + 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 79, 0, 54, 55, 0, 0, 56, 94, 77, 0, 16, 0, 17, 18, 19, 20, 21, 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, - 34, 81, 99, 82, 83, 35, 84, 85, 86, 87, + 34, 81, 0, 82, 83, 35, 84, 85, 86, 87, 88, 89, 0, 0, 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, - 0, 0, 0, 79, 0, 54, 55, 0, 0, 56, - 94, 77, 0, 16, 0, 17, 18, 19, 20, 21, - 22, 23, 80, 0, 0, 24, 25, 26, 27, 28, - 0, 29, 30, 31, 32, 33, 34, 81, 0, 82, - 83, 35, 84, 85, 86, 87, 88, 89, 0, 0, - 0, 90, 91, 92, 93, 36, 0, 37, 38, 39, - 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, - 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, - 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 51, 52, 53, 0, 79, 0, 0, - 0, 54, 55, 0, 0, 56, 94, 16, 0, 17, - 18, 19, 20, 21, 22, 23, -68, 0, 0, 24, - 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, - 34, 0, 0, 0, 0, 35, 0, 0, -233, 0, - 0, 0, 0, 0, 0, 168, 169, 170, 171, 36, - 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, - 0, 43, 44, 45, 46, 47, 48, 49, 174, 175, - 176, 177, 178, 179, 180, 50, 0, 0, 0, 181, - 182, 183, 184, 0, 0, 185, 0, 51, 52, 53, - 79, 0, 0, 0, 0, 54, 55, 170, 171, 56, + 0, 79, 0, 0, 0, 54, 55, 0, 0, 56, + 94, 16, 0, 17, 18, 19, 20, 21, 22, 23, + -68, 0, 0, 24, 25, 26, 27, 28, 0, 29, + 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, + 0, 0, -237, 0, 0, 0, 0, 0, 0, 168, + 169, 170, 171, 36, 0, 37, 38, 39, 40, 41, + 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, + 48, 49, 174, 175, 176, 177, 178, 179, 180, 50, + 0, 0, 0, 181, 182, 183, 184, 0, 0, 185, + 0, 51, 52, 53, 79, 0, 0, 0, 0, 54, + 55, 170, 171, 56, 16, 0, 17, 18, 19, 20, + 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, + 28, 0, 29, 30, 31, 32, 33, 34, 180, 0, + 0, 0, 35, 181, 182, 183, 184, 0, 0, 185, + 0, 0, 0, 0, 0, 0, 36, 0, 37, 38, + 39, 40, 41, 42, 0, 0, -170, 0, 43, 44, + 45, 46, 47, 48, 49, 187, 0, 188, -170, 0, + 0, 0, 50, 0, 0, 0, -170, 0, 0, 0, + 0, 0, 0, 0, 51, 52, 53, 168, 169, 170, + 171, 0, 54, 55, 0, -68, 56, 0, -170, -170, + -170, -170, 0, 0, 0, -170, 0, -170, 0, 0, + -170, 0, 0, 177, 178, 179, 180, -170, -170, -170, + -170, 181, 182, 183, 184, 0, 0, 185, 0, 0, + 0, 0, -170, -170, -170, -209, -170, -170, -170, -170, + -170, -170, -170, -170, -170, -170, -170, -209, 0, 0, + 0, -170, -170, -170, -170, -209, 0, -170, -170, 0, + 0, 0, 0, 0, 0, 0, 168, 169, 170, 171, + 0, 0, 0, 0, 0, 0, 0, -209, -209, -209, + -209, 0, 0, 0, -209, 0, -209, 0, 0, -209, + 0, 0, 0, 178, 179, 180, -209, -209, -209, -209, + 181, 182, 183, 184, 0, 0, 185, 0, 0, 0, + 0, -209, -209, -209, 0, -209, -209, -209, -209, -209, + -209, -209, -209, -209, -209, -209, 0, 0, 0, 0, + -209, -209, -209, -209, 0, 0, -209, -209, 77, 0, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, - 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, - 31, 32, 33, 34, 180, 0, 0, 0, 35, 181, - 182, 183, 184, 0, 0, 185, 0, 0, 0, 0, + 0, 0, 132, 25, 26, 27, 28, 110, 29, 30, + 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 168, -237, 170, 171, 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, 42, - 0, 0, -166, 0, 43, 44, 45, 46, 47, 48, - 49, 187, 0, 188, -166, 0, 0, 0, 50, 0, - 0, 0, -166, 0, 0, 0, 0, 0, 0, 0, - 51, 52, 53, 168, 169, 170, 171, 0, 54, 55, - 0, -68, 56, 0, -166, -166, -166, -166, 0, 0, - 0, -166, 0, -166, 0, 0, -166, 0, 176, 177, - 178, 179, 180, -166, -166, -166, -166, 181, 182, 183, - 184, 0, 0, 185, 0, 0, 0, 0, -166, -166, - -166, -205, -166, -166, -166, -166, -166, -166, -166, -166, - -166, -166, -166, -205, 0, 0, 0, -166, -166, -166, - -166, -205, 0, -166, -166, 0, 0, 0, 0, 0, - 0, 0, 168, 169, 170, 171, 0, 0, 0, 0, - 0, 0, 0, -205, -205, -205, -205, 0, 0, 0, - -205, 0, -205, 0, 0, -205, 0, 0, 177, 178, - 179, 180, -205, -205, -205, -205, 181, 182, 183, 184, - 0, 0, 185, 0, 0, 0, 0, -205, -205, -205, - 0, -205, -205, -205, -205, -205, -205, -205, -205, -205, - -205, -205, 0, 0, 0, 0, -205, -205, -205, -205, - 0, 0, -205, -205, 77, 0, 16, 0, 17, 18, - 19, 20, 21, 22, 23, 0, 0, 0, 132, 25, - 26, 27, 28, 110, 29, 30, 31, 32, 33, 34, + 0, 0, 0, 0, 43, 44, 45, 46, 47, 48, + 49, 0, 0, 179, 180, 0, 0, 0, 50, 181, + 182, 183, 184, 0, 0, 185, 0, 0, 0, 0, + 51, 52, 53, 0, 0, 0, 0, 0, 54, 55, + 0, 77, 56, 16, 0, 17, 18, 19, 20, 21, + 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, + 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, + 0, 35, 0, 0, 0, 0, 0, 0, 168, 169, + 170, 171, 0, 0, 0, 36, 0, 37, 38, 39, + 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, + 46, 47, 48, 49, 0, 0, 179, 180, 0, 0, + 0, 50, 181, 182, 183, 184, 0, 0, 185, 0, + 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, + 0, 54, 55, 0, 0, 56, 16, 105, 17, 18, + 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, + 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, - 0, 168, 169, 170, 171, 0, 0, 0, 36, 0, + 0, -237, 0, 170, 171, 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, 179, 180, 0, 0, 0, 50, 181, 182, 183, 184, 0, 0, 185, 0, 0, 0, 0, 51, 52, 53, 0, - 0, 0, 0, 0, 54, 55, 0, 77, 56, 16, - 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, - 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, - 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, - 0, 0, 0, 0, -233, 0, 170, 171, 0, 0, - 0, 36, 0, 37, 38, 39, 40, 41, 42, 0, - 0, 0, 0, 43, 44, 45, 46, 47, 48, 49, - 0, 0, 179, 180, 0, 0, 0, 50, 181, 182, - 183, 184, 0, 0, 185, 0, 0, 0, 0, 51, - 52, 53, 0, 0, 0, 0, 0, 54, 55, 0, - 0, 56, 16, 105, 17, 18, 19, 20, 21, 22, - 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, - 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, - 35, 0, 0, 0, 0, 0, 0, 0, 0, 170, - 171, 0, 0, 0, 36, 0, 37, 38, 39, 40, - 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, - 47, 48, 49, 0, 0, 179, 180, 0, 0, 0, - 50, 181, 182, 183, 184, 0, 0, 185, 0, 0, - 0, 0, 51, 52, 53, 0, 0, 0, 0, 0, - 54, 55, 0, 16, 56, 17, 18, 19, 20, 21, - 22, 23, 140, 0, 0, 24, 25, 26, 27, 28, - 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, - 0, 35, 212, 213, 214, 215, 0, 0, 0, 216, - 0, 217, 0, 0, 0, 36, 0, 37, 38, 39, - 40, 41, 42, 0, 0, 0, 0, 43, 44, 45, - 46, 47, 48, 49, 0, 0, 160, 161, 162, 0, - 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, - 0, 54, 55, 0, 16, 56, 17, 18, 19, 20, + 0, 0, 0, 0, 54, 55, 0, 16, 56, 17, + 18, 19, 20, 21, 22, 23, 140, 0, 0, 24, + 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, + 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, + 0, 0, 0, 0, 170, 171, 0, 0, 0, 36, + 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, + 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, + 179, 180, 0, 0, 0, 50, 181, 182, 183, 184, + 0, 0, 185, 0, 0, 0, 0, 51, 52, 53, + 0, 0, 0, 0, 0, 54, 55, 0, 16, 56, + 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, + 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, + 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, + 0, 0, 43, 44, 45, 46, 47, 48, 49, 0, + 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, + 53, 0, 0, 0, 0, 0, 54, 55, 0, 158, + 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, + 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, + 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, + 42, 0, 0, 0, 0, 43, 44, 45, 46, 47, + 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 51, 52, 53, 0, 0, 0, 0, 0, 54, + 55, 0, 231, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, @@ -660,7 +698,7 @@ static const yytype_int16 yytable[] = 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, - 0, 0, 54, 55, 0, 158, 56, 16, 0, 17, + 0, 0, 54, 55, 0, 239, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, @@ -669,7 +707,7 @@ static const yytype_int16 yytable[] = 0, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, - 0, 0, 0, 0, 0, 54, 55, 0, 231, 56, + 0, 0, 0, 0, 0, 54, 55, 0, 251, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, @@ -679,7 +717,7 @@ static const yytype_int16 yytable[] = 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, 0, 54, 55, - 0, 239, 56, 16, 0, 17, 18, 19, 20, 21, + 0, 280, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, @@ -688,114 +726,116 @@ static const yytype_int16 yytable[] = 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, 0, 0, 0, - 0, 54, 55, 0, 251, 56, 16, 0, 17, 18, + 0, 54, 55, 0, 338, 56, 16, 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, - 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, - 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, + 43, 44, 45, 46, 47, 48, 49, 0, 0, 167, + 0, 0, 0, 0, 50, 0, 168, 169, 170, 171, 0, 0, 0, 0, 0, 0, 51, 52, 53, 0, - 0, 0, 0, 0, 54, 55, 0, 280, 56, 16, - 0, 17, 18, 19, 20, 21, 22, 23, 0, 0, - 0, 24, 25, 26, 27, 28, 0, 29, 30, 31, - 32, 33, 34, 0, 0, 0, 0, 35, 0, 0, + 0, 0, 0, 0, 54, 55, 172, 173, 56, 174, + 175, 176, 177, 178, 179, 180, 0, 0, 0, 0, + 181, 182, 183, 184, 167, 0, 185, 0, 0, 0, + 0, 168, 169, 170, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 0, 37, 38, 39, 40, 41, 42, 0, - 0, 0, 0, 43, 44, 45, 46, 47, 48, 49, - 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, - 52, 53, 0, 0, 0, 0, 0, 54, 55, 0, - 338, 56, 16, 0, 17, 18, 19, 20, 21, 22, - 23, 0, 0, 0, 24, 25, 26, 27, 28, 0, - 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, - 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 36, 0, 37, 38, 39, 40, - 41, 42, 0, 0, 0, 0, 43, 44, 45, 46, - 47, 48, 49, 0, 0, 167, 0, 0, 0, 0, - 50, 0, 168, 169, 170, 171, 0, 0, 0, 0, - 0, 0, 51, 52, 53, 0, 0, 0, 0, 0, - 54, 55, 172, 173, 56, 174, 175, 176, 177, 178, - 179, 180, 0, 0, 0, 0, 181, 182, 183, 184, - 167, 0, 185, 0, 0, 0, 0, 168, 169, 170, - 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, - 174, 175, 176, 177, 178, 179, 180, 0, 0, 0, - 0, 181, 182, 183, 184, 0, 0, 185 + 0, 0, 173, 0, 174, 175, 176, 177, 178, 179, + 180, 0, 0, 0, 0, 181, 182, 183, 184, 0, + 0, 185 }; -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-395))) +#define yypact_value_is_default(yystate) \ + ((yystate) == (-401)) -#define yytable_value_is_error(Yytable_value) \ - (!!((Yytable_value) == (-233))) +#define yytable_value_is_error(yytable_value) \ + ((yytable_value) == (-237)) static const yytype_int16 yycheck[] = { - 10, 11, 12, 15, 42, 300, 118, 11, 80, 129, - 9, 300, 50, 302, 303, 9, 396, 16, 9, 9, - 11, 11, 416, 15, 15, 16, 17, 18, 19, 11, - 102, 41, 144, 24, 44, 20, 19, 20, 21, 22, - 23, 26, 25, 26, 46, 47, 45, 77, 0, 20, - 21, 22, 23, 12, 25, 26, 418, 56, 438, 42, - 43, 15, 16, 17, 9, 48, 103, 429, 430, 463, - 103, 42, 43, 80, 65, 20, 12, 439, 70, 12, - 118, 370, 23, 93, 103, 447, 12, 28, 9, 99, - 12, 9, 103, 103, 104, 99, 9, 103, 136, 20, - 23, 17, 18, 223, 10, 103, 144, 90, 103, 48, - 399, 103, 103, 103, 124, 12, 32, 76, 77, 78, - 36, 9, 121, 11, 9, 41, 11, 20, 44, 128, - 129, 47, 12, 49, 103, 51, 52, 53, 54, 55, - 76, 77, 78, 76, 77, 78, 129, 146, 20, 103, - 76, 77, 78, 448, 76, 77, 78, 446, 129, 103, - 103, 160, 161, 162, 12, 164, 165, 166, 12, 199, - 200, 201, 202, 203, 204, 103, 206, 207, 20, 76, - 77, 78, 194, 76, 77, 78, 224, 186, 187, 188, - 189, 190, 191, 192, 193, 103, 76, 77, 78, 209, - 103, 102, 185, 315, 76, 77, 78, 96, 97, 98, - 20, 26, 101, 212, 213, 214, 215, 216, 217, 102, - 340, 76, 77, 78, 223, 9, 72, 11, 76, 77, - 78, 11, 76, 77, 78, 234, 9, 20, 11, 95, - 96, 97, 98, 103, 243, 101, 23, 163, 76, 77, - 78, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 76, 77, 78, 268, - 269, 301, 20, 23, 102, 20, 72, 315, 277, 289, - 102, 11, 394, 42, 43, 44, 45, 270, 20, 9, - 49, 11, 51, 76, 77, 78, 295, 296, 297, 298, - 398, 300, 400, 302, 303, 403, 404, 317, 10, 76, - 77, 78, 26, 78, 412, 413, 299, 76, 77, 78, - 350, 18, 420, 353, 18, 18, 325, 18, 76, 77, - 78, 76, 77, 78, 432, 102, 18, 103, 436, 23, - 296, 340, 298, 102, 76, 77, 78, 76, 77, 78, - 54, 21, 15, 102, 26, 9, 394, 61, 62, 63, - 64, 15, 460, 461, 18, 10, 10, 10, 10, 23, - 10, 370, 23, 102, 28, 102, 102, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 61, 62, 63, - 64, 95, 96, 97, 98, 102, 102, 101, 410, 409, - 399, 102, 401, 76, 77, 78, 9, 103, 61, 62, - 63, 64, 15, 329, 88, 89, 90, 427, 20, 431, - 23, 95, 96, 97, 98, 28, 102, 101, 10, 102, - 20, 102, 9, 102, 444, 102, 89, 90, 74, 20, - 0, 1, 95, 96, 97, 98, 458, 446, 101, 9, - 102, 11, 462, 13, 14, 15, 16, 17, 18, 19, - 20, 20, 103, 23, 24, 25, 26, 27, 22, 29, + 10, 11, 12, 15, 15, 300, 9, 118, 129, 42, + 9, 12, 11, 16, 80, 0, 397, 50, 11, 419, + 300, 9, 302, 303, 11, 15, 16, 17, 9, 20, + 8, 41, 20, 144, 44, 26, 102, 19, 20, 21, + 22, 23, 45, 25, 26, 20, 21, 22, 23, 23, + 25, 26, 103, 56, 28, 76, 77, 78, 103, 70, + 42, 43, 443, 9, 103, 11, 48, 42, 43, 46, + 47, 471, 9, 12, 11, 76, 77, 78, 15, 16, + 17, 18, 19, 93, 12, 118, 103, 24, 20, 99, + 370, 80, 103, 103, 104, 20, 103, 17, 18, 77, + 9, 9, 223, 136, 103, 12, 99, 296, 90, 298, + 12, 144, 32, 103, 124, 12, 36, 9, 121, 11, + 400, 41, 23, 103, 44, 128, 129, 47, 65, 49, + 12, 51, 52, 53, 54, 55, 12, 76, 77, 78, + 9, 12, 11, 146, 76, 77, 78, 129, 76, 77, + 78, 76, 77, 78, 129, 103, 103, 160, 161, 162, + 455, 164, 165, 166, 48, 9, 103, 11, 103, 76, + 77, 78, 103, 453, 76, 77, 78, 20, 20, 76, + 77, 78, 194, 186, 187, 188, 189, 190, 191, 192, + 193, 224, 103, 103, 76, 77, 78, 103, 102, 209, + 76, 77, 78, 185, 315, 76, 77, 78, 26, 212, + 213, 214, 215, 216, 217, 76, 77, 78, 10, 340, + 223, 199, 200, 201, 202, 203, 204, 102, 206, 207, + 9, 234, 11, 76, 77, 78, 76, 77, 78, 72, + 243, 102, 11, 163, 103, 23, 23, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 102, 72, 102, 268, 269, 10, 20, 42, + 43, 44, 45, 26, 277, 20, 49, 78, 51, 289, + 11, 103, 315, 20, 395, 18, 20, 23, 270, 76, + 77, 78, 295, 296, 297, 298, 399, 300, 401, 302, + 303, 404, 405, 76, 77, 78, 18, 18, 18, 76, + 77, 78, 415, 416, 18, 102, 15, 299, 21, 102, + 423, 10, 325, 301, 76, 77, 78, 10, 26, 102, + 10, 76, 77, 78, 437, 102, 63, 340, 441, 76, + 77, 78, 76, 77, 78, 95, 96, 97, 98, 54, + 10, 101, 23, 10, 102, 102, 61, 62, 63, 64, + 102, 102, 395, 90, 103, 468, 469, 370, 95, 96, + 97, 98, 350, 102, 101, 353, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 20, 102, 9, 102, + 95, 96, 97, 98, 15, 103, 101, 400, 10, 402, + 102, 413, 23, 61, 62, 63, 64, 28, 9, 329, + 42, 43, 44, 45, 20, 427, 102, 49, 9, 51, + 74, 20, 432, 20, 436, 76, 77, 78, 86, 87, + 88, 89, 90, 102, 20, 102, 446, 95, 96, 97, + 98, 451, 103, 101, 76, 77, 78, 22, 0, 1, + 453, 102, 102, 73, 466, 102, 12, 9, 99, 11, + 470, 13, 14, 15, 16, 17, 18, 19, 20, 402, + 196, 23, 24, 25, 26, 27, 455, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 76, 77, 78, 49, 50, 51, + 52, 53, 35, 55, 56, 57, 58, 59, 60, 421, + 76, 77, 78, 65, 66, 67, 68, 69, 70, 71, + 102, 83, 434, 435, 9, 352, 393, 79, 48, 412, + 15, 48, 444, 18, -1, -1, 102, -1, 23, 91, + 92, 93, 454, 28, 0, 1, -1, 99, 100, -1, + -1, 103, 104, 9, -1, 11, -1, 13, 14, 15, + 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, + 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, + 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, + 66, 67, 68, 69, 70, 71, 96, 97, 98, 90, + -1, 101, -1, 79, 95, 96, 97, 98, -1, -1, + 101, -1, -1, -1, -1, 91, 92, 93, -1, -1, + -1, 1, -1, 99, 100, -1, -1, 103, 104, 9, + 10, 11, -1, 13, 14, 15, 16, 17, 18, 19, + 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 73, 102, 63, 49, - 50, 51, 52, 53, 102, 55, 56, 57, 58, 59, - 60, 12, 76, 77, 78, 65, 66, 67, 68, 69, - 70, 71, 76, 77, 78, 90, 99, 401, 448, 79, - 95, 96, 97, 98, 392, 35, 101, 83, 102, 352, - 196, 91, 92, 93, 48, 48, 0, 1, 102, 99, - 100, -1, -1, 103, 104, 9, -1, 11, -1, 13, + 40, 41, 42, 43, 44, 45, -1, -1, -1, 49, + 50, 51, 52, 53, -1, 55, 56, 57, 58, 59, + 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, + 70, 71, 3, 4, 5, 6, 7, 8, -1, 79, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 91, 92, 93, -1, -1, -1, 1, -1, 99, + 100, -1, -1, 103, 104, 9, 10, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 76, 77, 78, 49, 50, 51, 52, 53, + 44, 45, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, - -1, 65, 66, 67, 68, 69, 70, 71, 102, -1, - -1, 90, -1, -1, -1, 79, 95, 96, 97, 98, - -1, -1, 101, -1, -1, -1, -1, 91, 92, 93, + -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, + -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 91, 92, 93, -1, -1, -1, 1, -1, 99, 100, -1, -1, 103, 104, 9, 10, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, @@ -803,7 +843,7 @@ static const yytype_int16 yycheck[] = 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, - 68, 69, 70, 71, 3, 4, 5, 6, 7, 8, + 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, 93, -1, -1, -1, 1, -1, 99, 100, -1, -1, 103, 104, 9, 10, 11, @@ -816,13 +856,13 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, 93, -1, -1, -1, 1, -1, 99, 100, -1, - -1, 103, 104, 9, 10, 11, -1, 13, 14, 15, + -1, 103, 104, 9, -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, - 66, 67, 68, 69, 70, 71, -1, -1, -1, -1, + 66, 67, 68, 69, 70, 71, -1, -1, 74, -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, 93, -1, -1, -1, 1, -1, 99, 100, -1, -1, 103, 104, 9, @@ -832,99 +872,108 @@ static const yytype_int16 yycheck[] = 40, 41, 42, 43, 44, 45, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, - 70, 71, -1, -1, 74, -1, -1, -1, -1, 79, + 70, 71, -1, -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, 93, -1, -1, -1, 1, -1, 99, 100, -1, -1, 103, 104, 9, -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 34, 35, -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, 93, - -1, -1, -1, 1, -1, 99, 100, -1, -1, 103, - 104, 9, -1, 11, -1, 13, 14, 15, 16, 17, - 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, - -1, 29, 30, 31, 32, 33, 34, 35, -1, 37, - 38, 39, 40, 41, 42, 43, 44, 45, -1, -1, - -1, 49, 50, 51, 52, 53, -1, 55, 56, 57, - 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, - 68, 69, 70, 71, -1, -1, -1, -1, -1, -1, - -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91, 92, 93, -1, 1, -1, -1, - -1, 99, 100, -1, -1, 103, 104, 11, -1, 13, - 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, - 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, - 34, -1, -1, -1, -1, 39, -1, -1, 54, -1, - -1, -1, -1, -1, -1, 61, 62, 63, 64, 53, - -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, - -1, 65, 66, 67, 68, 69, 70, 71, 84, 85, - 86, 87, 88, 89, 90, 79, -1, -1, -1, 95, - 96, 97, 98, -1, -1, 101, -1, 91, 92, 93, - 1, -1, -1, -1, -1, 99, 100, 63, 64, 103, + -1, 1, -1, -1, -1, 99, 100, -1, -1, 103, + 104, 11, -1, 13, 14, 15, 16, 17, 18, 19, + 20, -1, -1, 23, 24, 25, 26, 27, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, 39, + -1, -1, 54, -1, -1, -1, -1, -1, -1, 61, + 62, 63, 64, 53, -1, 55, 56, 57, 58, 59, + 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, + 70, 71, 84, 85, 86, 87, 88, 89, 90, 79, + -1, -1, -1, 95, 96, 97, 98, -1, -1, 101, + -1, 91, 92, 93, 1, -1, -1, -1, -1, 99, + 100, 63, 64, 103, 11, -1, 13, 14, 15, 16, + 17, 18, 19, -1, -1, -1, 23, 24, 25, 26, + 27, -1, 29, 30, 31, 32, 33, 34, 90, -1, + -1, -1, 39, 95, 96, 97, 98, -1, -1, 101, + -1, -1, -1, -1, -1, -1, 53, -1, 55, 56, + 57, 58, 59, 60, -1, -1, 0, -1, 65, 66, + 67, 68, 69, 70, 71, 9, -1, 11, 12, -1, + -1, -1, 79, -1, -1, -1, 20, -1, -1, -1, + -1, -1, -1, -1, 91, 92, 93, 61, 62, 63, + 64, -1, 99, 100, -1, 102, 103, -1, 42, 43, + 44, 45, -1, -1, -1, 49, -1, 51, -1, -1, + 54, -1, -1, 87, 88, 89, 90, 61, 62, 63, + 64, 95, 96, 97, 98, -1, -1, 101, -1, -1, + -1, -1, 76, 77, 78, 0, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 12, -1, -1, + -1, 95, 96, 97, 98, 20, -1, 101, 102, -1, + -1, -1, -1, -1, -1, -1, 61, 62, 63, 64, + -1, -1, -1, -1, -1, -1, -1, 42, 43, 44, + 45, -1, -1, -1, 49, -1, 51, -1, -1, 54, + -1, -1, -1, 88, 89, 90, 61, 62, 63, 64, + 95, 96, 97, 98, -1, -1, 101, -1, -1, -1, + -1, 76, 77, 78, -1, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, + 95, 96, 97, 98, -1, -1, 101, 102, 9, -1, 11, -1, 13, 14, 15, 16, 17, 18, 19, -1, - -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, - 31, 32, 33, 34, 90, -1, -1, -1, 39, 95, - 96, 97, 98, -1, -1, 101, -1, -1, -1, -1, + -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, -1, -1, -1, -1, 39, -1, + -1, -1, -1, -1, -1, 61, 62, 63, 64, -1, -1, -1, 53, -1, 55, 56, 57, 58, 59, 60, - -1, -1, 0, -1, 65, 66, 67, 68, 69, 70, - 71, 9, -1, 11, 12, -1, -1, -1, 79, -1, - -1, -1, 20, -1, -1, -1, -1, -1, -1, -1, - 91, 92, 93, 61, 62, 63, 64, -1, 99, 100, - -1, 102, 103, -1, 42, 43, 44, 45, -1, -1, - -1, 49, -1, 51, -1, -1, 54, -1, 86, 87, - 88, 89, 90, 61, 62, 63, 64, 95, 96, 97, - 98, -1, -1, 101, -1, -1, -1, -1, 76, 77, - 78, 0, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 12, -1, -1, -1, 95, 96, 97, - 98, 20, -1, 101, 102, -1, -1, -1, -1, -1, - -1, -1, 61, 62, 63, 64, -1, -1, -1, -1, - -1, -1, -1, 42, 43, 44, 45, -1, -1, -1, - 49, -1, 51, -1, -1, 54, -1, -1, 87, 88, - 89, 90, 61, 62, 63, 64, 95, 96, 97, 98, - -1, -1, 101, -1, -1, -1, -1, 76, 77, 78, - -1, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, 95, 96, 97, 98, - -1, -1, 101, 102, 9, -1, 11, -1, 13, 14, + -1, -1, -1, -1, 65, 66, 67, 68, 69, 70, + 71, -1, -1, 89, 90, -1, -1, -1, 79, 95, + 96, 97, 98, -1, -1, 101, -1, -1, -1, -1, + 91, 92, 93, -1, -1, -1, -1, -1, 99, 100, + -1, 9, 103, 11, -1, 13, 14, 15, 16, 17, + 18, 19, -1, -1, -1, 23, 24, 25, 26, 27, + -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, + -1, 39, -1, -1, -1, -1, -1, -1, 61, 62, + 63, 64, -1, -1, -1, 53, -1, 55, 56, 57, + 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, + 68, 69, 70, 71, -1, -1, 89, 90, -1, -1, + -1, 79, 95, 96, 97, 98, -1, -1, 101, -1, + -1, -1, -1, 91, 92, 93, -1, -1, -1, -1, + -1, 99, 100, -1, -1, 103, 11, 12, 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, - -1, 61, 62, 63, 64, -1, -1, -1, 53, -1, + -1, 61, -1, 63, 64, -1, -1, -1, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, 89, 90, -1, -1, -1, 79, 95, 96, 97, 98, -1, -1, 101, -1, -1, -1, -1, 91, 92, 93, -1, - -1, -1, -1, -1, 99, 100, -1, 9, 103, 11, - -1, 13, 14, 15, 16, 17, 18, 19, -1, -1, - -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, - 32, 33, 34, -1, -1, -1, -1, 39, -1, -1, - -1, -1, -1, -1, 61, -1, 63, 64, -1, -1, - -1, 53, -1, 55, 56, 57, 58, 59, 60, -1, - -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, - -1, -1, 89, 90, -1, -1, -1, 79, 95, 96, - 97, 98, -1, -1, 101, -1, -1, -1, -1, 91, - 92, 93, -1, -1, -1, -1, -1, 99, 100, -1, - -1, 103, 11, 12, 13, 14, 15, 16, 17, 18, - 19, -1, -1, -1, 23, 24, 25, 26, 27, -1, - 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, - 39, -1, -1, -1, -1, -1, -1, -1, -1, 63, - 64, -1, -1, -1, 53, -1, 55, 56, 57, 58, - 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, - 69, 70, 71, -1, -1, 89, 90, -1, -1, -1, - 79, 95, 96, 97, 98, -1, -1, 101, -1, -1, - -1, -1, 91, 92, 93, -1, -1, -1, -1, -1, - 99, 100, -1, 11, 103, 13, 14, 15, 16, 17, - 18, 19, 20, -1, -1, 23, 24, 25, 26, 27, - -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, - -1, 39, 42, 43, 44, 45, -1, -1, -1, 49, - -1, 51, -1, -1, -1, 53, -1, 55, 56, 57, - 58, 59, 60, -1, -1, -1, -1, 65, 66, 67, - 68, 69, 70, 71, -1, -1, 76, 77, 78, -1, - -1, 79, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 91, 92, 93, -1, -1, -1, -1, - -1, 99, 100, -1, 11, 103, 13, 14, 15, 16, + -1, -1, -1, -1, 99, 100, -1, 11, 103, 13, + 14, 15, 16, 17, 18, 19, 20, -1, -1, 23, + 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, + 34, -1, -1, -1, -1, 39, -1, -1, -1, -1, + -1, -1, -1, -1, 63, 64, -1, -1, -1, 53, + -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, + -1, 65, 66, 67, 68, 69, 70, 71, -1, -1, + 89, 90, -1, -1, -1, 79, 95, 96, 97, 98, + -1, -1, 101, -1, -1, -1, -1, 91, 92, 93, + -1, -1, -1, -1, -1, 99, 100, -1, 11, 103, + 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, + 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, + 33, 34, -1, -1, -1, -1, 39, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, + -1, -1, 65, 66, 67, 68, 69, 70, 71, -1, + -1, -1, -1, -1, -1, -1, 79, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 91, 92, + 93, -1, -1, -1, -1, -1, 99, 100, -1, 102, + 103, 11, -1, 13, 14, 15, 16, 17, 18, 19, + -1, -1, -1, 23, 24, 25, 26, 27, -1, 29, + 30, 31, 32, 33, 34, -1, -1, -1, -1, 39, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 53, -1, 55, 56, 57, 58, 59, + 60, -1, -1, -1, -1, 65, 66, 67, 68, 69, + 70, 71, -1, -1, -1, -1, -1, -1, -1, 79, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 91, 92, 93, -1, -1, -1, -1, -1, 99, + 100, -1, 102, 103, 11, -1, 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, -1, @@ -967,35 +1016,17 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, 55, 56, 57, 58, 59, 60, -1, -1, -1, -1, - 65, 66, 67, 68, 69, 70, 71, -1, -1, -1, - -1, -1, -1, -1, 79, -1, -1, -1, -1, -1, + 65, 66, 67, 68, 69, 70, 71, -1, -1, 54, + -1, -1, -1, -1, 79, -1, 61, 62, 63, 64, -1, -1, -1, -1, -1, -1, 91, 92, 93, -1, - -1, -1, -1, -1, 99, 100, -1, 102, 103, 11, - -1, 13, 14, 15, 16, 17, 18, 19, -1, -1, - -1, 23, 24, 25, 26, 27, -1, 29, 30, 31, - 32, 33, 34, -1, -1, -1, -1, 39, -1, -1, + -1, -1, -1, -1, 99, 100, 81, 82, 103, 84, + 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, + 95, 96, 97, 98, 54, -1, 101, -1, -1, -1, + -1, 61, 62, 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 53, -1, 55, 56, 57, 58, 59, 60, -1, - -1, -1, -1, 65, 66, 67, 68, 69, 70, 71, - -1, -1, -1, -1, -1, -1, -1, 79, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 91, - 92, 93, -1, -1, -1, -1, -1, 99, 100, -1, - 102, 103, 11, -1, 13, 14, 15, 16, 17, 18, - 19, -1, -1, -1, 23, 24, 25, 26, 27, -1, - 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, - 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 53, -1, 55, 56, 57, 58, - 59, 60, -1, -1, -1, -1, 65, 66, 67, 68, - 69, 70, 71, -1, -1, 54, -1, -1, -1, -1, - 79, -1, 61, 62, 63, 64, -1, -1, -1, -1, - -1, -1, 91, 92, 93, -1, -1, -1, -1, -1, - 99, 100, 81, 82, 103, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, 95, 96, 97, 98, - 54, -1, 101, -1, -1, -1, -1, 61, 62, 63, - 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, - 84, 85, 86, 87, 88, 89, 90, -1, -1, -1, - -1, 95, 96, 97, 98, -1, -1, 101 + -1, -1, 82, -1, 84, 85, 86, 87, 88, 89, + 90, -1, -1, -1, -1, 95, 96, 97, 98, -1, + -1, 101 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1007,48 +1038,49 @@ static const yytype_uint8 yystos[] = 16, 17, 18, 19, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 39, 53, 55, 56, 57, 58, 59, 60, 65, 66, 67, 68, 69, 70, 71, - 79, 91, 92, 93, 99, 100, 103, 147, 148, 149, - 152, 153, 154, 155, 156, 157, 159, 162, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 9, 113, 1, + 79, 91, 92, 93, 99, 100, 103, 150, 151, 152, + 155, 156, 157, 158, 159, 160, 162, 165, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 9, 113, 1, 20, 35, 37, 38, 40, 41, 42, 43, 44, 45, - 49, 50, 51, 52, 104, 113, 122, 128, 147, 36, - 120, 121, 122, 118, 118, 12, 147, 157, 157, 23, - 28, 113, 165, 173, 173, 173, 173, 173, 173, 173, - 158, 11, 103, 157, 140, 140, 157, 103, 103, 103, - 113, 157, 23, 148, 161, 165, 173, 173, 113, 157, - 20, 147, 23, 28, 142, 157, 103, 160, 165, 166, - 167, 157, 148, 157, 157, 157, 157, 157, 102, 147, + 49, 50, 51, 52, 104, 113, 122, 128, 150, 36, + 120, 121, 122, 118, 118, 12, 150, 160, 160, 23, + 28, 113, 168, 176, 176, 176, 176, 176, 176, 176, + 161, 11, 103, 160, 140, 140, 160, 103, 103, 103, + 113, 160, 23, 151, 164, 168, 176, 176, 113, 160, + 20, 150, 23, 28, 142, 160, 103, 163, 168, 169, + 170, 160, 151, 160, 160, 160, 160, 160, 102, 150, 76, 77, 78, 80, 9, 11, 103, 54, 61, 62, 63, 64, 81, 82, 84, 85, 86, 87, 88, 89, 90, 95, 96, 97, 98, 101, 103, 9, 11, 9, 11, 9, 11, 9, 115, 141, 142, 23, 139, 103, - 103, 103, 103, 70, 103, 165, 103, 103, 113, 48, + 103, 103, 103, 70, 103, 168, 103, 103, 113, 48, 130, 20, 42, 43, 44, 45, 49, 51, 121, 122, - 120, 12, 161, 103, 103, 147, 102, 113, 26, 143, - 102, 102, 147, 162, 173, 148, 10, 20, 161, 102, - 147, 72, 145, 11, 102, 147, 147, 147, 157, 147, - 147, 102, 147, 157, 157, 157, 157, 157, 157, 157, - 157, 157, 157, 157, 157, 157, 157, 157, 9, 11, - 15, 16, 17, 18, 19, 24, 65, 103, 151, 165, - 102, 147, 147, 147, 147, 147, 147, 147, 147, 118, + 120, 12, 164, 103, 103, 150, 102, 113, 26, 143, + 102, 102, 150, 165, 176, 151, 10, 20, 164, 102, + 150, 72, 145, 11, 102, 150, 150, 150, 160, 150, + 150, 102, 150, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 9, 11, + 15, 16, 17, 18, 19, 24, 65, 103, 154, 168, + 102, 150, 150, 150, 150, 150, 150, 150, 150, 118, 23, 138, 139, 23, 124, 115, 115, 115, 115, 115, - 115, 103, 115, 115, 113, 147, 134, 147, 147, 147, - 147, 147, 162, 148, 12, 150, 72, 144, 102, 102, - 147, 10, 102, 26, 147, 11, 20, 12, 102, 83, - 147, 147, 18, 18, 18, 18, 18, 18, 102, 147, + 115, 103, 115, 115, 113, 150, 134, 150, 150, 150, + 150, 150, 165, 151, 12, 153, 72, 144, 102, 102, + 150, 10, 102, 26, 150, 11, 20, 12, 102, 83, + 150, 150, 18, 18, 18, 18, 18, 18, 102, 150, 103, 102, 20, 12, 20, 12, 20, 12, 20, 10, - 21, 114, 123, 9, 20, 23, 133, 147, 134, 135, - 147, 134, 137, 163, 165, 128, 132, 135, 136, 147, - 115, 135, 135, 102, 102, 161, 26, 113, 102, 12, - 147, 10, 157, 20, 12, 102, 162, 10, 10, 10, - 10, 115, 143, 115, 23, 102, 102, 102, 102, 103, - 102, 20, 135, 102, 102, 12, 10, 102, 20, 144, - 125, 161, 131, 131, 9, 116, 116, 135, 116, 133, - 102, 116, 116, 74, 20, 113, 146, 118, 20, 116, - 116, 117, 46, 47, 129, 129, 102, 130, 20, 116, - 119, 10, 130, 130, 118, 116, 103, 116, 131, 130, - 20, 26, 126, 10, 135, 130, 136, 22, 73, 127, - 102, 102, 118, 116, 116, 74, 129 + 21, 114, 123, 9, 20, 23, 133, 150, 134, 135, + 150, 134, 137, 166, 168, 128, 132, 135, 136, 150, + 115, 135, 135, 102, 102, 164, 26, 115, 148, 102, + 12, 150, 10, 160, 20, 12, 102, 165, 10, 10, + 10, 10, 115, 143, 115, 23, 102, 102, 102, 102, + 103, 102, 20, 135, 102, 102, 103, 146, 12, 10, + 102, 20, 144, 125, 164, 131, 131, 9, 116, 116, + 135, 116, 133, 102, 116, 116, 147, 9, 74, 20, + 148, 149, 118, 20, 116, 116, 117, 46, 47, 129, + 129, 102, 130, 20, 116, 102, 118, 119, 10, 130, + 130, 118, 116, 103, 116, 131, 130, 10, 20, 26, + 126, 10, 135, 130, 136, 22, 73, 127, 102, 102, + 118, 116, 116, 74, 129 }; typedef enum { @@ -1079,14 +1111,14 @@ static const toketypes yy_type_tab[] = toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_ival, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, - toketype_opval + toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_ival, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_opval, toketype_opval, toketype_ival, toketype_opval, toketype_opval, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, + toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval }; /* Generated from: - * 911fbbcab275e0f9645397ee5b80a7c2384e6b24f793c15e6d6e918ebfd4e384 perly.y + * bb8245a1a537b2afb2445b3973f63b210f9ec346a1955071aef7d05ba97196ae perly.y * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl * ex: set ro: */ diff --git a/perly.y b/perly.y index 2d8b599..1047913 100644 --- a/perly.y +++ b/perly.y @@ -97,9 +97,9 @@ %type sliceme kvslice gelem %type listexpr nexpr texpr iexpr mexpr mnexpr miexpr %type optlistexpr optexpr indirob listop method -%type formname subname proto subbody cont my_scalar formblock +%type formname subname proto optsubbody cont my_scalar formblock %type subattrlist myattrlist myattrterm myterm -%type termbinop termunop anonymous termdo +%type realsubbody subsignature termbinop termunop anonymous termdo %type formstmtseq formline formarg %nonassoc PREC_LOW @@ -339,7 +339,7 @@ barestmt: PLUGSTMT PL_parser->in_my = 0; PL_parser->in_my_stash = NULL; } - proto subattrlist subbody + proto subattrlist optsubbody { SvREFCNT_inc_simple_void(PL_compcv); #ifdef MAD @@ -728,8 +728,40 @@ myattrlist: COLONATTR THING } ; -/* Subroutine body - either null or a block */ -subbody : block { $$ = $1; } +/* Optional subroutine signature */ +subsignature: /* NULL */ { $$ = (OP*)NULL; } + | '(' + { + if (!FEATURE_SIGNATURES_IS_ENABLED) + Perl_croak(aTHX_ "Experimental " + "subroutine signatures not enabled"); + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__SIGNATURES), + "The signatures feature is experimental"); + $$ = parse_subsignature(); + } + ')' + { + $$ = op_append_list(OP_LINESEQ, $2, + newSTATEOP(0, NULL, sawparens(newNULLLIST()))); + PL_parser->expect = XBLOCK; + } + ; + +/* Subroutine body - block with optional signature */ +realsubbody: remember subsignature '{' stmtseq '}' + { + if (PL_parser->copline > (line_t)IVAL($3)) + PL_parser->copline = (line_t)IVAL($3); + $$ = block_end($1, + op_append_list(OP_LINESEQ, $2, $4)); + TOKEN_GETMAD($3,$$,'{'); + TOKEN_GETMAD($5,$$,'}'); + } + ; + +/* Optional subroutine body, for named subroutine declaration */ +optsubbody: realsubbody { $$ = $1; } | ';' { $$ = IF_MAD( newOP(OP_NULL,0), (OP*)NULL @@ -1101,7 +1133,7 @@ anonymous: '[' expr ']' TOKEN_GETMAD($2,$$,';'); TOKEN_GETMAD($3,$$,'}'); } - | ANONSUB startanonsub proto subattrlist block %prec '(' + | ANONSUB startanonsub proto subattrlist realsubbody %prec '(' { SvREFCNT_inc_simple_void(PL_compcv); $$ = newANONATTRSUB($2, $3, $4, $5); TOKEN_GETMAD($1,$$,'o'); diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 98eb026..98b1268 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -1934,6 +1934,14 @@ L. use feature 'lexical_subs'; my sub foo { ... } +=item Experimental subroutine signatures not enabled + +(F) To use subroutine signatures, you must first enable them: + + no warnings "experimental:signatures"; + use feature "signatures"; + sub foo ($left, $right) { ... } + =item Explicit blessing to '' (assuming package main) (W misc) You are blessing a reference to a zero length string. This has @@ -2230,6 +2238,9 @@ to your Perl administrator. (W illegalproto) An illegal character was found in a prototype declaration. Legal characters in prototypes are $, @, %, *, ;, [, ], &, \, and +. +Perhaps you were trying to write a subroutine signature but didn't enable +that feature first (C), so your signature was +instead interpreted as a bad prototype. =item Illegal declaration of anonymous subroutine @@ -2864,6 +2875,9 @@ appear if components are not found, or are too long. See syntax of function prototypes is given a brief compile-time check for obvious errors like invalid characters. A more rigorous check is run when the function is called. +Perhaps the function's author was trying to write a subroutine signature +but didn't enable that feature first (C), +so the signature was instead interpreted as a bad prototype. =item Malformed UTF-8 character (%s) @@ -2913,6 +2927,15 @@ rules and perl was unable to guess how to make more progress. (F) Perl thought it was reading UTF-16 encoded character data but while doing it Perl met a malformed Unicode surrogate. +=item Mandatory parameter follows optional parameter + +(F) In a subroutine signature, you wrote something like "$a = undef, +$b", making an earlier parameter optional and a later one mandatory. +Parameters are filled from left to right, so it's impossible for the +caller to omit an earlier one and pass a later one. If you want to act +as if the parameters are filled from right to left, declare the rightmost +optional and then shuffle the parameters around in the subroutine's body. + =item Matched non-Unicode code point 0x%X against Unicode property; may not be portable @@ -3627,6 +3650,15 @@ the braces. (4294967295) and therefore non-portable between systems. See L for more on portability concerns. +=item Odd name/value argument for subroutine + +(F) A subroutine using a slurpy hash parameter in its signature +received an odd number of arguments to populate the hash. It requires +the arguments to be paired, with the same number of keys as values. +The caller of the subroutine is presumably at fault. Inconveniently, +this error will be reported at the location of the subroutine, not that +of the caller. + =item Odd number of arguments for overload::constant (W overload) The call to overload::constant contained an odd number of @@ -3737,6 +3769,13 @@ use an operator, but this is highly likely to be incorrect. For example, if you say "*foo *foo" it will be interpreted as if you said "*foo * 'foo'". +=item Optional parameter lacks default expression + +(F) In a subroutine signature, you wrote something like "$a =", making a +named optional parameter without a default value. A nameless optional +parameter is permitted to have no default value, but a named one must +have a specific default. You probably want "$a = undef". + =item "our" variable %s redeclared (W misc) You seem to have already declared the same global once before @@ -4993,6 +5032,12 @@ a compilation error, but could not be found, so it was leaked instead. it can reliably handle and C probably slept for less time than requested. +=item Slurpy parameter not last + +(F) In a subroutine signature, you put something after a slurpy (array or +hash) parameter. The slurpy parameter takes all the available arguments, +so there can't be any left to fill later parameters. + =item Smart matching a non-overloaded object breaks encapsulation (F) You should not use the C<~~> operator on an object that does not @@ -5342,6 +5387,18 @@ warning: no warnings "experimental::regex_sets"; +=item The signatures feature is experimental + +(S experimental::signatures) This warning is emitted if you unwrap a +subroutine's arguments using a signature. Simply suppress the warning +if you want to use the feature, but know that in doing so you are taking +the risk of using an experimental feature which may change or be removed +in a future Perl version: + + no warnings "experimental::signatures"; + use feature "signatures"; + sub foo ($left, $right) { ... } + =item The stat preceding %s wasn't an lstat (F) It makes no sense to test the current stat buffer for symbolic @@ -5410,6 +5467,13 @@ See L. (F) There has to be at least one argument to syscall() to specify the system call to call, silly dilly. +=item Too few arguments for subroutine + +(F) A subroutine using a signature received fewer arguments than required +by the signature. The caller of the subroutine is presumably at fault. +Inconveniently, this error will be reported at the location of the +subroutine, not that of the caller. + =item Too late for "-%s" option (X) The #! line (or local equivalent) in a Perl script contains the @@ -5440,6 +5504,13 @@ BEGIN block. (F) The function requires fewer arguments than you specified. +=item Too many arguments for subroutine + +(F) A subroutine using a signature received more arguments than required +by the signature. The caller of the subroutine is presumably at fault. +Inconveniently, this error will be reported at the location of the +subroutine, not that of the caller. + =item Too many )'s (A) You've accidentally run your script through B instead of Perl. diff --git a/pod/perllexwarn.pod b/pod/perllexwarn.pod index 229a357..de98020 100644 --- a/pod/perllexwarn.pod +++ b/pod/perllexwarn.pod @@ -239,6 +239,8 @@ will be lost. | | | +- experimental::regex_sets | | + | +- experimental::signatures + | | | +- experimental::smartmatch | +- glob diff --git a/pod/perlsub.pod b/pod/perlsub.pod index 2a9e0a8..bf08262 100644 --- a/pod/perlsub.pod +++ b/pod/perlsub.pod @@ -15,16 +15,20 @@ X X sub NAME BLOCK # A declaration and a definition. sub NAME(PROTO) BLOCK # ditto, but with prototypes + sub NAME SIG BLOCK # with signature sub NAME : ATTRS BLOCK # with attributes sub NAME(PROTO) : ATTRS BLOCK # with prototypes and attributes + sub NAME : ATTRS SIG BLOCK # with attributes and signature To define an anonymous subroutine at runtime: X $subref = sub BLOCK; # no proto $subref = sub (PROTO) BLOCK; # with proto + $subref = sub SIG BLOCK; # with signature $subref = sub : ATTRS BLOCK; # with attributes $subref = sub (PROTO) : ATTRS BLOCK; # with proto and attributes + $subref = sub : ATTRS SIG BLOCK; # with attribs and signature To import subroutines: X @@ -59,7 +63,9 @@ function without an explicit return statement is called a subroutine, but there's really no difference from Perl's perspective.) X X -Any arguments passed in show up in the array C<@_>. Therefore, if +Any arguments passed in show up in the array C<@_>. +(They may also show up in lexical variables introduced by a signature; +see L below.) Therefore, if you called a function with two arguments, those would be stored in C<$_[0]> and C<$_[1]>. The array C<@_> is a local array, but its elements are aliases for the actual scalar parameters. In particular, @@ -88,6 +94,7 @@ like a C or a C, the returned value is unspecified. The empty sub returns the empty list. X X X +Aside from an experimental facility (see L below), Perl does not have named formal parameters. In practice all you do is assign to a C list of these. Variables that aren't declared to be private are global variables. For gory details @@ -296,6 +303,200 @@ are not so much subroutines as named special code blocks, of which you can have more than one in a package, and which you can B call explicitly. See L +=head2 Signatures + +B: Subroutine signatures are experimental. The feature may be +modified or removed in future versions of Perl. + +Perl has an experimental facility to allow a subroutine's formal +parameters to be introduced by special syntax, separate from the +procedural code of the subroutine body. The formal parameter list +is known as a I. The facility must be enabled first by a +pragmatic declaration, C, and it will produce +a warning unless the "experimental::signatures" warnings category is +disabled. + +The signature is part of a subroutine's body. Normally the body of a +subroutine is simply a braced block of code. When using a signature, +the signature is a parenthesised list that goes immediately before +the braced block. The signature declares lexical variables that are +in scope for the block. When the subroutine is called, the signature +takes control first. It populates the signature variables from the +list of arguments that were passed. If the argument list doesn't meet +the requirements of the signature, then it will throw an exception. +When the signature processing is complete, control passes to the block. + +Positional parameters are handled by simply naming scalar variables in +the signature. For example, + + sub foo ($left, $right) { + return $left + $right; + } + +takes two positional parameters, which must be filled at runtime by +two arguments. By default the parameters are mandatory, and it is +not permitted to pass more arguments than expected. So the above is +equivalent to + + sub foo { + die "Too many arguments for subroutine" unless @_ <= 2; + die "Too few arguments for subroutine" unless @_ >= 2; + my $left = $_[0]; + my $right = $_[1]; + return $left + $right; + } + +An argument can be ignored by omitting the main part of the name from +a parameter declaration, leaving just a bare C<$> sigil. For example, + + sub foo ($first, $, $third) { + return "first=$first, third=$third"; + } + +Although the ignored argument doesn't go into a variable, it is still +mandatory for the caller to pass it. + +A positional parameter is made optional by giving a default value, +separated from the parameter name by C<=>: + + sub foo ($left, $right = 0) { + return $left + $right; + } + +The above subroutine may be called with either one or two arguments. +The default value expression is evaluated when the subroutine is called, +so it may provide different default values for different calls. It is +only evaluated if the argument was actually omitted from the call. +For example, + + my $auto_id = 0; + sub foo ($thing, $id = $auto_id++) { + print "$thing has ID $id"; + } + +automatically assigns distinct sequential IDs to things for which no +ID was supplied by the caller. A default value expression may also +refer to parameters earlier in the signature, making the default for +one parameter vary according to the earlier parameters. For example, + + sub foo ($first_name, $surname, $nickname = $first_name) { + print "$first_name $surname is known as \"$nickname\""; + } + +An optional parameter can be nameless just like a mandatory parameter. +For example, + + sub foo ($thing, $ = 1) { + print $thing; + } + +The parameter's default value will still be evaluated if the corresponding +argument isn't supplied, even though the value won't be stored anywhere. +This is in case evaluating it has important side effects. However, it +will be evaluated in void context, so if it doesn't have side effects +and is not trivial it will generate a warning if the "void" warning +category is enabled. If a nameless optional parameter's default value +is not important, it may be omitted just as the parameter's name was: + + sub foo ($thing, $=) { + print $thing; + } + +Optional positional parameters must come after all mandatory positional +parameters. (If there are no mandatory positional parameters then an +optional positional parameters can be the first thing in the signature.) +If there are multiple optional positional parameters and not enough +arguments are supplied to fill them all, they will be filled from left +to right. + +After positional parameters, additional arguments may be captured in a +slurpy parameter. The simplest form of this is just an array variable: + + sub foo ($filter, @inputs) { + print $filter->($_) foreach @inputs; + } + +With a slurpy parameter in the signature, there is no upper limit on how +many arguments may be passed. A slurpy array parameter may be nameless +just like a positional parameter, in which case its only effect is to +turn off the argument limit that would otherwise apply: + + sub foo ($thing, @) { + print $thing; + } + +A slurpy parameter may instead be a hash, in which case the arguments +available to it are interpreted as alternating keys and values. +There must be as many keys as values: if there is an odd argument then +an exception will be thrown. Keys will be stringified, and if there are +duplicates then the later instance takes precedence over the earlier, +as with standard hash construction. + + sub foo ($filter, %inputs) { + print $filter->($_, $inputs{$_}) foreach sort keys %inputs; + } + +A slurpy hash parameter may be nameless just like other kinds of +parameter. It still insists that the number of arguments available to +it be even, even though they're not being put into a variable. + + sub foo ($thing, %) { + print $thing; + } + +A slurpy parameter, either array or hash, must be the last thing in the +signature. It may follow mandatory and optional positional parameters; +it may also be the only thing in the signature. Slurpy parameters cannot +have default values: if no arguments are supplied for them then you get +an empty array or empty hash. + +A signature may be entirely empty, in which case all it does is check +that the caller passed no arguments: + + sub foo () { + return 123; + } + +When using a signature, the arguments are still available in the special +array variable C<@_>, in addition to the lexical variables of the +signature. There is a difference between the two ways of accessing the +arguments: C<@_> I the arguments, but the signature variables +get I of the arguments. So writing to a signature variable +only changes that variable, and has no effect on the caller's variables, +but writing to an element of C<@_> modifies whatever the caller used to +supply that argument. + +There is a potential syntactic ambiguity between signatures and prototypes +(see L), because both start with an opening parenthesis and +both can appear in some of the same places, such as just after the name +in a subroutine declaration. For historical reasons, when signatures +are not enabled, any opening parenthesis in such a context will trigger +very forgiving prototype parsing. Most signatures will be interpreted +as prototypes in those circumstances, but won't be valid prototypes. +(A valid prototype cannot contain any alphabetic character.) This will +lead to somewhat confusing error messages. + +To avoid ambiguity, when signatures are enabled the special syntax +for prototypes is disabled. There is no attempt to guess whether a +parenthesised group was intended to be a prototype or a signature. +To give a subroutine a prototype under these circumstances, use a +L. For example, + + sub foo :prototype($) { $_[0] } + +It is entirely possible for a subroutine to have both a prototype and +a signature. They do different jobs: the prototype affects compilation +of calls to the subroutine, and the signature puts argument values into +lexical variables at runtime. You can therefore write + + sub foo :prototype($$) ($left, $right) { + return $left + $right; + } + +The prototype attribute, and any other attributes, must come before +the signature. The signature always immediately precedes the block of +the subroutine's body. + =head2 Private Variables via my() X X X X X X X @@ -1191,11 +1392,19 @@ X X Perl supports a very limited kind of compile-time argument checking using function prototyping. This can be declared in either the PROTO section or with a L. -If you declare +If you declare either of sub mypush (+@) + sub mypush :prototype(+@) + +then C takes arguments exactly like C does. + +If subroutine signatures are enabled (see L), then +the shorter PROTO syntax is unavailable, because it would clash with +signatures. In that case, a prototype can only be declared in the form +of an attribute. -then C takes arguments exactly like C does. The +The function declaration must be visible at compile time. The prototype affects only interpretation of new-style calls to the function, where new-style is defined as not using the C<&> character. In diff --git a/proto.h b/proto.h index c4c54d1..17941ca 100644 --- a/proto.h +++ b/proto.h @@ -3180,6 +3180,9 @@ PERL_CALLCONV OP* Perl_parse_fullstmt(pTHX_ U32 flags); PERL_CALLCONV SV* Perl_parse_label(pTHX_ U32 flags); PERL_CALLCONV OP* Perl_parse_listexpr(pTHX_ U32 flags); PERL_CALLCONV OP* Perl_parse_stmtseq(pTHX_ U32 flags); +PERL_CALLCONV OP * Perl_parse_subsignature(pTHX) + __attribute__warn_unused_result__; + PERL_CALLCONV OP* Perl_parse_termexpr(pTHX_ U32 flags); PERL_CALLCONV U32 Perl_parse_unicode_opts(pTHX_ const char **popt) __attribute__nonnull__(pTHX_1); diff --git a/regen/feature.pl b/regen/feature.pl index d43abc0..a46ebbc 100755 --- a/regen/feature.pl +++ b/regen/feature.pl @@ -34,6 +34,7 @@ my %feature = ( unicode_eval => 'unieval', unicode_strings => 'unicode', fc => 'fc', + signatures => 'signatures', ); # NOTE: If a feature is ever enabled in a non-contiguous range of Perl @@ -360,7 +361,7 @@ read_only_bottom_close_and_rename($h); __END__ package feature; -our $VERSION = '1.34'; +our $VERSION = '1.35'; FEATURES @@ -560,6 +561,26 @@ and C syntax. See L for details. This feature is available from Perl 5.18 onwards. +=head2 The 'signatures' feature + +B: This feature is still experimental and the implementation may +change in future versions of Perl. For this reason, Perl will +warn when you use the feature, unless you have explicitly disabled the +warning: + + no warnings "experimental::signatures"; + +This enables unpacking of subroutine arguments into lexical variables +by syntax such as + + sub foo ($left, $right) { + return $left + $right; + } + +See L for details. + +This feature is available from Perl 5.20 onwards. + =head1 FEATURE BUNDLES It's possible to load multiple features together, using diff --git a/regen/warnings.pl b/regen/warnings.pl index 1b34c04..29033ab 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -101,6 +101,8 @@ my $tree = { [ 5.019, DEFAULT_ON ], 'experimental::autoderef' => [ 5.019, DEFAULT_ON ], + 'experimental::signatures' => + [ 5.019, DEFAULT_ON ], }], #'default' => [ 5.008, DEFAULT_ON ], diff --git a/t/lib/warnings/op b/t/lib/warnings/op index 5888806..bca2818 100644 --- a/t/lib/warnings/op +++ b/t/lib/warnings/op @@ -1904,3 +1904,20 @@ sub dont_warn_44 { redo ($a or $b) while(1); } sub dont_warn_45 { redo ($a and $b) while(1); } sub dont_warn_46 { redo ($a xor $b) while(1); } EXPECT +######## +use feature "signatures"; +sub aaa { 2 } +sub bbb ($a) { 4 } +$aaa = sub { 2 }; +$bbb = sub ($a) { 4 }; +EXPECT +The signatures feature is experimental at - line 3. +The signatures feature is experimental at - line 5. +######## +no warnings "experimental::signatures"; +use feature "signatures"; +sub aaa { 2 } +sub bbb ($a) { 4 } +$aaa = sub { 2 }; +$bbb = sub ($a) { 4 }; +EXPECT diff --git a/t/op/lexsub.t b/t/op/lexsub.t index 8c71da0..d5fdcb1 100644 --- a/t/op/lexsub.t +++ b/t/op/lexsub.t @@ -307,7 +307,7 @@ sub make_anon_with_state_sub{ r(1); } like runperl( - switches => [ '-Mfeature=:all' ], + switches => [ '-Mfeature=lexical_subs,state' ], prog => 'state sub a { foo ref } a()', stderr => 1 ), @@ -600,7 +600,7 @@ not_lexical11(); is $w, undef, 'no double free from constant my subs'; } like runperl( - switches => [ '-Mfeature=:all' ], + switches => [ '-Mfeature=lexical_subs,state' ], prog => 'my sub a { foo ref } a()', stderr => 1 ), @@ -676,7 +676,7 @@ eval 'sub not_lexical7 { my @x }'; } like runperl( - switches => [ '-Mfeature=:all', '-Mwarnings=FATAL,all', '-M-warnings=experimental::lexical_subs' ], + switches => [ '-Mfeature=lexical_subs,state', '-Mwarnings=FATAL,all', '-M-warnings=experimental::lexical_subs' ], prog => 'my sub foo; sub foo { foo } foo', stderr => 1 ), @@ -684,7 +684,7 @@ like runperl( 'deep recursion warnings for lexical subs do not crash'; like runperl( - switches => [ '-Mfeature=:all', '-Mwarnings=FATAL,all', '-M-warnings=experimental::lexical_subs' ], + switches => [ '-Mfeature=lexical_subs,state', '-Mwarnings=FATAL,all', '-M-warnings=experimental::lexical_subs' ], prog => 'my sub foo() { 42 } undef &foo', stderr => 1 ), diff --git a/t/op/signatures.t b/t/op/signatures.t new file mode 100644 index 0000000..d0d53c3 --- /dev/null +++ b/t/op/signatures.t @@ -0,0 +1,1092 @@ +#!perl + +BEGIN { + chdir 't'; + @INC = '../lib'; + require './test.pl'; +} +plan 768; + +eval "#line 8 foo\nsub t004 :method (\$a) { }"; +is $@, "Experimental subroutine signatures not enabled at foo line 8\.\n", + "error when not enabled"; + +eval "#line 8 foo\nsub t005 (\$) (\$a) { }"; +is $@, "Experimental subroutine signatures not enabled at foo line 8\.\n", + "error when not enabled"; + +no warnings "illegalproto"; + +our $a = 123; +our $z; + +sub t000 ($a) { $a || "z" } +is prototype(\&t000), "\$a", "(\$a) interpreted as protoype when not enabled"; +is &t000(456), 123, "(\$a) not signature when not enabled"; +is $a, 123; + +no warnings "experimental::signatures"; +use feature "signatures"; + +sub t001 { $a || "z" } +is prototype(\&t001), undef; +is eval("t001()"), 123; +is eval("t001(456)"), 123; +is eval("t001(456, 789)"), 123; +is $a, 123; + +sub t002 () { $a || "z" } +is prototype(\&t002), undef; +is eval("t002()"), 123; +is eval("t002(456)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t002(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t003 ( ) { $a || "z" } +is prototype(\&t003), undef; +is eval("t003()"), 123; +is eval("t003(456)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t003(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t006 ($a) { $a || "z" } +is prototype(\&t006), undef; +is eval("t006()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t006(0)"), "z"; +is eval("t006(456)"), 456; +is eval("t006(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t006(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t007 ($a, $b) { $a.$b } +is prototype(\&t007), undef; +is eval("t007()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t007(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t007(456, 789)"), "456789"; +is eval("t007(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t007(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t008 ($a, $b, $c) { $a.$b.$c } +is prototype(\&t008), undef; +is eval("t008()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t008(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t008(456, 789)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t008(456, 789, 987)"), "456789987"; +is eval("t008(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t009 ($abc, $def) { $abc.$def } +is prototype(\&t009), undef; +is eval("t009()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t009(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t009(456, 789)"), "456789"; +is eval("t009(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t009(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t010 ($a, $) { $a || "z" } +is prototype(\&t010), undef; +is eval("t010()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t010(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t010(0, 789)"), "z"; +is eval("t010(456, 789)"), 456; +is eval("t010(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t010(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t011 ($, $a) { $a || "z" } +is prototype(\&t011), undef; +is eval("t011()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t011(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t011(456, 0)"), "z"; +is eval("t011(456, 789)"), 789; +is eval("t011(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t011(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t012 ($, $) { $a || "z" } +is prototype(\&t012), undef; +is eval("t012()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t012(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t012(0, 789)"), 123; +is eval("t012(456, 789)"), 123; +is eval("t012(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t012(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t013 ($) { $a || "z" } +is prototype(\&t013), undef; +is eval("t013()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t013(0)"), 123; +is eval("t013(456)"), 123; +is eval("t013(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t013(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t013(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t014 ($a = 222) { $a // "z" } +is prototype(\&t014), undef; +is eval("t014()"), 222; +is eval("t014(0)"), 0; +is eval("t014(undef)"), "z"; +is eval("t014(456)"), 456; +is eval("t014(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t014(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t015 ($a = undef) { $a // "z" } +is prototype(\&t015), undef; +is eval("t015()"), "z"; +is eval("t015(0)"), 0; +is eval("t015(undef)"), "z"; +is eval("t015(456)"), 456; +is eval("t015(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t015(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t016 ($a = do { $z++; 222 }) { $a // "z" } +$z = 0; +is prototype(\&t016), undef; +is eval("t016()"), 222; +is $z, 1; +is eval("t016(0)"), 0; +is eval("t016(undef)"), "z"; +is eval("t016(456)"), 456; +is eval("t016(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t016(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $z, 1; +is eval("t016()"), 222; +is $z, 2; +is $a, 123; + +sub t018 { join("/", @_) } +sub t017 ($p = t018 222, $a = 333) { $p // "z" } +is prototype(\&t017), undef; +is eval("t017()"), "222/333"; +is $a, 333; +$a = 123; +is eval("t017(0)"), 0; +is eval("t017(undef)"), "z"; +is eval("t017(456)"), 456; +is eval("t017(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t017(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t019 ($p = 222, $a = 333) { "$p/$a" } +is prototype(\&t019), undef; +is eval("t019()"), "222/333"; +is eval("t019(0)"), "0/333"; +is eval("t019(456)"), "456/333"; +is eval("t019(456, 789)"), "456/789"; +is eval("t019(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t020 :prototype($) { $_[0]."z" } +sub t021 ($p = t020 222, $a = 333) { "$p/$a" } +is prototype(\&t021), undef; +is eval("t021()"), "222z/333"; +is eval("t021(0)"), "0/333"; +is eval("t021(456)"), "456/333"; +is eval("t021(456, 789)"), "456/789"; +is eval("t021(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t022 ($p = do { $z += 10; 222 }, $a = do { $z++; 333 }) { "$p/$a" } +$z = 0; +is prototype(\&t022), undef; +is eval("t022()"), "222/333"; +is $z, 11; +is eval("t022(0)"), "0/333"; +is $z, 12; +is eval("t022(456)"), "456/333"; +is $z, 13; +is eval("t022(456, 789)"), "456/789"; +is eval("t022(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $z, 13; +is $a, 123; + +sub t023 ($a = sub { $_[0]."z" }) { $a->("a")."y" } +is prototype(\&t023), undef; +is eval("t023()"), "azy"; +is eval("t023(sub { \"x\".\$_[0].\"x\" })"), "xaxy"; +is eval("t023(sub { \"x\".\$_[0].\"x\" }, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t036 ($a = $a."x") { $a."y" } +is prototype(\&t036), undef; +is eval("t036()"), "123xy"; +is eval("t036(0)"), "0y"; +is eval("t036(456)"), "456y"; +is eval("t036(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t037 ($a = 222, $b = $a."x") { "$a/$b" } +is prototype(\&t037), undef; +is eval("t037()"), "222/222x"; +is eval("t037(0)"), "0/0x"; +is eval("t037(456)"), "456/456x"; +is eval("t037(456, 789)"), "456/789"; +is eval("t037(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +eval "#line 8 foo\nsub t024 (\$a =) { }"; +is $@, "Optional parameter lacks default expression at foo line 8\.\n"; + +sub t025 ($ = undef) { $a // "z" } +is prototype(\&t025), undef; +is eval("t025()"), 123; +is eval("t025(0)"), 123; +is eval("t025(456)"), 123; +is eval("t025(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t025(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t025(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t026 ($ = 222) { $a // "z" } +is prototype(\&t026), undef; +is eval("t026()"), 123; +is eval("t026(0)"), 123; +is eval("t026(456)"), 123; +is eval("t026(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t026(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t026(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t032 ($ = do { $z++; 222 }) { $a // "z" } +$z = 0; +is prototype(\&t032), undef; +is eval("t032()"), 123; +is $z, 1; +is eval("t032(0)"), 123; +is eval("t032(456)"), 123; +is eval("t032(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t032(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t032(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $z, 1; +is $a, 123; + +sub t027 ($ =) { $a // "z" } +is prototype(\&t027), undef; +is eval("t027()"), 123; +is eval("t027(0)"), 123; +is eval("t027(456)"), 123; +is eval("t027(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t027(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t027(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t119 ($ =, $a = 333) { $a // "z" } +is prototype(\&t119), undef; +is eval("t119()"), 333; +is eval("t119(0)"), 333; +is eval("t119(456)"), 333; +is eval("t119(456, 789)"), 789; +is eval("t119(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t119(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t028 ($a, $b = 333) { "$a/$b" } +is prototype(\&t028), undef; +is eval("t028()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t028(0)"), "0/333"; +is eval("t028(456)"), "456/333"; +is eval("t028(456, 789)"), "456/789"; +is eval("t028(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t045 ($a, $ = 333) { "$a/" } +is prototype(\&t045), undef; +is eval("t045()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t045(0)"), "0/"; +is eval("t045(456)"), "456/"; +is eval("t045(456, 789)"), "456/"; +is eval("t045(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t046 ($, $b = 333) { "$a/$b" } +is prototype(\&t046), undef; +is eval("t046()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t046(0)"), "123/333"; +is eval("t046(456)"), "123/333"; +is eval("t046(456, 789)"), "123/789"; +is eval("t046(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t047 ($, $ = 333) { "$a/" } +is prototype(\&t047), undef; +is eval("t047()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t047(0)"), "123/"; +is eval("t047(456)"), "123/"; +is eval("t047(456, 789)"), "123/"; +is eval("t047(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t029 ($a, $b, $c = 222, $d = 333) { "$a/$b/$c/$d" } +is prototype(\&t029), undef; +is eval("t029()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t029(0)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t029(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t029(456, 789)"), "456/789/222/333"; +is eval("t029(456, 789, 987)"), "456/789/987/333"; +is eval("t029(456, 789, 987, 654)"), "456/789/987/654"; +is eval("t029(456, 789, 987, 654, 321)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t029(456, 789, 987, 654, 321, 111)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t038 ($a, $b = $a."x") { "$a/$b" } +is prototype(\&t038), undef; +is eval("t038()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t038(0)"), "0/0x"; +is eval("t038(456)"), "456/456x"; +is eval("t038(456, 789)"), "456/789"; +is eval("t038(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +eval "#line 8 foo\nsub t030 (\$a = 222, \$b) { }"; +is $@, "Mandatory parameter follows optional parameter at foo line 8\.\n"; + +eval "#line 8 foo\nsub t031 (\$a = 222, \$b = 333, \$c, \$d) { }"; +is $@, "Mandatory parameter follows optional parameter at foo line 8\.\n"; + +sub t034 (@abc) { join("/", @abc).";".scalar(@abc) } +is prototype(\&t034), undef; +is eval("t034()"), ";0"; +is eval("t034(0)"), "0;1"; +is eval("t034(456)"), "456;1"; +is eval("t034(456, 789)"), "456/789;2"; +is eval("t034(456, 789, 987)"), "456/789/987;3"; +is eval("t034(456, 789, 987, 654)"), "456/789/987/654;4"; +is eval("t034(456, 789, 987, 654, 321)"), "456/789/987/654/321;5"; +is eval("t034(456, 789, 987, 654, 321, 111)"), "456/789/987/654/321/111;6"; +is $a, 123; + +sub t035 (@) { $a } +is prototype(\&t035), undef; +is eval("t035()"), 123; +is eval("t035(0)"), 123; +is eval("t035(456)"), 123; +is eval("t035(456, 789)"), 123; +is eval("t035(456, 789, 987)"), 123; +is eval("t035(456, 789, 987, 654)"), 123; +is eval("t035(456, 789, 987, 654, 321)"), 123; +is eval("t035(456, 789, 987, 654, 321, 111)"), 123; +is $a, 123; + +sub t039 (%abc) { join("/", map { $_."=".$abc{$_} } sort keys %abc) } +is prototype(\&t039), undef; +is eval("t039()"), ""; +is eval("t039(0)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t039(456)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t039(456, 789)"), "456=789"; +is eval("t039(456, 789, 987)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t039(456, 789, 987, 654)"), "456=789/987=654"; +is eval("t039(456, 789, 987, 654, 321)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t039(456, 789, 987, 654, 321, 111)"), "321=111/456=789/987=654"; +is $a, 123; + +sub t040 (%) { $a } +is prototype(\&t040), undef; +is eval("t040()"), 123; +is eval("t040(0)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t040(456)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t040(456, 789)"), 123; +is eval("t040(456, 789, 987)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t040(456, 789, 987, 654)"), 123; +is eval("t040(456, 789, 987, 654, 321)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t040(456, 789, 987, 654, 321, 111)"), 123; +is $a, 123; + +sub t041 ($a, @b) { $a.";".join("/", @b) } +is prototype(\&t041), undef; +is eval("t041()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t041(0)"), "0;"; +is eval("t041(456)"), "456;"; +is eval("t041(456, 789)"), "456;789"; +is eval("t041(456, 789, 987)"), "456;789/987"; +is eval("t041(456, 789, 987, 654)"), "456;789/987/654"; +is eval("t041(456, 789, 987, 654, 321)"), "456;789/987/654/321"; +is eval("t041(456, 789, 987, 654, 321, 111)"), "456;789/987/654/321/111"; +is $a, 123; + +sub t042 ($a, @) { $a.";" } +is prototype(\&t042), undef; +is eval("t042()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t042(0)"), "0;"; +is eval("t042(456)"), "456;"; +is eval("t042(456, 789)"), "456;"; +is eval("t042(456, 789, 987)"), "456;"; +is eval("t042(456, 789, 987, 654)"), "456;"; +is eval("t042(456, 789, 987, 654, 321)"), "456;"; +is eval("t042(456, 789, 987, 654, 321, 111)"), "456;"; +is $a, 123; + +sub t043 ($, @b) { $a.";".join("/", @b) } +is prototype(\&t043), undef; +is eval("t043()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t043(0)"), "123;"; +is eval("t043(456)"), "123;"; +is eval("t043(456, 789)"), "123;789"; +is eval("t043(456, 789, 987)"), "123;789/987"; +is eval("t043(456, 789, 987, 654)"), "123;789/987/654"; +is eval("t043(456, 789, 987, 654, 321)"), "123;789/987/654/321"; +is eval("t043(456, 789, 987, 654, 321, 111)"), "123;789/987/654/321/111"; +is $a, 123; + +sub t044 ($, @) { $a.";" } +is prototype(\&t044), undef; +is eval("t044()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t044(0)"), "123;"; +is eval("t044(456)"), "123;"; +is eval("t044(456, 789)"), "123;"; +is eval("t044(456, 789, 987)"), "123;"; +is eval("t044(456, 789, 987, 654)"), "123;"; +is eval("t044(456, 789, 987, 654, 321)"), "123;"; +is eval("t044(456, 789, 987, 654, 321, 111)"), "123;"; +is $a, 123; + +sub t049 ($a, %b) { $a.";".join("/", map { $_."=".$b{$_} } sort keys %b) } +is prototype(\&t049), undef; +is eval("t049()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t049(222)"), "222;"; +is eval("t049(222, 456)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t049(222, 456, 789)"), "222;456=789"; +is eval("t049(222, 456, 789, 987)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t049(222, 456, 789, 987, 654)"), "222;456=789/987=654"; +is eval("t049(222, 456, 789, 987, 654, 321)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t049(222, 456, 789, 987, 654, 321, 111)"), + "222;321=111/456=789/987=654"; +is $a, 123; + +sub t051 ($a, $b, $c, @d) { "$a;$b;$c;".join("/", @d).";".scalar(@d) } +is prototype(\&t051), undef; +is eval("t051()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t051(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t051(456, 789)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t051(456, 789, 987)"), "456;789;987;;0"; +is eval("t051(456, 789, 987, 654)"), "456;789;987;654;1"; +is eval("t051(456, 789, 987, 654, 321)"), "456;789;987;654/321;2"; +is eval("t051(456, 789, 987, 654, 321, 111)"), "456;789;987;654/321/111;3"; +is $a, 123; + +sub t052 ($a, $b, %c) { "$a;$b;".join("/", map { $_."=".$c{$_} } sort keys %c) } +is prototype(\&t052), undef; +is eval("t052()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t052(222)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t052(222, 333)"), "222;333;"; +is eval("t052(222, 333, 456)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t052(222, 333, 456, 789)"), "222;333;456=789"; +is eval("t052(222, 333, 456, 789, 987)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t052(222, 333, 456, 789, 987, 654)"), "222;333;456=789/987=654"; +is eval("t052(222, 333, 456, 789, 987, 654, 321)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t052(222, 333, 456, 789, 987, 654, 321, 111)"), + "222;333;321=111/456=789/987=654"; +is $a, 123; + +sub t053 ($a, $b, $c, %d) { + "$a;$b;$c;".join("/", map { $_."=".$d{$_} } sort keys %d) +} +is prototype(\&t053), undef; +is eval("t053()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t053(222)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t053(222, 333)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t053(222, 333, 444)"), "222;333;444;"; +is eval("t053(222, 333, 444, 456)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t053(222, 333, 444, 456, 789)"), "222;333;444;456=789"; +is eval("t053(222, 333, 444, 456, 789, 987)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t053(222, 333, 444, 456, 789, 987, 654)"), + "222;333;444;456=789/987=654"; +is eval("t053(222, 333, 444, 456, 789, 987, 654, 321)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t053(222, 333, 444, 456, 789, 987, 654, 321, 111)"), + "222;333;444;321=111/456=789/987=654"; +is $a, 123; + +sub t048 ($a = 222, @b) { $a.";".join("/", @b).";".scalar(@b) } +is prototype(\&t048), undef; +is eval("t048()"), "222;;0"; +is eval("t048(0)"), "0;;0"; +is eval("t048(456)"), "456;;0"; +is eval("t048(456, 789)"), "456;789;1"; +is eval("t048(456, 789, 987)"), "456;789/987;2"; +is eval("t048(456, 789, 987, 654)"), "456;789/987/654;3"; +is eval("t048(456, 789, 987, 654, 321)"), "456;789/987/654/321;4"; +is eval("t048(456, 789, 987, 654, 321, 111)"), "456;789/987/654/321/111;5"; +is $a, 123; + +sub t054 ($a = 222, $b = 333, @c) { "$a;$b;".join("/", @c).";".scalar(@c) } +is prototype(\&t054), undef; +is eval("t054()"), "222;333;;0"; +is eval("t054(456)"), "456;333;;0"; +is eval("t054(456, 789)"), "456;789;;0"; +is eval("t054(456, 789, 987)"), "456;789;987;1"; +is eval("t054(456, 789, 987, 654)"), "456;789;987/654;2"; +is eval("t054(456, 789, 987, 654, 321)"), "456;789;987/654/321;3"; +is eval("t054(456, 789, 987, 654, 321, 111)"), "456;789;987/654/321/111;4"; +is $a, 123; + +sub t055 ($a = 222, $b = 333, $c = 444, @d) { + "$a;$b;$c;".join("/", @d).";".scalar(@d) +} +is prototype(\&t055), undef; +is eval("t055()"), "222;333;444;;0"; +is eval("t055(456)"), "456;333;444;;0"; +is eval("t055(456, 789)"), "456;789;444;;0"; +is eval("t055(456, 789, 987)"), "456;789;987;;0"; +is eval("t055(456, 789, 987, 654)"), "456;789;987;654;1"; +is eval("t055(456, 789, 987, 654, 321)"), "456;789;987;654/321;2"; +is eval("t055(456, 789, 987, 654, 321, 111)"), "456;789;987;654/321/111;3"; +is $a, 123; + +sub t050 ($a = 211, %b) { $a.";".join("/", map { $_."=".$b{$_} } sort keys %b) } +is prototype(\&t050), undef; +is eval("t050()"), "211;"; +is eval("t050(222)"), "222;"; +is eval("t050(222, 456)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t050(222, 456, 789)"), "222;456=789"; +is eval("t050(222, 456, 789, 987)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t050(222, 456, 789, 987, 654)"), "222;456=789/987=654"; +is eval("t050(222, 456, 789, 987, 654, 321)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t050(222, 456, 789, 987, 654, 321, 111)"), + "222;321=111/456=789/987=654"; +is $a, 123; + +sub t056 ($a = 211, $b = 311, %c) { + "$a;$b;".join("/", map { $_."=".$c{$_} } sort keys %c) +} +is prototype(\&t056), undef; +is eval("t056()"), "211;311;"; +is eval("t056(222)"), "222;311;"; +is eval("t056(222, 333)"), "222;333;"; +is eval("t056(222, 333, 456)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t056(222, 333, 456, 789)"), "222;333;456=789"; +is eval("t056(222, 333, 456, 789, 987)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t056(222, 333, 456, 789, 987, 654)"), "222;333;456=789/987=654"; +is eval("t056(222, 333, 456, 789, 987, 654, 321)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t056(222, 333, 456, 789, 987, 654, 321, 111)"), + "222;333;321=111/456=789/987=654"; +is $a, 123; + +sub t057 ($a = 211, $b = 311, $c = 411, %d) { + "$a;$b;$c;".join("/", map { $_."=".$d{$_} } sort keys %d) +} +is prototype(\&t057), undef; +is eval("t057()"), "211;311;411;"; +is eval("t057(222)"), "222;311;411;"; +is eval("t057(222, 333)"), "222;333;411;"; +is eval("t057(222, 333, 444)"), "222;333;444;"; +is eval("t057(222, 333, 444, 456)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t057(222, 333, 444, 456, 789)"), "222;333;444;456=789"; +is eval("t057(222, 333, 444, 456, 789, 987)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t057(222, 333, 444, 456, 789, 987, 654)"), + "222;333;444;456=789/987=654"; +is eval("t057(222, 333, 444, 456, 789, 987, 654, 321)"), undef; +like $@, qr#\AOdd name/value argument for subroutine at#; +is eval("t057(222, 333, 444, 456, 789, 987, 654, 321, 111)"), + "222;333;444;321=111/456=789/987=654"; +is $a, 123; + +sub t058 ($a, $b = 333, @c) { "$a;$b;".join("/", @c).";".scalar(@c) } +is prototype(\&t058), undef; +is eval("t058()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t058(456)"), "456;333;;0"; +is eval("t058(456, 789)"), "456;789;;0"; +is eval("t058(456, 789, 987)"), "456;789;987;1"; +is eval("t058(456, 789, 987, 654)"), "456;789;987/654;2"; +is eval("t058(456, 789, 987, 654, 321)"), "456;789;987/654/321;3"; +is eval("t058(456, 789, 987, 654, 321, 111)"), "456;789;987/654/321/111;4"; +is $a, 123; + +eval "#line 8 foo\nsub t059 (\@a, \$b) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t060 (\@a, \$b = 222) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t061 (\@a, \@b) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t062 (\@a, \%b) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t063 (\@, \$b) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t064 (\@, \$b = 222) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t065 (\@, \@b) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t066 (\@, \%b) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t067 (\@a, \$) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t068 (\@a, \$ = 222) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t069 (\@a, \@) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t070 (\@a, \%) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t071 (\@, \$) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t072 (\@, \$ = 222) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t073 (\@, \@) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t074 (\@, \%) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t075 (\%a, \$b) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t076 (\%, \$b) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t077 (\$a, \@b, \$c) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t078 (\$a, \%b, \$c) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +eval "#line 8 foo\nsub t079 (\$a, \@b, \$c, \$d) { }"; +is $@, "Slurpy parameter not last at foo line 8\.\n"; + +sub t080 ($a,,, $b) { $a.$b } +is prototype(\&t080), undef; +is eval("t080()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t080(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t080(456, 789)"), "456789"; +is eval("t080(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t080(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t081 ($a, $b,,) { $a.$b } +is prototype(\&t081), undef; +is eval("t081()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t081(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t081(456, 789)"), "456789"; +is eval("t081(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t081(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +eval "#line 8 foo\nsub t082 (, \$a) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t083 (,) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +sub t084($a,$b){ $a.$b } +is prototype(\&t084), undef; +is eval("t084()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t084(456)"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t084(456, 789)"), "456789"; +is eval("t084(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t084(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t085 + ( + $ + a + , + , + $ + b + = + 333 + , + , + ) + { $a.$b } +is prototype(\&t085), undef; +is eval("t085()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t085(456)"), "456333"; +is eval("t085(456, 789)"), "456789"; +is eval("t085(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t085(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t086 + ( #foo))) + $ #foo))) + a #foo))) + , #foo))) + , #foo))) + $ #foo))) + b #foo))) + = #foo))) + 333 #foo))) + , #foo))) + , #foo))) + ) #foo))) + { $a.$b } +is prototype(\&t086), undef; +is eval("t086()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t086(456)"), "456333"; +is eval("t086(456, 789)"), "456789"; +is eval("t086(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t086(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t087 + (#foo))) + $ #foo))) + a#foo))) + ,#foo))) + ,#foo))) + $ #foo))) + b#foo))) + =#foo))) + 333#foo))) + ,#foo))) + ,#foo))) + )#foo))) + { $a.$b } +is prototype(\&t087), undef; +is eval("t087()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t087(456)"), "456333"; +is eval("t087(456, 789)"), "456789"; +is eval("t087(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t087(456, 789, 987, 654)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +eval "#line 8 foo\nsub t088 (\$ #foo\na) { }"; +is $@, ""; + +eval "#line 8 foo\nsub t089 (\$#foo\na) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t090 (\@ #foo\na) { }"; +is $@, ""; + +eval "#line 8 foo\nsub t091 (\@#foo\na) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t092 (\% #foo\na) { }"; +is $@, ""; + +eval "#line 8 foo\nsub t093 (\%#foo\na) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t094 (123) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t095 (\$a, 123) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t096 (\$a 123) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t097 (\$a { }) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t098 (\$a; \$b) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +eval "#line 8 foo\nsub t099 (\$\$) { }"; +like $@, qr/\AParse error at foo line 8\.\n/; + +no warnings "experimental::lexical_topic"; +sub t100 ($_) { "$::_/$_" } +is prototype(\&t100), undef; +$_ = "___"; +is eval("t100()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +$_ = "___"; +is eval("t100(0)"), "___/0"; +$_ = "___"; +is eval("t100(456)"), "___/456"; +$_ = "___"; +is eval("t100(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +$_ = "___"; +is eval("t100(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +eval "#line 8 foo\nsub t101 (\@_) { }"; +like $@, qr/\ACan't use global \@_ in "my" at foo line 8/; + +eval "#line 8 foo\nsub t102 (\%_) { }"; +like $@, qr/\ACan't use global \%_ in "my" at foo line 8/; + +my $t103 = sub ($a) { $a || "z" }; +is prototype($t103), undef; +is eval("\$t103->()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("\$t103->(0)"), "z"; +is eval("\$t103->(456)"), 456; +is eval("\$t103->(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("\$t103->(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +my $t118 = sub :prototype($) ($a) { $a || "z" }; +is prototype($t118), "\$"; +is eval("\$t118->()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("\$t118->(0)"), "z"; +is eval("\$t118->(456)"), 456; +is eval("\$t118->(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("\$t118->(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t033 ($a = sub ($a) { $a."z" }) { $a->("a")."y" } +is prototype(\&t033), undef; +is eval("t033()"), "azy"; +is eval("t033(sub { \"x\".\$_[0].\"x\" })"), "xaxy"; +is eval("t033(sub { \"x\".\$_[0].\"x\" }, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t104 :method ($a) { $a || "z" } +is prototype(\&t104), undef; +is eval("t104()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t104(0)"), "z"; +is eval("t104(456)"), 456; +is eval("t104(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t104(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +sub t105 :prototype($) ($a) { $a || "z" } +is prototype(\&t105), "\$"; +is eval("t105()"), undef; +like $@, qr/\ANot enough arguments for main::t105 /; +is eval("t105(0)"), "z"; +is eval("t105(456)"), 456; +is eval("t105(456, 789)"), undef; +like $@, qr/\AToo many arguments for main::t105 at/; +is eval("t105(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for main::t105 at/; +is $a, 123; + +sub t106 :prototype(@) ($a) { $a || "z" } +is prototype(\&t106), "\@"; +is eval("t106()"), undef; +like $@, qr/\AToo few arguments for subroutine at/; +is eval("t106(0)"), "z"; +is eval("t106(456)"), 456; +is eval("t106(456, 789)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is eval("t106(456, 789, 987)"), undef; +like $@, qr/\AToo many arguments for subroutine at/; +is $a, 123; + +eval "#line 8 foo\nsub t107 (\$a) :method { }"; +isnt $@, ""; + +eval "#line 8 foo\nsub t108 (\$a) :prototype(\$) { }"; +isnt $@, ""; + +sub t109 { } +is prototype(\&t109), undef; +is scalar(@{[ t109() ]}), 0; +is scalar(t109()), undef; + +sub t110 () { } +is prototype(\&t110), undef; +is scalar(@{[ t110() ]}), 0; +is scalar(t110()), undef; + +sub t111 ($a) { } +is prototype(\&t111), undef; +is scalar(@{[ t111(222) ]}), 0; +is scalar(t111(222)), undef; + +sub t112 ($) { } +is prototype(\&t112), undef; +is scalar(@{[ t112(222) ]}), 0; +is scalar(t112(222)), undef; + +sub t114 ($a = undef) { } +is prototype(\&t114), undef; +is scalar(@{[ t114() ]}), 0; +is scalar(t114()), undef; +is scalar(@{[ t114(333) ]}), 0; +is scalar(t114(333)), undef; + +sub t113 ($a = 222) { } +is prototype(\&t113), undef; +is scalar(@{[ t113() ]}), 0; +is scalar(t113()), undef; +is scalar(@{[ t113(333) ]}), 0; +is scalar(t113(333)), undef; + +sub t115 ($a = do { $z++; 222 }) { } +is prototype(\&t115), undef; +$z = 0; +is scalar(@{[ t115() ]}), 0; +is $z, 1; +is scalar(t115()), undef; +is $z, 2; +is scalar(@{[ t115(333) ]}), 0; +is scalar(t115(333)), undef; +is $z, 2; + +sub t116 (@a) { } +is prototype(\&t116), undef; +is scalar(@{[ t116() ]}), 0; +is scalar(t116()), undef; +is scalar(@{[ t116(333) ]}), 0; +is scalar(t116(333)), undef; + +sub t117 (%a) { } +is prototype(\&t117), undef; +is scalar(@{[ t117() ]}), 0; +is scalar(t117()), undef; +is scalar(@{[ t117(333, 444) ]}), 0; +is scalar(t117(333, 444)), undef; + +1; diff --git a/toke.c b/toke.c index 290af07..d18594c 100644 --- a/toke.c +++ b/toke.c @@ -6010,14 +6010,14 @@ Perl_yylex(pTHX) /* XXX losing whitespace on sequential attributes here */ } { - const char tmp - = (PL_expect == XOPERATOR ? '=' : '{'); /*'}(' for vi */ - if (*s != ';' && *s != '}' && *s != tmp - && (tmp != '=' || *s != ')')) { + if (*s != ';' && *s != '}' && + !(PL_expect == XOPERATOR + ? (*s == '=' || *s == ')') + : (*s == '{' || *s == '('))) { const char q = ((*s == '\'') ? '"' : '\''); /* If here for an expression, and parsed no attrs, back off. */ - if (tmp == '=' && !attrs) { + if (PL_expect == XOPERATOR && !attrs) { s = PL_bufptr; break; } @@ -8777,7 +8777,7 @@ Perl_yylex(pTHX) } /* Look for a prototype */ - if (*s == '(') { + if (*s == '(' && !FEATURE_SIGNATURES_IS_ENABLED) { s = scan_str(s,!!PL_madskills,FALSE,FALSE,FALSE,NULL); COPLINE_SET_FROM_MULTI_END; if (!s) @@ -8806,7 +8806,7 @@ Perl_yylex(pTHX) if (*s == ':' && s[1] != ':') PL_expect = attrful; - else if (*s != '{' && key == KEY_sub) { + else if ((*s != '{' && *s != '(') && key == KEY_sub) { if (!have_name) Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine"); else if (*s != ';' && *s != '}') @@ -12394,6 +12394,206 @@ Perl_parse_stmtseq(pTHX_ U32 flags) return stmtseqop; } +#define lex_token_boundary() S_lex_token_boundary(aTHX) +static void +S_lex_token_boundary(pTHX) +{ + PL_oldoldbufptr = PL_oldbufptr; + PL_oldbufptr = PL_bufptr; +} + +#define parse_opt_lexvar() S_parse_opt_lexvar(aTHX) +static OP * +S_parse_opt_lexvar(pTHX) +{ + I32 sigil, c; + char *s, *d; + OP *var; + lex_token_boundary(); + sigil = lex_read_unichar(0); + if (lex_peek_unichar(0) == '#') { + qerror(Perl_mess(aTHX_ "Parse error")); + return NULL; + } + lex_read_space(0); + c = lex_peek_unichar(0); + if (c == -1 || !(UTF ? isIDFIRST_uni(c) : isIDFIRST_A(c))) + return NULL; + s = PL_bufptr; + d = PL_tokenbuf + 1; + PL_tokenbuf[0] = sigil; + parse_ident(&s, &d, PL_tokenbuf + sizeof(PL_tokenbuf) - 1, 0, cBOOL(UTF)); + PL_bufptr = s; + if (d == PL_tokenbuf+1) + return NULL; + *d = 0; + var = newOP(sigil == '$' ? OP_PADSV : sigil == '@' ? OP_PADAV : OP_PADHV, + OPf_MOD | (OPpLVAL_INTRO<<8)); + var->op_targ = allocmy(PL_tokenbuf, d - PL_tokenbuf, UTF ? SVf_UTF8 : 0); + return var; +} + +OP * +Perl_parse_subsignature(pTHX) +{ + I32 c; + int prev_type = 0, pos = 0, min_arity = 0, max_arity = 0; + OP *initops = NULL; + lex_read_space(0); + c = lex_peek_unichar(0); + while (c != /*(*/')') { + switch (c) { + case '$': { + OP *var, *expr; + if (prev_type == 2) + qerror(Perl_mess(aTHX_ "Slurpy parameter not last")); + var = parse_opt_lexvar(); + expr = var ? + newBINOP(OP_AELEM, 0, + ref(newUNOP(OP_RV2AV, 0, newGVOP(OP_GV, 0, PL_defgv)), + OP_RV2AV), + newSVOP(OP_CONST, 0, newSViv(pos))) : + NULL; + lex_read_space(0); + c = lex_peek_unichar(0); + if (c == '=') { + lex_token_boundary(); + lex_read_unichar(0); + lex_read_space(0); + c = lex_peek_unichar(0); + if (c == ',' || c == /*(*/')') { + if (var) + qerror(Perl_mess(aTHX_ "Optional parameter " + "lacks default expression")); + } else { + OP *defexpr = parse_termexpr(0); + if (defexpr->op_type == OP_UNDEF && + !(defexpr->op_flags & OPf_KIDS)) { + op_free(defexpr); + } else { + OP *ifop = + newBINOP(OP_GE, 0, + scalar(newUNOP(OP_RV2AV, 0, + newGVOP(OP_GV, 0, PL_defgv))), + newSVOP(OP_CONST, 0, newSViv(pos+1))); + expr = var ? + newCONDOP(0, ifop, expr, defexpr) : + newLOGOP(OP_OR, 0, ifop, defexpr); + } + } + prev_type = 1; + } else { + if (prev_type == 1) + qerror(Perl_mess(aTHX_ "Mandatory parameter " + "follows optional parameter")); + prev_type = 0; + min_arity = pos + 1; + } + if (var) expr = newASSIGNOP(OPf_STACKED, var, 0, expr); + if (expr) + initops = op_append_list(OP_LINESEQ, initops, + newSTATEOP(0, NULL, expr)); + max_arity = ++pos; + } break; + case '@': + case '%': { + OP *var; + if (prev_type == 2) + qerror(Perl_mess(aTHX_ "Slurpy parameter not last")); + var = parse_opt_lexvar(); + if (c == '%') { + OP *chkop = newLOGOP((pos & 1) ? OP_OR : OP_AND, 0, + newBINOP(OP_BIT_AND, 0, + scalar(newUNOP(OP_RV2AV, 0, + newGVOP(OP_GV, 0, PL_defgv))), + newSVOP(OP_CONST, 0, newSViv(1))), + newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), + newSVOP(OP_CONST, 0, + newSVpvs("Odd name/value argument " + "for subroutine")))); + if (pos != min_arity) + chkop = newLOGOP(OP_AND, 0, + newBINOP(OP_GT, 0, + scalar(newUNOP(OP_RV2AV, 0, + newGVOP(OP_GV, 0, PL_defgv))), + newSVOP(OP_CONST, 0, newSViv(pos))), + chkop); + initops = op_append_list(OP_LINESEQ, + newSTATEOP(0, NULL, chkop), + initops); + } + if (var) { + OP *slice = pos ? + op_prepend_elem(OP_ASLICE, + newOP(OP_PUSHMARK, 0), + newLISTOP(OP_ASLICE, 0, + list(newRANGE(0, + newSVOP(OP_CONST, 0, newSViv(pos)), + newUNOP(OP_AV2ARYLEN, 0, + ref(newUNOP(OP_RV2AV, 0, + newGVOP(OP_GV, 0, PL_defgv)), + OP_AV2ARYLEN)))), + ref(newUNOP(OP_RV2AV, 0, + newGVOP(OP_GV, 0, PL_defgv)), + OP_ASLICE))) : + newUNOP(OP_RV2AV, 0, newGVOP(OP_GV, 0, PL_defgv)); + initops = op_append_list(OP_LINESEQ, initops, + newSTATEOP(0, NULL, + newASSIGNOP(OPf_STACKED, var, 0, slice))); + } + prev_type = 2; + max_arity = -1; + } break; + default: + parse_error: + qerror(Perl_mess(aTHX_ "Parse error")); + return NULL; + } + lex_read_space(0); + c = lex_peek_unichar(0); + switch (c) { + case /*(*/')': break; + case ',': + do { + lex_token_boundary(); + lex_read_unichar(0); + lex_read_space(0); + c = lex_peek_unichar(0); + } while (c == ','); + break; + default: + goto parse_error; + } + } + if (min_arity != 0) { + initops = op_append_list(OP_LINESEQ, + newSTATEOP(0, NULL, + newLOGOP(OP_OR, 0, + newBINOP(OP_GE, 0, + scalar(newUNOP(OP_RV2AV, 0, + newGVOP(OP_GV, 0, PL_defgv))), + newSVOP(OP_CONST, 0, newSViv(min_arity))), + newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), + newSVOP(OP_CONST, 0, + newSVpvs("Too few arguments for subroutine"))))), + initops); + } + if (max_arity != -1) { + initops = op_append_list(OP_LINESEQ, + newSTATEOP(0, NULL, + newLOGOP(OP_OR, 0, + newBINOP(OP_LE, 0, + scalar(newUNOP(OP_RV2AV, 0, + newGVOP(OP_GV, 0, PL_defgv))), + newSVOP(OP_CONST, 0, newSViv(max_arity))), + newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0), + newSVOP(OP_CONST, 0, + newSVpvs("Too many arguments for subroutine"))))), + initops); + } + return initops; +} + /* * Local variables: * c-indentation-style: bsd diff --git a/warnings.h b/warnings.h index c1e0b93..66e4153 100644 --- a/warnings.h +++ b/warnings.h @@ -99,7 +99,8 @@ #define WARN_EXPERIMENTAL__AUTODEREF 56 #define WARN_EXPERIMENTAL__POSTDEREF 57 -#define WARN_SYSCALLS 58 +#define WARN_EXPERIMENTAL__SIGNATURES 58 +#define WARN_SYSCALLS 59 #define WARNsize 15 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" -- 2.7.4