summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZefram <zefram@fysh.org>2014-02-01 01:27:13 +0000
committerZefram <zefram@fysh.org>2014-02-01 01:27:15 +0000
commit30d9c59b5f3cba8b5d632d20c2370e82d8ba69ca (patch)
tree989db43c82b395cec053b341532db7a145827254
parentef463b6d87c1ce4e4946bdf785d47e481c1f33f2 (diff)
downloadperl-30d9c59b5f3cba8b5d632d20c2370e82d8ba69ca.tar.gz
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.
-rw-r--r--MANIFEST1
-rw-r--r--embed.fnc1
-rw-r--r--embed.h1
-rw-r--r--feature.h6
-rw-r--r--lib/feature.pm25
-rw-r--r--lib/warnings.pm25
-rw-r--r--op.h2
-rw-r--r--perly.act573
-rw-r--r--perly.c1
-rw-r--r--perly.h34
-rw-r--r--perly.tab1244
-rw-r--r--perly.y44
-rw-r--r--pod/perldiag.pod71
-rw-r--r--pod/perllexwarn.pod2
-rw-r--r--pod/perlsub.pod215
-rw-r--r--proto.h3
-rwxr-xr-xregen/feature.pl23
-rw-r--r--regen/warnings.pl2
-rw-r--r--t/lib/warnings/op17
-rw-r--r--t/op/lexsub.t8
-rw-r--r--t/op/signatures.t1092
-rw-r--r--toke.c214
-rw-r--r--warnings.h3
23 files changed, 2673 insertions, 934 deletions
diff --git a/MANIFEST b/MANIFEST
index 5e47478b90..acc3355783 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 e00be7ace1..f8487d0d69 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 d1722482b0..15ccb77b51 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 c98a5b3294..698302c43f 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 84ad9cbfa8..32dc9300e3 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<our sub foo> syntax. See L<perlsub/Lexical Subroutines> for details.
This feature is available from Perl 5.18 onwards.
+=head2 The 'signatures' feature
+
+B<WARNING>: 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<perlsub/Signatures> 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 e09712ad94..38f9ce25f1 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 1dce791fdf..a93e759b2a 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 d261d062f2..cb5e9ba227 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 d8eedf2652..a7115b3625 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 2886bd366a..e6426df92a 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 84e1c82d96..4f5a86a772 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 2d8b599cb1..10479136bf 100644
--- a/perly.y
+++ b/perly.y
@@ -97,9 +97,9 @@
%type <opval> sliceme kvslice gelem
%type <opval> listexpr nexpr texpr iexpr mexpr mnexpr miexpr
%type <opval> optlistexpr optexpr indirob listop method
-%type <opval> formname subname proto subbody cont my_scalar formblock
+%type <opval> formname subname proto optsubbody cont my_scalar formblock
%type <opval> subattrlist myattrlist myattrterm myterm
-%type <opval> termbinop termunop anonymous termdo
+%type <opval> realsubbody subsignature termbinop termunop anonymous termdo
%type <opval> formstmtseq formline formarg
%nonassoc <i_tkval> 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");
+ $<opval>$ = parse_subsignature();
+ }
+ ')'
+ {
+ $$ = op_append_list(OP_LINESEQ, $<opval>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 98eb026f2f..98b126896d 100644
--- a/pod/perldiag.pod
+++ b/pod/perldiag.pod
@@ -1934,6 +1934,14 @@ L<perlrecharclass/Extended Bracketed Character Classes>.
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<use feature 'signatures'>), 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<use feature 'signatures'>),
+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<perlport> 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<sleep> 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<perlunicode/"User-Defined Character Properties">.
(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<csh> instead of Perl.
diff --git a/pod/perllexwarn.pod b/pod/perllexwarn.pod
index 229a357997..de980201f4 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 2a9e0a838f..bf082628e0 100644
--- a/pod/perlsub.pod
+++ b/pod/perlsub.pod
@@ -15,16 +15,20 @@ X<subroutine, declaration> X<sub>
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<subroutine, anonymous>
$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<import>
@@ -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<subroutine, parameter> X<parameter>
-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</Signatures> 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<foreach> or a C<while>, the returned value is unspecified. The
empty sub returns the empty list.
X<subroutine, return value> X<return value> X<return>
+Aside from an experimental facility (see L</Signatures> below),
Perl does not have named formal parameters. In practice all you
do is assign to a C<my()> 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<not> call
explicitly. See L<perlmod/"BEGIN, UNITCHECK, CHECK, INIT and END">
+=head2 Signatures
+
+B<WARNING>: 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<signature>. The facility must be enabled first by a
+pragmatic declaration, C<use feature 'signatures'>, 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<aliases> the arguments, but the signature variables
+get I<copies> 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</Prototypes>), 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<prototype attribute|attributes/Built-in Attributes>. 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<my> X<variable, lexical> X<lexical> X<lexical variable> X<scope, lexical>
X<lexical scope> X<attributes, my>
@@ -1191,11 +1392,19 @@ X<prototype> X<subroutine, prototype>
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<prototype attribute|attributes/Built-in Attributes>.
-If you declare
+If you declare either of
sub mypush (+@)
+ sub mypush :prototype(+@)
+
+then C<mypush()> takes arguments exactly like C<push()> does.
+
+If subroutine signatures are enabled (see L</Signatures>), 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<mypush()> takes arguments exactly like C<push()> 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 c4c54d1019..17941ca29f 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 d43abc0684..a46ebbcc91 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<our sub foo> syntax. See L<perlsub/Lexical Subroutines> for details.
This feature is available from Perl 5.18 onwards.
+=head2 The 'signatures' feature
+
+B<WARNING>: 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<perlsub/Signatures> 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 1b34c048a9..29033ab53e 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 5888806f6c..bca28186a2 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 8c71da0390..d5fdcb1374 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 0000000000..d0d53c3095
--- /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 290af0780c..d18594c3b1 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 c1e0b9337b..66e4153d6b 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"