sub signatures: use parser rather than lexer
authorDavid Mitchell <davem@iabyn.com>
Thu, 28 Jan 2016 15:14:57 +0000 (15:14 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Aug 2016 19:54:40 +0000 (20:54 +0100)
Currently the signature of a sub (i.e. the '($a, $b = 1)' bit) is parsed
in toke.c using a roll-your-own mini-parser. This commit makes
the signature be part of the general grammar in perly.y instead.

In theory it should still generate the same optree as before, except
that an OP_STUB is no longer appended to each signature optree: it's
unnecessary, and I assume that was a hangover from early development of
the original signature code.

Error messages have changed somewhat: the generic 'Parse error' has
changed to the generic 'syntax error', with the addition of ', near "xyz"'
now appended to each message.

Also, some specific error messages have been added; for example
(@a=1) now says that slurpy params can't have a default vale, rather than
just giving 'Parse error'.

It introduces a new lexer expect state, XSIGVAR, since otherwise when
the lexer saw something like '($, ...)' it would see the identifier
'$,' rather than the tokens '$' and ','.

Since it no longer uses parse_termexpr(), it is no longer subject to the
bug (#123010) associated with that; so sub f($x = print, $y) {}
is no longer mis-interpreted as sub f($x = print($_, $y)) {}

15 files changed:
embed.fnc
embed.h
op.c
parser.h
perl.h
perly.act
perly.c
perly.h
perly.tab
perly.y
pod/perldiag.pod
proto.h
sv.c
t/op/signatures.t
toke.c

index 6fb72e7..1db5e1f 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -475,7 +475,6 @@ 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
@@ -2990,4 +2989,6 @@ XEop    |void   |dtrace_probe_op   |NN const OP *op
 XEop    |void   |dtrace_probe_phase|enum perl_phase phase
 #endif
 
+xpo    |OP*    |check_arity    |int arity |bool max
+
 : ex: set ts=8 sts=4 sw=4 noet:
diff --git a/embed.h b/embed.h
index efee6e9..8cdb625 100644 (file)
--- a/embed.h
+++ b/embed.h
 #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/op.c b/op.c
index a95bc44..8da3886 100644 (file)
--- a/op.c
+++ b/op.c
@@ -15018,6 +15018,42 @@ const_av_xsub(pTHX_ CV* cv)
     XSRETURN(AvFILLp(av)+1);
 }
 
+/* return an optree that checks for too few or too many args -
+ * used for subroutine signatures
+ */
+OP *
+Perl_check_arity(pTHX_ int arity, bool max)
+{
+    return
+        newSTATEOP(0, NULL,
+            newLOGOP(OP_OR, 0,
+                newBINOP((max ? OP_LE : OP_GE), 0,
+                    scalar(newUNOP(OP_RV2AV, 0,
+                        newGVOP(OP_GV, 0, PL_defgv))
+                    ),
+                    newSVOP(OP_CONST, 0, newSViv(arity))
+                ),
+                op_convert_list(OP_DIE, 0,
+                    op_convert_list(OP_SPRINTF, 0,
+                        op_append_list(OP_LIST,
+                            newSVOP(OP_CONST, 0,
+                                max
+                                    ? newSVpvs("Too many arguments for subroutine at %s line %d.\n")
+                                    : newSVpvs("Too few arguments for subroutine at %s line %d.\n")
+                            ),
+                            newSLICEOP(0,
+                                op_append_list(OP_LIST,
+                                    newSVOP(OP_CONST, 0, newSViv(1)),
+                                    newSVOP(OP_CONST, 0, newSViv(2))),
+                                newOP(OP_CALLER, 0)
+                            )
+                        )
+                    )
+                )
+            )
+        );
+}
+
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */
index b0525a4..d4b1ec8 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -116,6 +116,11 @@ typedef struct yy_parser {
     char       tokenbuf[256];
     line_t     herelines;      /* number of lines in here-doc */
     line_t     preambling;     /* line # when processing $ENV{PERL5DB} */
+
+    /* these are valid whiling parsing a subroutine signature */
+    int         sig_elems;      /* number of signature elements seen so far */
+    int         sig_optelems;   /* number of optional signature elems seen */
+    char        sig_slurpy;     /* the sigil of the slurpy var (or null) */
 } yy_parser;
 
 /* flags for lexer API */
diff --git a/perl.h b/perl.h
index 1a38933..0c99831 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -5312,6 +5312,7 @@ typedef enum {
     XTERMBLOCK,
     XBLOCKTERM,
     XPOSTDEREF,
+    XSIGVAR,     /* expecting a var in a sub  signature */
     XTERMORDORDOR /* evil hack */
     /* update exp_name[] in toke.c if adding to this enum */
 } expectation;
index 63515d8..020b742 100644 (file)
--- a/perly.act
+++ b/perly.act
@@ -5,7 +5,7 @@
  */
 
 case 2:
-#line 115 "perly.y" /* yacc.c:1646  */
+#line 118 "perly.y" /* yacc.c:1646  */
     {
                          parser->expect = XSTATE;
                        }
@@ -13,7 +13,7 @@ case 2:
     break;
 
   case 3:
-#line 119 "perly.y" /* yacc.c:1646  */
+#line 122 "perly.y" /* yacc.c:1646  */
     {
                          newPROG(block_end((ps[-1].val.ival),(ps[0].val.opval)));
                          PL_compiling.cop_seq = 0;
@@ -23,7 +23,7 @@ case 2:
     break;
 
   case 4:
-#line 125 "perly.y" /* yacc.c:1646  */
+#line 128 "perly.y" /* yacc.c:1646  */
     {
                          parser->expect = XTERM;
                        }
@@ -31,7 +31,7 @@ case 2:
     break;
 
   case 5:
-#line 129 "perly.y" /* yacc.c:1646  */
+#line 132 "perly.y" /* yacc.c:1646  */
     {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -40,7 +40,7 @@ case 2:
     break;
 
   case 6:
-#line 134 "perly.y" /* yacc.c:1646  */
+#line 137 "perly.y" /* yacc.c:1646  */
     {
                          parser->expect = XBLOCK;
                        }
@@ -48,7 +48,7 @@ case 2:
     break;
 
   case 7:
-#line 138 "perly.y" /* yacc.c:1646  */
+#line 141 "perly.y" /* yacc.c:1646  */
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -60,7 +60,7 @@ case 2:
     break;
 
   case 8:
-#line 146 "perly.y" /* yacc.c:1646  */
+#line 149 "perly.y" /* yacc.c:1646  */
     {
                          parser->expect = XSTATE;
                        }
@@ -68,7 +68,7 @@ case 2:
     break;
 
   case 9:
-#line 150 "perly.y" /* yacc.c:1646  */
+#line 153 "perly.y" /* yacc.c:1646  */
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -80,7 +80,7 @@ case 2:
     break;
 
   case 10:
-#line 158 "perly.y" /* yacc.c:1646  */
+#line 161 "perly.y" /* yacc.c:1646  */
     {
                          parser->expect = XSTATE;
                        }
@@ -88,7 +88,7 @@ case 2:
     break;
 
   case 11:
-#line 162 "perly.y" /* yacc.c:1646  */
+#line 165 "perly.y" /* yacc.c:1646  */
     {
                          PL_pad_reset_pending = TRUE;
                          PL_eval_root = (ps[0].val.opval);
@@ -100,7 +100,7 @@ case 2:
     break;
 
   case 12:
-#line 170 "perly.y" /* yacc.c:1646  */
+#line 173 "perly.y" /* yacc.c:1646  */
     {
                          parser->expect = XSTATE;
                        }
@@ -108,7 +108,7 @@ case 2:
     break;
 
   case 13:
-#line 174 "perly.y" /* yacc.c:1646  */
+#line 177 "perly.y" /* yacc.c:1646  */
     {
                          PL_eval_root = (ps[0].val.opval);
                          (yyval.ival) = 0;
@@ -117,7 +117,7 @@ case 2:
     break;
 
   case 14:
-#line 182 "perly.y" /* yacc.c:1646  */
+#line 185 "perly.y" /* yacc.c:1646  */
     { if (parser->copline > (line_t)(ps[-3].val.ival))
                              parser->copline = (line_t)(ps[-3].val.ival);
                          (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval));
@@ -126,7 +126,7 @@ case 2:
     break;
 
   case 15:
-#line 190 "perly.y" /* yacc.c:1646  */
+#line 193 "perly.y" /* yacc.c:1646  */
     { if (parser->copline > (line_t)(ps[-6].val.ival))
                              parser->copline = (line_t)(ps[-6].val.ival);
                          (yyval.opval) = block_end((ps[-5].val.ival), (ps[-2].val.opval));
@@ -135,14 +135,14 @@ case 2:
     break;
 
   case 16:
-#line 197 "perly.y" /* yacc.c:1646  */
+#line 200 "perly.y" /* yacc.c:1646  */
     { (yyval.ival) = block_start(TRUE);
                          parser->parsed_sub = 0; }
 
     break;
 
   case 17:
-#line 202 "perly.y" /* yacc.c:1646  */
+#line 205 "perly.y" /* yacc.c:1646  */
     { if (parser->copline > (line_t)(ps[-3].val.ival))
                              parser->copline = (line_t)(ps[-3].val.ival);
                          (yyval.opval) = block_end((ps[-2].val.ival), (ps[-1].val.opval));
@@ -151,20 +151,20 @@ case 2:
     break;
 
   case 18:
-#line 209 "perly.y" /* yacc.c:1646  */
+#line 212 "perly.y" /* yacc.c:1646  */
     { (yyval.ival) = block_start(FALSE);
                          parser->parsed_sub = 0; }
 
     break;
 
   case 19:
-#line 215 "perly.y" /* yacc.c:1646  */
+#line 218 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 20:
-#line 217 "perly.y" /* yacc.c:1646  */
+#line 220 "perly.y" /* yacc.c:1646  */
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[-1].val.opval) && (ps[0].val.opval))
@@ -174,13 +174,13 @@ case 2:
     break;
 
   case 21:
-#line 226 "perly.y" /* yacc.c:1646  */
+#line 229 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 22:
-#line 228 "perly.y" /* yacc.c:1646  */
+#line 231 "perly.y" /* yacc.c:1646  */
     {   (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval), (ps[0].val.opval));
                            PL_pad_reset_pending = TRUE;
                            if ((ps[-1].val.opval) && (ps[0].val.opval))
@@ -190,7 +190,7 @@ case 2:
     break;
 
   case 23:
-#line 237 "perly.y" /* yacc.c:1646  */
+#line 240 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = (ps[0].val.opval) ? newSTATEOP(0, NULL, (ps[0].val.opval)) : NULL;
                        }
@@ -198,13 +198,13 @@ case 2:
     break;
 
   case 24:
-#line 241 "perly.y" /* yacc.c:1646  */
+#line 244 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 25:
-#line 245 "perly.y" /* yacc.c:1646  */
+#line 248 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[-1].val.pval)[strlen((ps[-1].val.pval))+1], (ps[-1].val.pval), (ps[0].val.opval));
                        }
@@ -212,7 +212,7 @@ case 2:
     break;
 
   case 26:
-#line 249 "perly.y" /* yacc.c:1646  */
+#line 252 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = newSTATEOP(SVf_UTF8 * (ps[-1].val.pval)[strlen((ps[-1].val.pval))+1], (ps[-1].val.pval), (ps[0].val.opval));
                        }
@@ -220,13 +220,13 @@ case 2:
     break;
 
   case 27:
-#line 256 "perly.y" /* yacc.c:1646  */
+#line 259 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 28:
-#line 258 "perly.y" /* yacc.c:1646  */
+#line 261 "perly.y" /* yacc.c:1646  */
     {
                          CV *fmtcv = PL_compcv;
                          newFORM((ps[-2].val.ival), (ps[-1].val.opval), (ps[0].val.opval));
@@ -240,7 +240,7 @@ case 2:
     break;
 
   case 29:
-#line 268 "perly.y" /* yacc.c:1646  */
+#line 271 "perly.y" /* yacc.c:1646  */
     {
                          if ((ps[-1].val.opval)->op_type == OP_CONST) {
                            const char *const name =
@@ -266,7 +266,7 @@ case 2:
     break;
 
   case 30:
-#line 290 "perly.y" /* yacc.c:1646  */
+#line 293 "perly.y" /* yacc.c:1646  */
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          (ps[-5].val.opval)->op_type == OP_CONST
@@ -281,7 +281,7 @@ case 2:
     break;
 
   case 31:
-#line 301 "perly.y" /* yacc.c:1646  */
+#line 304 "perly.y" /* yacc.c:1646  */
     {
                          if ((ps[-1].val.opval)->op_type == OP_CONST) {
                            const char *const name =
@@ -307,7 +307,7 @@ case 2:
     break;
 
   case 32:
-#line 323 "perly.y" /* yacc.c:1646  */
+#line 326 "perly.y" /* yacc.c:1646  */
     {
                          OP *body;
                          if (parser->copline > (line_t)(ps[-2].val.ival))
@@ -328,7 +328,7 @@ case 2:
     break;
 
   case 33:
-#line 340 "perly.y" /* yacc.c:1646  */
+#line 343 "perly.y" /* yacc.c:1646  */
     {
                          package((ps[-1].val.opval));
                          if ((ps[-2].val.opval))
@@ -339,13 +339,13 @@ case 2:
     break;
 
   case 34:
-#line 347 "perly.y" /* yacc.c:1646  */
+#line 350 "perly.y" /* yacc.c:1646  */
     { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
 
     break;
 
   case 35:
-#line 349 "perly.y" /* yacc.c:1646  */
+#line 352 "perly.y" /* yacc.c:1646  */
     {
                          SvREFCNT_inc_simple_void(PL_compcv);
                          utilize((ps[-6].val.ival), (ps[-5].val.ival), (ps[-3].val.opval), (ps[-2].val.opval), (ps[-1].val.opval));
@@ -356,7 +356,7 @@ case 2:
     break;
 
   case 36:
-#line 356 "perly.y" /* yacc.c:1646  */
+#line 359 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                              newCONDOP(0, (ps[-3].val.opval), op_scope((ps[-1].val.opval)), (ps[0].val.opval)));
@@ -366,7 +366,7 @@ case 2:
     break;
 
   case 37:
-#line 362 "perly.y" /* yacc.c:1646  */
+#line 365 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                               newCONDOP(0, (ps[-3].val.opval), (ps[0].val.opval), op_scope((ps[-1].val.opval))));
@@ -376,7 +376,7 @@ case 2:
     break;
 
   case 38:
-#line 368 "perly.y" /* yacc.c:1646  */
+#line 371 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-3].val.ival), newGIVENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)), 0));
                          parser->copline = (line_t)(ps[-5].val.ival);
@@ -385,19 +385,19 @@ case 2:
     break;
 
   case 39:
-#line 373 "perly.y" /* yacc.c:1646  */
+#line 376 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = block_end((ps[-3].val.ival), newWHENOP((ps[-2].val.opval), op_scope((ps[0].val.opval)))); }
 
     break;
 
   case 40:
-#line 375 "perly.y" /* yacc.c:1646  */
+#line 378 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newWHENOP(0, op_scope((ps[0].val.opval))); }
 
     break;
 
   case 41:
-#line 377 "perly.y" /* yacc.c:1646  */
+#line 380 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-5].val.ival),
                                  newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -408,7 +408,7 @@ case 2:
     break;
 
   case 42:
-#line 384 "perly.y" /* yacc.c:1646  */
+#line 387 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-5].val.ival),
                                  newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -419,19 +419,19 @@ case 2:
     break;
 
   case 43:
-#line 391 "perly.y" /* yacc.c:1646  */
+#line 394 "perly.y" /* yacc.c:1646  */
     { parser->expect = XTERM; }
 
     break;
 
   case 44:
-#line 393 "perly.y" /* yacc.c:1646  */
+#line 396 "perly.y" /* yacc.c:1646  */
     { parser->expect = XTERM; }
 
     break;
 
   case 45:
-#line 396 "perly.y" /* yacc.c:1646  */
+#line 399 "perly.y" /* yacc.c:1646  */
     {
                          OP *initop = (ps[-9].val.opval);
                          OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -450,7 +450,7 @@ case 2:
     break;
 
   case 46:
-#line 411 "perly.y" /* yacc.c:1646  */
+#line 414 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-6].val.ival), newFOROP(0, (ps[-5].val.opval), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
                          parser->copline = (line_t)(ps[-8].val.ival);
@@ -459,7 +459,7 @@ case 2:
     break;
 
   case 47:
-#line 416 "perly.y" /* yacc.c:1646  */
+#line 419 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(0,
                                      op_lvalue((ps[-6].val.opval), OP_ENTERLOOP), (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
@@ -469,13 +469,13 @@ case 2:
     break;
 
   case 48:
-#line 422 "perly.y" /* yacc.c:1646  */
+#line 425 "perly.y" /* yacc.c:1646  */
     { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
 
     break;
 
   case 49:
-#line 424 "perly.y" /* yacc.c:1646  */
+#line 427 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end(
                                (ps[-7].val.ival),
@@ -492,7 +492,7 @@ case 2:
     break;
 
   case 50:
-#line 437 "perly.y" /* yacc.c:1646  */
+#line 440 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival), newFOROP(
                                0, op_lvalue(newUNOP(OP_REFGEN, 0,
@@ -504,7 +504,7 @@ case 2:
     break;
 
   case 51:
-#line 445 "perly.y" /* yacc.c:1646  */
+#line 448 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = block_end((ps[-4].val.ival),
                                  newFOROP(0, (OP*)NULL, (ps[-3].val.opval), (ps[-1].val.opval), (ps[0].val.opval)));
@@ -514,7 +514,7 @@ case 2:
     break;
 
   case 52:
-#line 451 "perly.y" /* yacc.c:1646  */
+#line 454 "perly.y" /* yacc.c:1646  */
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -524,7 +524,7 @@ case 2:
     break;
 
   case 53:
-#line 457 "perly.y" /* yacc.c:1646  */
+#line 460 "perly.y" /* yacc.c:1646  */
     {
                          package((ps[-2].val.opval));
                          if ((ps[-3].val.opval)) {
@@ -535,7 +535,7 @@ case 2:
     break;
 
   case 54:
-#line 464 "perly.y" /* yacc.c:1646  */
+#line 467 "perly.y" /* yacc.c:1646  */
     {
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
@@ -547,7 +547,7 @@ case 2:
     break;
 
   case 55:
-#line 472 "perly.y" /* yacc.c:1646  */
+#line 475 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = (ps[-1].val.opval);
                        }
@@ -555,7 +555,7 @@ case 2:
     break;
 
   case 56:
-#line 476 "perly.y" /* yacc.c:1646  */
+#line 479 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = (OP*)NULL;
                          parser->copline = NOLINE;
@@ -564,7 +564,7 @@ case 2:
     break;
 
   case 57:
-#line 484 "perly.y" /* yacc.c:1646  */
+#line 487 "perly.y" /* yacc.c:1646  */
     { OP *list;
                          if ((ps[0].val.opval)) {
                              OP *term = (ps[0].val.opval);
@@ -583,74 +583,74 @@ case 2:
     break;
 
   case 58:
-#line 501 "perly.y" /* yacc.c:1646  */
+#line 504 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = NULL; }
 
     break;
 
   case 59:
-#line 503 "perly.y" /* yacc.c:1646  */
+#line 506 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_unscope((ps[-1].val.opval)); }
 
     break;
 
   case 60:
-#line 508 "perly.y" /* yacc.c:1646  */
+#line 511 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 61:
-#line 510 "perly.y" /* yacc.c:1646  */
+#line 513 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 62:
-#line 512 "perly.y" /* yacc.c:1646  */
+#line 515 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 63:
-#line 514 "perly.y" /* yacc.c:1646  */
+#line 517 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 64:
-#line 516 "perly.y" /* yacc.c:1646  */
+#line 519 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[0].val.opval)), (ps[-2].val.opval)); }
 
     break;
 
   case 65:
-#line 518 "perly.y" /* yacc.c:1646  */
+#line 521 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[0].val.opval), (ps[-2].val.opval)); }
 
     break;
 
   case 66:
-#line 520 "perly.y" /* yacc.c:1646  */
+#line 523 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newFOROP(0, (OP*)NULL, (ps[0].val.opval), (ps[-2].val.opval), (OP*)NULL);
                          parser->copline = (line_t)(ps[-1].val.ival); }
 
     break;
 
   case 67:
-#line 523 "perly.y" /* yacc.c:1646  */
+#line 526 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newWHENOP((ps[0].val.opval), op_scope((ps[-2].val.opval))); }
 
     break;
 
   case 68:
-#line 528 "perly.y" /* yacc.c:1646  */
+#line 531 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 69:
-#line 530 "perly.y" /* yacc.c:1646  */
+#line 533 "perly.y" /* yacc.c:1646  */
     {
                          ((ps[0].val.opval))->op_flags |= OPf_PARENS;
                          (yyval.opval) = op_scope((ps[0].val.opval));
@@ -659,7 +659,7 @@ case 2:
     break;
 
   case 70:
-#line 535 "perly.y" /* yacc.c:1646  */
+#line 538 "perly.y" /* yacc.c:1646  */
     { parser->copline = (line_t)(ps[-5].val.ival);
                            (yyval.opval) = newCONDOP(0,
                                newSTATEOP(OPf_SPECIAL,NULL,(ps[-3].val.opval)),
@@ -670,19 +670,19 @@ case 2:
     break;
 
   case 71:
-#line 545 "perly.y" /* yacc.c:1646  */
+#line 548 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 72:
-#line 547 "perly.y" /* yacc.c:1646  */
+#line 550 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
   case 73:
-#line 552 "perly.y" /* yacc.c:1646  */
+#line 555 "perly.y" /* yacc.c:1646  */
     { (yyval.ival) = (PL_min_intro_pending &&
                            PL_max_intro_pending >=  PL_min_intro_pending);
                          intro_my(); }
@@ -690,13 +690,13 @@ case 2:
     break;
 
   case 74:
-#line 558 "perly.y" /* yacc.c:1646  */
+#line 561 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 76:
-#line 564 "perly.y" /* yacc.c:1646  */
+#line 567 "perly.y" /* yacc.c:1646  */
     { YYSTYPE tmplval;
                          (void)scan_num("1", &tmplval);
                          (yyval.opval) = tmplval.opval; }
@@ -704,148 +704,421 @@ case 2:
     break;
 
   case 78:
-#line 572 "perly.y" /* yacc.c:1646  */
+#line 575 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = invert(scalar((ps[0].val.opval))); }
 
     break;
 
   case 79:
-#line 577 "perly.y" /* yacc.c:1646  */
+#line 580 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); intro_my(); }
 
     break;
 
   case 80:
-#line 581 "perly.y" /* yacc.c:1646  */
+#line 584 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); intro_my(); }
 
     break;
 
   case 81:
-#line 584 "perly.y" /* yacc.c:1646  */
+#line 587 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 82:
-#line 585 "perly.y" /* yacc.c:1646  */
+#line 588 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 83:
-#line 589 "perly.y" /* yacc.c:1646  */
+#line 592 "perly.y" /* yacc.c:1646  */
     { (yyval.ival) = start_subparse(FALSE, 0);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 84:
-#line 595 "perly.y" /* yacc.c:1646  */
+#line 598 "perly.y" /* yacc.c:1646  */
     { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 85:
-#line 600 "perly.y" /* yacc.c:1646  */
+#line 603 "perly.y" /* yacc.c:1646  */
     { (yyval.ival) = start_subparse(TRUE, 0);
                            SAVEFREESV(PL_compcv); }
 
     break;
 
   case 88:
-#line 611 "perly.y" /* yacc.c:1646  */
+#line 614 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 90:
-#line 617 "perly.y" /* yacc.c:1646  */
+#line 620 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 91:
-#line 619 "perly.y" /* yacc.c:1646  */
+#line 622 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 92:
-#line 621 "perly.y" /* yacc.c:1646  */
+#line 624 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 93:
-#line 626 "perly.y" /* yacc.c:1646  */
+#line 629 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
   case 94:
-#line 628 "perly.y" /* yacc.c:1646  */
+#line 631 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
   case 95:
-#line 633 "perly.y" /* yacc.c:1646  */
+#line 642 "perly.y" /* yacc.c:1646  */
+    { (yyval.opval) = (OP*)NULL; }
+
+    break;
+
+  case 96:
+#line 644 "perly.y" /* yacc.c:1646  */
+    {
+                            (yyval.opval) = (ps[0].val.opval);
+                            PL_parser->in_my = 0;
+                        }
+
+    break;
+
+  case 97:
+#line 652 "perly.y" /* yacc.c:1646  */
+    { (yyval.ival) = '@'; }
+
+    break;
+
+  case 98:
+#line 654 "perly.y" /* yacc.c:1646  */
+    { (yyval.ival) = '%'; }
+
+    break;
+
+  case 99:
+#line 658 "perly.y" /* yacc.c:1646  */
+    {
+                            I32 sigil = (ps[-2].val.ival);
+                            OP *var   = (ps[-1].val.opval);
+                            OP *defexpr = (ps[0].val.opval);
+                            int type = (sigil == '@' ? OP_PADAV : OP_PADHV);
+
+                            if (PL_parser->sig_slurpy)
+                                yyerror("Multiple slurpy parameters not allowed");
+                            PL_parser->sig_slurpy = sigil;
+
+                            if (defexpr)
+                                yyerror("a slurpy parameter may not have "
+                                        "a default value");
+
+                            if (var) {
+                                OP *slice;
+
+                                var->op_type    = type;
+                                var->op_ppaddr  = PL_ppaddr[type];
+                                var->op_flags   = (OPf_WANT_LIST | OPf_MOD);
+                                var->op_private = OPpLVAL_INTRO;
+
+                                slice = PL_parser->sig_elems
+                                    ? op_prepend_elem(OP_ASLICE,
+                                        newOP(OP_PUSHMARK, 0),
+                                        newLISTOP(OP_ASLICE, 0,
+                                            list(newRANGE(0,
+                                                newSVOP(OP_CONST, 0,
+                                                    newSViv(PL_parser->sig_elems)),
+                                                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));
+                                (yyval.opval) = newSTATEOP(0, NULL,
+                                       newASSIGNOP(OPf_STACKED, var, 0, slice));
+                            }
+                            else
+                                (yyval.opval) = (OP*)NULL;
+                        }
+
+    break;
+
+  case 100:
+#line 705 "perly.y" /* yacc.c:1646  */
+    { (yyval.opval) = (OP*)NULL; }
+
+    break;
+
+  case 101:
+#line 707 "perly.y" /* yacc.c:1646  */
+    { (yyval.opval) = newOP(OP_NULL, 0); }
+
+    break;
+
+  case 102:
+#line 709 "perly.y" /* yacc.c:1646  */
+    { (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 103:
+#line 715 "perly.y" /* yacc.c:1646  */
     {
-                         /* We shouldn't get here otherwise */
-                         assert(FEATURE_SIGNATURES_IS_ENABLED);
+                            OP *var     = (ps[-1].val.opval);
+                            OP *defexpr = (ps[0].val.opval);
+                            OP *argn    = NULL;
+                            OP *expr    = NULL;
+
+                            if (PL_parser->sig_slurpy)
+                                yyerror("Slurpy parameter not last");
+
+                            PL_parser->sig_elems++;
+
+                            if (var) {
+                                var->op_type    = OP_PADSV;
+                                var->op_ppaddr  = PL_ppaddr[OP_PADSV];
+                                var->op_flags   = (OPf_WANT_SCALAR | OPf_MOD);
+                                var->op_private = OPpLVAL_INTRO;
+                            }
+
+                            /* $_[N] */
+                            argn = newBINOP(OP_AELEM, 0,
+                                ref(newUNOP(OP_RV2AV, 0,
+                                        newGVOP(OP_GV, 0, PL_defgv)),
+                                    OP_RV2AV),
+                                newSVOP(OP_CONST, 0,
+                                    newSViv(PL_parser->sig_elems - 1)));
+
+                            if (defexpr) {
+                                PL_parser->sig_optelems++;
+                                /* is it '$var=undef', '$=' ? */
+                                if (    (   defexpr->op_type == OP_NULL
+                                         || defexpr->op_type == OP_UNDEF)
+                                    && !(defexpr->op_flags & OPf_KIDS))
+                                {
+                                    if (var) {
+                                        /* '$=' is legal, '$var=' isn't */
+                                        if (defexpr->op_type == OP_NULL)
+                                            yyerror("Optional parameter "
+                                                "lacks default expression");
+                                        else
+                                            expr = argn;
+                                    }
+                                    op_free(defexpr);
+                                }
+                                else {
+                                    /* @_ >= N */
+                                    OP *ge_op = 
+                                        newBINOP(OP_GE, 0,
+                                        scalar(newUNOP(OP_RV2AV, 0,
+                                                newGVOP(OP_GV, 0, PL_defgv))),
+                                        newSVOP(OP_CONST, 0,
+                                            newSViv(PL_parser->sig_elems)));
+
+                                    expr = var
+                                        ? newCONDOP(0, ge_op, argn, defexpr)
+                                        : newLOGOP(OP_OR, 0, ge_op, defexpr);
+                                }
+                            }
+                            else {
+                                if (PL_parser->sig_optelems)
+                                    yyerror("Mandatory parameter "
+                                            "follows optional parameter");
+                                expr = argn;
+                            }
+
+                            if (var)
+                                expr = newASSIGNOP(OPf_STACKED, var, 0, expr);
+                            if (expr)
+                                (yyval.opval) = op_prepend_elem(OP_LINESEQ,
+                                        newSTATEOP(0, NULL, NULL),
+                                        expr);
+                            else
+                                (yyval.opval) = (OP*)NULL;
+                        }
 
-                         Perl_ck_warner_d(aTHX_
-                               packWARN(WARN_EXPERIMENTAL__SIGNATURES),
-                               "The signatures feature is experimental");
-                         (yyval.opval) = parse_subsignature();
+    break;
+
+  case 104:
+#line 793 "perly.y" /* yacc.c:1646  */
+    { parser->expect = XSIGVAR; (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 105:
+#line 795 "perly.y" /* yacc.c:1646  */
+    { parser->expect = XSIGVAR; (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 106:
+#line 801 "perly.y" /* yacc.c:1646  */
+    { (yyval.opval) = (ps[-1].val.opval); }
+
+    break;
+
+  case 107:
+#line 803 "perly.y" /* yacc.c:1646  */
+    {
+                         (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-2].val.opval), (ps[0].val.opval));
                        }
 
     break;
 
-  case 96:
-#line 643 "perly.y" /* yacc.c:1646  */
+  case 108:
+#line 807 "perly.y" /* yacc.c:1646  */
+    { (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 109:
+#line 812 "perly.y" /* yacc.c:1646  */
+    { (yyval.opval) = (OP*)NULL; }
+
+    break;
+
+  case 110:
+#line 814 "perly.y" /* yacc.c:1646  */
+    { (yyval.opval) = (ps[0].val.opval); }
+
+    break;
+
+  case 111:
+#line 818 "perly.y" /* yacc.c:1646  */
     {
-                         (yyval.opval) = op_append_list(OP_LINESEQ, (ps[-1].val.opval),
-                               newSTATEOP(0, NULL, sawparens(newNULLLIST())));
-                         parser->expect = XATTRBLOCK;
+                            ENTER;
+                            SAVEINT(PL_parser->sig_elems);
+                            SAVEINT(PL_parser->sig_optelems);
+                            SAVEI8(PL_parser->sig_slurpy);
+                            PL_parser->sig_elems    = 0;
+                            PL_parser->sig_optelems = 0;
+                            PL_parser->sig_slurpy   = 0;
+                            parser->expect = XSIGVAR;
+                        }
+
+    break;
+
+  case 112:
+#line 830 "perly.y" /* yacc.c:1646  */
+    {
+                            OP *sigops = (ps[-1].val.opval);
+                            int min_arity =
+                                PL_parser->sig_elems - PL_parser->sig_optelems;
+
+                            assert(FEATURE_SIGNATURES_IS_ENABLED);
+
+                            /* We shouldn't get here otherwise */
+                            Perl_ck_warner_d(aTHX_
+                                packWARN(WARN_EXPERIMENTAL__SIGNATURES),
+                                "The signatures feature is experimental");
+
+                            /* handle odd/even for %foo */
+                            if (PL_parser->sig_slurpy == '%') {
+                                OP *chkop =
+                                    newLOGOP(
+                                        (PL_parser->sig_elems & 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))),
+                                        op_convert_list(OP_DIE, 0,
+                                            op_convert_list(OP_SPRINTF, 0,
+                                                op_append_list(OP_LIST,
+                                                    newSVOP(OP_CONST, 0,
+                                                        newSVpvs("Odd name/value argument for subroutine at %s line %d.\n")),
+                                                    newSLICEOP(0,
+                                                        op_append_list(OP_LIST,
+                                                            newSVOP(OP_CONST, 0, newSViv(1)),
+                                                            newSVOP(OP_CONST, 0, newSViv(2))),
+                                                        newOP(OP_CALLER, 0))))));
+                                if (PL_parser->sig_optelems)
+                                    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(PL_parser->sig_elems))),
+                                                chkop);
+                                sigops = op_prepend_elem(OP_LINESEQ,
+                                            chkop, sigops);
+
+                            }
+                            if (min_arity)
+                                sigops = op_prepend_elem(OP_LINESEQ,
+                                            Perl_check_arity(aTHX_ min_arity,
+                                                FALSE),
+                                            sigops);
+                            if (!PL_parser->sig_slurpy)
+                                sigops = op_prepend_elem(OP_LINESEQ,
+                                            Perl_check_arity(aTHX_
+                                                PL_parser->sig_elems, TRUE),
+                                            sigops);
+
+                            (yyval.opval) = op_append_elem(OP_LINESEQ, sigops,
+                                newSTATEOP(0, NULL, NULL));
+
+                            parser->expect = XATTRBLOCK;
+                            LEAVE;
                        }
 
     break;
 
-  case 98:
-#line 652 "perly.y" /* yacc.c:1646  */
+  case 114:
+#line 898 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
-  case 99:
-#line 657 "perly.y" /* yacc.c:1646  */
+  case 115:
+#line 903 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 100:
-#line 659 "perly.y" /* yacc.c:1646  */
+  case 116:
+#line 905 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOGOP((ps[-1].val.ival), 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 101:
-#line 661 "perly.y" /* yacc.c:1646  */
+  case 117:
+#line 907 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 103:
-#line 667 "perly.y" /* yacc.c:1646  */
+  case 119:
+#line 913 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[-1].val.opval); }
 
     break;
 
-  case 104:
-#line 669 "perly.y" /* yacc.c:1646  */
+  case 120:
+#line 915 "perly.y" /* yacc.c:1646  */
     {
                          OP* term = (ps[0].val.opval);
                          (yyval.opval) = op_append_elem(OP_LIST, (ps[-2].val.opval), term);
@@ -853,24 +1126,24 @@ case 2:
 
     break;
 
-  case 106:
-#line 678 "perly.y" /* yacc.c:1646  */
+  case 122:
+#line 924 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list((ps[-2].val.ival), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF((ps[-2].val.ival),(ps[-1].val.opval)), (ps[0].val.opval)) );
                        }
 
     break;
 
-  case 107:
-#line 682 "perly.y" /* yacc.c:1646  */
+  case 123:
+#line 928 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list((ps[-4].val.ival), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF((ps[-4].val.ival),(ps[-2].val.opval)), (ps[-1].val.opval)) );
                        }
 
     break;
 
-  case 108:
-#line 686 "perly.y" /* yacc.c:1646  */
+  case 124:
+#line 932 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, scalar((ps[-5].val.opval)), (ps[-1].val.opval)),
@@ -879,8 +1152,8 @@ case 2:
 
     break;
 
-  case 109:
-#line 692 "perly.y" /* yacc.c:1646  */
+  case 125:
+#line 938 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, scalar((ps[-2].val.opval)),
                                    newMETHOP(OP_METHOD, 0, (ps[0].val.opval))));
@@ -888,8 +1161,8 @@ case 2:
 
     break;
 
-  case 110:
-#line 697 "perly.y" /* yacc.c:1646  */
+  case 126:
+#line 943 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)),
@@ -898,8 +1171,8 @@ case 2:
 
     break;
 
-  case 111:
-#line 703 "perly.y" /* yacc.c:1646  */
+  case 127:
+#line 949 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[-3].val.opval), (ps[-1].val.opval)),
@@ -908,27 +1181,27 @@ case 2:
 
     break;
 
-  case 112:
-#line 709 "perly.y" /* yacc.c:1646  */
+  case 128:
+#line 955 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
-  case 113:
-#line 711 "perly.y" /* yacc.c:1646  */
+  case 129:
+#line 957 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
-  case 114:
-#line 713 "perly.y" /* yacc.c:1646  */
+  case 130:
+#line 959 "perly.y" /* yacc.c:1646  */
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-1].val.ival), 0, (OP*)NULL, (ps[0].val.opval)); }
 
     break;
 
-  case 115:
-#line 716 "perly.y" /* yacc.c:1646  */
+  case 131:
+#line 962 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 op_append_elem(OP_LIST,
                                   op_prepend_elem(OP_LIST, (ps[-1].val.opval), (ps[0].val.opval)), (ps[-4].val.opval)));
@@ -936,21 +1209,21 @@ case 2:
 
     break;
 
-  case 118:
-#line 731 "perly.y" /* yacc.c:1646  */
+  case 134:
+#line 977 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[-4].val.opval), scalar((ps[-2].val.opval))); }
 
     break;
 
-  case 119:
-#line 733 "perly.y" /* yacc.c:1646  */
+  case 135:
+#line 979 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[-3].val.opval)), scalar((ps[-1].val.opval)));
                        }
 
     break;
 
-  case 120:
-#line 736 "perly.y" /* yacc.c:1646  */
+  case 136:
+#line 982 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[-4].val.opval)),OP_RV2AV),
                                        scalar((ps[-1].val.opval)));
@@ -958,8 +1231,8 @@ case 2:
 
     break;
 
-  case 121:
-#line 741 "perly.y" /* yacc.c:1646  */
+  case 137:
+#line 987 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP(OP_AELEM, 0,
                                        ref(newAVREF((ps[-3].val.opval)),OP_RV2AV),
                                        scalar((ps[-1].val.opval)));
@@ -967,91 +1240,91 @@ case 2:
 
     break;
 
-  case 122:
-#line 746 "perly.y" /* yacc.c:1646  */
+  case 138:
+#line 992 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[-4].val.opval)), jmaybe((ps[-2].val.opval)));
                        }
 
     break;
 
-  case 123:
-#line 749 "perly.y" /* yacc.c:1646  */
+  case 139:
+#line 995 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[-5].val.opval)),OP_RV2HV),
                                        jmaybe((ps[-2].val.opval))); }
 
     break;
 
-  case 124:
-#line 753 "perly.y" /* yacc.c:1646  */
+  case 140:
+#line 999 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP(OP_HELEM, 0,
                                        ref(newHVREF((ps[-4].val.opval)),OP_RV2HV),
                                        jmaybe((ps[-2].val.opval))); }
 
     break;
 
-  case 125:
-#line 757 "perly.y" /* yacc.c:1646  */
+  case 141:
+#line 1003 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[-3].val.opval)))); }
 
     break;
 
-  case 126:
-#line 760 "perly.y" /* yacc.c:1646  */
+  case 142:
+#line 1006 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, (ps[-1].val.opval),
                                       newCVREF(0, scalar((ps[-4].val.opval))))); }
 
     break;
 
-  case 127:
-#line 765 "perly.y" /* yacc.c:1646  */
+  case 143:
+#line 1011 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   op_append_elem(OP_LIST, (ps[-1].val.opval),
                                               newCVREF(0, scalar((ps[-3].val.opval))))); }
 
     break;
 
-  case 128:
-#line 769 "perly.y" /* yacc.c:1646  */
+  case 144:
+#line 1015 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                   newCVREF(0, scalar((ps[-2].val.opval)))); }
 
     break;
 
-  case 129:
-#line 772 "perly.y" /* yacc.c:1646  */
+  case 145:
+#line 1018 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); }
 
     break;
 
-  case 130:
-#line 774 "perly.y" /* yacc.c:1646  */
+  case 146:
+#line 1020 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); }
 
     break;
 
-  case 131:
-#line 776 "perly.y" /* yacc.c:1646  */
+  case 147:
+#line 1022 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (OP*)NULL); }
 
     break;
 
-  case 132:
-#line 781 "perly.y" /* yacc.c:1646  */
+  case 148:
+#line 1027 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); }
 
     break;
 
-  case 133:
-#line 783 "perly.y" /* yacc.c:1646  */
+  case 149:
+#line 1029 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 134:
-#line 785 "perly.y" /* yacc.c:1646  */
+  case 150:
+#line 1031 "perly.y" /* yacc.c:1646  */
     {   if ((ps[-1].val.ival) != OP_REPEAT)
                                scalar((ps[-2].val.opval));
                            (yyval.opval) = newBINOP((ps[-1].val.ival), 0, (ps[-2].val.opval), scalar((ps[0].val.opval)));
@@ -1059,112 +1332,112 @@ case 2:
 
     break;
 
-  case 135:
-#line 790 "perly.y" /* yacc.c:1646  */
+  case 151:
+#line 1036 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 136:
-#line 792 "perly.y" /* yacc.c:1646  */
+  case 152:
+#line 1038 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 137:
-#line 794 "perly.y" /* yacc.c:1646  */
+  case 153:
+#line 1040 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 138:
-#line 796 "perly.y" /* yacc.c:1646  */
+  case 154:
+#line 1042 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 139:
-#line 798 "perly.y" /* yacc.c:1646  */
+  case 155:
+#line 1044 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 140:
-#line 800 "perly.y" /* yacc.c:1646  */
+  case 156:
+#line 1046 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 141:
-#line 802 "perly.y" /* yacc.c:1646  */
+  case 157:
+#line 1048 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
 
     break;
 
-  case 142:
-#line 804 "perly.y" /* yacc.c:1646  */
+  case 158:
+#line 1050 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 143:
-#line 806 "perly.y" /* yacc.c:1646  */
+  case 159:
+#line 1052 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 144:
-#line 808 "perly.y" /* yacc.c:1646  */
+  case 160:
+#line 1054 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 145:
-#line 810 "perly.y" /* yacc.c:1646  */
+  case 161:
+#line 1056 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 146:
-#line 815 "perly.y" /* yacc.c:1646  */
+  case 162:
+#line 1061 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 147:
-#line 817 "perly.y" /* yacc.c:1646  */
+  case 163:
+#line 1063 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 148:
-#line 820 "perly.y" /* yacc.c:1646  */
+  case 164:
+#line 1066 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 149:
-#line 822 "perly.y" /* yacc.c:1646  */
+  case 165:
+#line 1068 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 150:
-#line 824 "perly.y" /* yacc.c:1646  */
+  case 166:
+#line 1070 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_POSTINC, 0,
                                        op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); }
 
     break;
 
-  case 151:
-#line 827 "perly.y" /* yacc.c:1646  */
+  case 167:
+#line 1073 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
                                        op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));}
 
     break;
 
-  case 152:
-#line 830 "perly.y" /* yacc.c:1646  */
+  case 168:
+#line 1076 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_convert_list(OP_JOIN, 0,
                                       op_append_elem(
                                        OP_LIST,
@@ -1178,53 +1451,53 @@ case 2:
 
     break;
 
-  case 153:
-#line 841 "perly.y" /* yacc.c:1646  */
+  case 169:
+#line 1087 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_PREINC, 0,
                                        op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); }
 
     break;
 
-  case 154:
-#line 844 "perly.y" /* yacc.c:1646  */
+  case 170:
+#line 1090 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_PREDEC, 0,
                                        op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); }
 
     break;
 
-  case 155:
-#line 851 "perly.y" /* yacc.c:1646  */
+  case 171:
+#line 1097 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newANONLIST((ps[-1].val.opval)); }
 
     break;
 
-  case 156:
-#line 853 "perly.y" /* yacc.c:1646  */
+  case 172:
+#line 1099 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newANONLIST((OP*)NULL);}
 
     break;
 
-  case 157:
-#line 855 "perly.y" /* yacc.c:1646  */
+  case 173:
+#line 1101 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newANONHASH((ps[-2].val.opval)); }
 
     break;
 
-  case 158:
-#line 857 "perly.y" /* yacc.c:1646  */
+  case 174:
+#line 1103 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newANONHASH((OP*)NULL); }
 
     break;
 
-  case 159:
-#line 859 "perly.y" /* yacc.c:1646  */
+  case 175:
+#line 1105 "perly.y" /* yacc.c:1646  */
     { SvREFCNT_inc_simple_void(PL_compcv);
                          (yyval.opval) = newANONATTRSUB((ps[-3].val.ival), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 160:
-#line 862 "perly.y" /* yacc.c:1646  */
+  case 176:
+#line 1108 "perly.y" /* yacc.c:1646  */
     {
                          OP *body;
                          if (parser->copline > (line_t)(ps[-2].val.ival))
@@ -1237,104 +1510,104 @@ case 2:
 
     break;
 
-  case 161:
-#line 876 "perly.y" /* yacc.c:1646  */
+  case 177:
+#line 1122 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));}
 
     break;
 
-  case 162:
-#line 878 "perly.y" /* yacc.c:1646  */
+  case 178:
+#line 1124 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));}
 
     break;
 
-  case 167:
-#line 886 "perly.y" /* yacc.c:1646  */
+  case 183:
+#line 1132 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); }
 
     break;
 
-  case 168:
-#line 888 "perly.y" /* yacc.c:1646  */
+  case 184:
+#line 1134 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); }
 
     break;
 
-  case 169:
-#line 890 "perly.y" /* yacc.c:1646  */
+  case 185:
+#line 1136 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); }
 
     break;
 
-  case 170:
-#line 892 "perly.y" /* yacc.c:1646  */
+  case 186:
+#line 1138 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 171:
-#line 894 "perly.y" /* yacc.c:1646  */
+  case 187:
+#line 1140 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = localize((ps[0].val.opval),0); }
 
     break;
 
-  case 172:
-#line 896 "perly.y" /* yacc.c:1646  */
+  case 188:
+#line 1142 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = sawparens((ps[-1].val.opval)); }
 
     break;
 
-  case 173:
-#line 898 "perly.y" /* yacc.c:1646  */
+  case 189:
+#line 1144 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 174:
-#line 900 "perly.y" /* yacc.c:1646  */
+  case 190:
+#line 1146 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = sawparens(newNULLLIST()); }
 
     break;
 
-  case 175:
-#line 902 "perly.y" /* yacc.c:1646  */
+  case 191:
+#line 1148 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 176:
-#line 904 "perly.y" /* yacc.c:1646  */
+  case 192:
+#line 1150 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 177:
-#line 906 "perly.y" /* yacc.c:1646  */
+  case 193:
+#line 1152 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 178:
-#line 908 "perly.y" /* yacc.c:1646  */
+  case 194:
+#line 1154 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 179:
-#line 910 "perly.y" /* yacc.c:1646  */
+  case 195:
+#line 1156 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));}
 
     break;
 
-  case 180:
-#line 912 "perly.y" /* yacc.c:1646  */
+  case 196:
+#line 1158 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 181:
-#line 914 "perly.y" /* yacc.c:1646  */
+  case 197:
+#line 1160 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_prepend_elem(OP_ASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_ASLICE, 0,
@@ -1347,8 +1620,8 @@ case 2:
 
     break;
 
-  case 182:
-#line 924 "perly.y" /* yacc.c:1646  */
+  case 198:
+#line 1170 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_prepend_elem(OP_KVASLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVASLICE, 0,
@@ -1361,8 +1634,8 @@ case 2:
 
     break;
 
-  case 183:
-#line 934 "perly.y" /* yacc.c:1646  */
+  case 199:
+#line 1180 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -1375,8 +1648,8 @@ case 2:
 
     break;
 
-  case 184:
-#line 944 "perly.y" /* yacc.c:1646  */
+  case 200:
+#line 1190 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVHSLICE, 0,
@@ -1389,27 +1662,27 @@ case 2:
 
     break;
 
-  case 185:
-#line 954 "perly.y" /* yacc.c:1646  */
+  case 201:
+#line 1200 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 186:
-#line 956 "perly.y" /* yacc.c:1646  */
+  case 202:
+#line 1202 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 187:
-#line 958 "perly.y" /* yacc.c:1646  */
+  case 203:
+#line 1204 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval)));
                        }
 
     break;
 
-  case 188:
-#line 961 "perly.y" /* yacc.c:1646  */
+  case 204:
+#line 1207 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval))));
@@ -1417,153 +1690,153 @@ case 2:
 
     break;
 
-  case 189:
-#line 966 "perly.y" /* yacc.c:1646  */
+  case 205:
+#line 1212 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval))));
                        }
 
     break;
 
-  case 190:
-#line 970 "perly.y" /* yacc.c:1646  */
+  case 206:
+#line 1216 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newSVREF((ps[-3].val.opval)); }
 
     break;
 
-  case 191:
-#line 972 "perly.y" /* yacc.c:1646  */
+  case 207:
+#line 1218 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
 
     break;
 
-  case 192:
-#line 974 "perly.y" /* yacc.c:1646  */
+  case 208:
+#line 1220 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newHVREF((ps[-3].val.opval)); }
 
     break;
 
-  case 193:
-#line 976 "perly.y" /* yacc.c:1646  */
+  case 209:
+#line 1222 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
                                       scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); }
 
     break;
 
-  case 194:
-#line 979 "perly.y" /* yacc.c:1646  */
+  case 210:
+#line 1225 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); }
 
     break;
 
-  case 195:
-#line 981 "perly.y" /* yacc.c:1646  */
+  case 211:
+#line 1227 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL);
                            PL_hints |= HINT_BLOCK_SCOPE; }
 
     break;
 
-  case 196:
-#line 984 "perly.y" /* yacc.c:1646  */
+  case 212:
+#line 1230 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); }
 
     break;
 
-  case 197:
-#line 986 "perly.y" /* yacc.c:1646  */
+  case 213:
+#line 1232 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 198:
-#line 988 "perly.y" /* yacc.c:1646  */
+  case 214:
+#line 1234 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newOP((ps[0].val.ival), 0); }
 
     break;
 
-  case 199:
-#line 990 "perly.y" /* yacc.c:1646  */
+  case 215:
+#line 1236 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
-  case 200:
-#line 992 "perly.y" /* yacc.c:1646  */
+  case 216:
+#line 1238 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
 
     break;
 
-  case 201:
-#line 994 "perly.y" /* yacc.c:1646  */
+  case 217:
+#line 1240 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); }
 
     break;
 
-  case 202:
-#line 996 "perly.y" /* yacc.c:1646  */
+  case 218:
+#line 1242 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); }
 
     break;
 
-  case 203:
-#line 998 "perly.y" /* yacc.c:1646  */
+  case 219:
+#line 1244 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 204:
-#line 1000 "perly.y" /* yacc.c:1646  */
+  case 220:
+#line 1246 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); }
 
     break;
 
-  case 205:
-#line 1003 "perly.y" /* yacc.c:1646  */
+  case 221:
+#line 1249 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newOP((ps[0].val.ival), 0); }
 
     break;
 
-  case 206:
-#line 1005 "perly.y" /* yacc.c:1646  */
+  case 222:
+#line 1251 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newOP((ps[-2].val.ival), 0);}
 
     break;
 
-  case 207:
-#line 1007 "perly.y" /* yacc.c:1646  */
+  case 223:
+#line 1253 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 208:
-#line 1009 "perly.y" /* yacc.c:1646  */
+  case 224:
+#line 1255 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[-2].val.opval); }
 
     break;
 
-  case 209:
-#line 1011 "perly.y" /* yacc.c:1646  */
+  case 225:
+#line 1257 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
 
     break;
 
-  case 210:
-#line 1013 "perly.y" /* yacc.c:1646  */
+  case 226:
+#line 1259 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT)
                           ? newUNOP((ps[-2].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0)))
                           : newOP((ps[-2].val.ival), OPf_SPECIAL); }
 
     break;
 
-  case 211:
-#line 1017 "perly.y" /* yacc.c:1646  */
+  case 227:
+#line 1263 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
 
     break;
 
-  case 212:
-#line 1019 "perly.y" /* yacc.c:1646  */
+  case 228:
+#line 1265 "perly.y" /* yacc.c:1646  */
     {
                            if (   (ps[0].val.opval)->op_type != OP_TRANS
                                && (ps[0].val.opval)->op_type != OP_TRANSR
@@ -1577,14 +1850,14 @@ case 2:
 
     break;
 
-  case 213:
-#line 1030 "perly.y" /* yacc.c:1646  */
+  case 229:
+#line 1276 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); }
 
     break;
 
-  case 216:
-#line 1034 "perly.y" /* yacc.c:1646  */
+  case 232:
+#line 1280 "perly.y" /* yacc.c:1646  */
     {
                          (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
@@ -1592,180 +1865,180 @@ case 2:
 
     break;
 
-  case 218:
-#line 1043 "perly.y" /* yacc.c:1646  */
+  case 234:
+#line 1289 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); }
 
     break;
 
-  case 219:
-#line 1045 "perly.y" /* yacc.c:1646  */
+  case 235:
+#line 1291 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = localize((ps[0].val.opval),1); }
 
     break;
 
-  case 220:
-#line 1047 "perly.y" /* yacc.c:1646  */
+  case 236:
+#line 1293 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); }
 
     break;
 
-  case 221:
-#line 1052 "perly.y" /* yacc.c:1646  */
+  case 237:
+#line 1298 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = sawparens((ps[-1].val.opval)); }
 
     break;
 
-  case 222:
-#line 1054 "perly.y" /* yacc.c:1646  */
+  case 238:
+#line 1300 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = sawparens(newNULLLIST()); }
 
     break;
 
-  case 223:
-#line 1057 "perly.y" /* yacc.c:1646  */
+  case 239:
+#line 1303 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 224:
-#line 1059 "perly.y" /* yacc.c:1646  */
+  case 240:
+#line 1305 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 225:
-#line 1061 "perly.y" /* yacc.c:1646  */
+  case 241:
+#line 1307 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 226:
-#line 1066 "perly.y" /* yacc.c:1646  */
+  case 242:
+#line 1312 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
-  case 227:
-#line 1068 "perly.y" /* yacc.c:1646  */
+  case 243:
+#line 1314 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 228:
-#line 1072 "perly.y" /* yacc.c:1646  */
+  case 244:
+#line 1318 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
-  case 229:
-#line 1074 "perly.y" /* yacc.c:1646  */
+  case 245:
+#line 1320 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 230:
-#line 1078 "perly.y" /* yacc.c:1646  */
+  case 246:
+#line 1324 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (OP*)NULL; }
 
     break;
 
-  case 231:
-#line 1080 "perly.y" /* yacc.c:1646  */
+  case 247:
+#line 1326 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
 
-  case 232:
-#line 1086 "perly.y" /* yacc.c:1646  */
+  case 248:
+#line 1332 "perly.y" /* yacc.c:1646  */
     { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
 
     break;
 
-  case 240:
-#line 1103 "perly.y" /* yacc.c:1646  */
+  case 256:
+#line 1349 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); }
 
     break;
 
-  case 241:
-#line 1107 "perly.y" /* yacc.c:1646  */
+  case 257:
+#line 1353 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newSVREF((ps[0].val.opval)); }
 
     break;
 
-  case 242:
-#line 1111 "perly.y" /* yacc.c:1646  */
+  case 258:
+#line 1357 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newAVREF((ps[0].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
                        }
 
     break;
 
-  case 243:
-#line 1117 "perly.y" /* yacc.c:1646  */
+  case 259:
+#line 1363 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newHVREF((ps[0].val.opval));
                          if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
                        }
 
     break;
 
-  case 244:
-#line 1123 "perly.y" /* yacc.c:1646  */
+  case 260:
+#line 1369 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newAVREF((ps[0].val.opval)); }
 
     break;
 
-  case 245:
-#line 1125 "perly.y" /* yacc.c:1646  */
+  case 261:
+#line 1371 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
 
     break;
 
-  case 246:
-#line 1129 "perly.y" /* yacc.c:1646  */
+  case 262:
+#line 1375 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); }
 
     break;
 
-  case 248:
-#line 1134 "perly.y" /* yacc.c:1646  */
+  case 264:
+#line 1380 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newAVREF((ps[-2].val.opval)); }
 
     break;
 
-  case 250:
-#line 1139 "perly.y" /* yacc.c:1646  */
+  case 266:
+#line 1385 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newHVREF((ps[-2].val.opval)); }
 
     break;
 
-  case 252:
-#line 1144 "perly.y" /* yacc.c:1646  */
+  case 268:
+#line 1390 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); }
 
     break;
 
-  case 253:
-#line 1149 "perly.y" /* yacc.c:1646  */
+  case 269:
+#line 1395 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = scalar((ps[0].val.opval)); }
 
     break;
 
-  case 254:
-#line 1151 "perly.y" /* yacc.c:1646  */
+  case 270:
+#line 1397 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = scalar((ps[0].val.opval)); }
 
     break;
 
-  case 255:
-#line 1153 "perly.y" /* yacc.c:1646  */
+  case 271:
+#line 1399 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = op_scope((ps[0].val.opval)); }
 
     break;
 
-  case 256:
-#line 1156 "perly.y" /* yacc.c:1646  */
+  case 272:
+#line 1402 "perly.y" /* yacc.c:1646  */
     { (yyval.opval) = (ps[0].val.opval); }
 
     break;
@@ -1776,6 +2049,6 @@ case 2:
     
 
 /* Generated from:
- * fba24dfc68a3a84c9ae95cb9e14cc156ac487e6f3228cdf84c166d3cd820e59a perly.y
+ * 719f2ad40259ac9c064749d399f2c7d1e1131abbc8c1f1ec0558cac2d8f2bc4c perly.y
  * 3e1dff60f26df8933d7aed0c0e87177a0f022c14800c0707eb62a7db4196ac98 regen_perly.pl
  * ex: set ro: */
diff --git a/perly.c b/perly.c
index 5aed628..e8a9506 100644 (file)
--- a/perly.c
+++ b/perly.c
@@ -25,6 +25,7 @@
 #define PERL_IN_PERLY_C
 #include "perl.h"
 #include "feature.h"
+#include "keywords.h"
 
 typedef unsigned char yytype_uint8;
 typedef signed char yytype_int8;
@@ -246,6 +247,7 @@ S_clear_yystack(pTHX_  const yy_parser *parser)
 int
 Perl_yyparse (pTHX_ int gramtype)
 {
+    dVAR;
     int yystate;
     int yyn;
     int yyresult;
diff --git a/perly.h b/perly.h
index 9184774..8c8c459 100644 (file)
--- a/perly.h
+++ b/perly.h
@@ -181,6 +181,6 @@ int yyparse (void);
 
 
 /* Generated from:
- * fba24dfc68a3a84c9ae95cb9e14cc156ac487e6f3228cdf84c166d3cd820e59a perly.y
+ * 719f2ad40259ac9c064749d399f2c7d1e1131abbc8c1f1ec0558cac2d8f2bc4c perly.y
  * 3e1dff60f26df8933d7aed0c0e87177a0f022c14800c0707eb62a7db4196ac98 regen_perly.pl
  * ex: set ro: */
index a8fe5b5..f6685b8 100644 (file)
--- a/perly.tab
+++ b/perly.tab
@@ -6,16 +6,16 @@
 
 #define YYFINAL  14
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   3111
+#define YYLAST   3085
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  105
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  78
+#define YYNNTS  86
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  256
+#define YYNRULES  272
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  521
+#define YYNSTATES  539
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
@@ -69,32 +69,34 @@ static const yytype_uint8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   115,   115,   114,   125,   124,   134,   133,   146,   145,
-     158,   157,   170,   169,   181,   189,   197,   201,   209,   215,
-     216,   226,   227,   236,   240,   244,   248,   255,   257,   268,
-     267,   301,   300,   339,   347,   346,   355,   361,   367,   372,
-     374,   376,   383,   391,   393,   390,   410,   415,   422,   421,
-     436,   444,   450,   457,   456,   471,   475,   483,   501,   502,
-     507,   509,   511,   513,   515,   517,   519,   522,   528,   529,
-     534,   545,   546,   552,   558,   559,   564,   567,   571,   576,
-     580,   584,   585,   589,   595,   600,   605,   606,   611,   612,
-     617,   618,   620,   625,   627,   633,   632,   651,   652,   656,
-     658,   660,   662,   666,   668,   673,   677,   681,   685,   691,
-     696,   702,   708,   710,   713,   712,   723,   724,   728,   732,
-     735,   740,   745,   748,   752,   756,   759,   764,   768,   771,
-     773,   775,   780,   782,   784,   789,   791,   793,   795,   797,
-     799,   801,   803,   805,   807,   809,   814,   816,   819,   821,
-     823,   826,   829,   840,   843,   850,   852,   854,   856,   858,
-     861,   875,   877,   881,   882,   883,   884,   885,   887,   889,
-     891,   893,   895,   897,   899,   901,   903,   905,   907,   909,
-     911,   913,   923,   933,   943,   953,   955,   957,   960,   965,
-     969,   971,   973,   975,   978,   980,   983,   985,   987,   989,
-     991,   993,   995,   997,   999,  1002,  1004,  1006,  1008,  1010,
-    1012,  1016,  1019,  1018,  1031,  1032,  1033,  1038,  1042,  1044,
-    1046,  1051,  1053,  1056,  1058,  1060,  1065,  1067,  1072,  1073,
-    1078,  1079,  1085,  1089,  1090,  1091,  1094,  1095,  1098,  1099,
-    1102,  1106,  1110,  1116,  1122,  1124,  1128,  1132,  1133,  1137,
-    1138,  1142,  1143,  1148,  1150,  1152,  1155
+       0,   118,   118,   117,   128,   127,   137,   136,   149,   148,
+     161,   160,   173,   172,   184,   192,   200,   204,   212,   218,
+     219,   229,   230,   239,   243,   247,   251,   258,   260,   271,
+     270,   304,   303,   342,   350,   349,   358,   364,   370,   375,
+     377,   379,   386,   394,   396,   393,   413,   418,   425,   424,
+     439,   447,   453,   460,   459,   474,   478,   486,   504,   505,
+     510,   512,   514,   516,   518,   520,   522,   525,   531,   532,
+     537,   548,   549,   555,   561,   562,   567,   570,   574,   579,
+     583,   587,   588,   592,   598,   603,   608,   609,   614,   615,
+     620,   621,   623,   628,   630,   642,   643,   651,   653,   657,
+     705,   706,   708,   714,   792,   794,   800,   802,   806,   812,
+     813,   818,   817,   897,   898,   902,   904,   906,   908,   912,
+     914,   919,   923,   927,   931,   937,   942,   948,   954,   956,
+     959,   958,   969,   970,   974,   978,   981,   986,   991,   994,
+     998,  1002,  1005,  1010,  1014,  1017,  1019,  1021,  1026,  1028,
+    1030,  1035,  1037,  1039,  1041,  1043,  1045,  1047,  1049,  1051,
+    1053,  1055,  1060,  1062,  1065,  1067,  1069,  1072,  1075,  1086,
+    1089,  1096,  1098,  1100,  1102,  1104,  1107,  1121,  1123,  1127,
+    1128,  1129,  1130,  1131,  1133,  1135,  1137,  1139,  1141,  1143,
+    1145,  1147,  1149,  1151,  1153,  1155,  1157,  1159,  1169,  1179,
+    1189,  1199,  1201,  1203,  1206,  1211,  1215,  1217,  1219,  1221,
+    1224,  1226,  1229,  1231,  1233,  1235,  1237,  1239,  1241,  1243,
+    1245,  1248,  1250,  1252,  1254,  1256,  1258,  1262,  1265,  1264,
+    1277,  1278,  1279,  1284,  1288,  1290,  1292,  1297,  1299,  1302,
+    1304,  1306,  1311,  1313,  1318,  1319,  1324,  1325,  1331,  1335,
+    1336,  1337,  1340,  1341,  1344,  1345,  1348,  1352,  1356,  1362,
+    1368,  1370,  1374,  1378,  1379,  1383,  1384,  1388,  1389,  1394,
+    1396,  1398,  1401
 };
 #endif
 
@@ -124,12 +126,14 @@ static const char *const yytname[] =
   "$@13", "formline", "formarg", "sideff", "else", "cont", "mintro",
   "nexpr", "texpr", "iexpr", "mexpr", "mnexpr", "formname", "startsub",
   "startanonsub", "startformsub", "subname", "proto", "subattrlist",
-  "myattrlist", "subsignature", "@14", "optsubbody", "expr", "listexpr",
-  "listop", "@15", "method", "subscripted", "termbinop", "termunop",
-  "anonymous", "termdo", "term", "@16", "myattrterm", "myterm",
-  "optlistexpr", "optexpr", "optrepl", "my_scalar", "my_var",
-  "refgen_topic", "my_refgen", "amper", "scalar", "ary", "hsh", "arylen",
-  "star", "sliceme", "kvslice", "gelem", "indirob", YY_NULLPTR
+  "myattrlist", "sigvarname", "sigslurpsigil", "sigslurpelem",
+  "sigdefault", "sigscalarelem", "sigelem", "siglist", "siglistornull",
+  "subsignature", "$@14", "optsubbody", "expr", "listexpr", "listop",
+  "@15", "method", "subscripted", "termbinop", "termunop", "anonymous",
+  "termdo", "term", "@16", "myattrterm", "myterm", "optlistexpr",
+  "optexpr", "optrepl", "my_scalar", "my_var", "refgen_topic", "my_refgen",
+  "amper", "scalar", "ary", "hsh", "arylen", "star", "sliceme", "kvslice",
+  "gelem", "indirob", YY_NULLPTR
 };
 #endif
 
@@ -152,73 +156,74 @@ static const yytype_uint16 yytoknum[] =
 };
 # endif
 
-#define YYPACT_NINF -412
+#define YYPACT_NINF -440
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-412)))
+  (!!((Yystate) == (-440)))
 
-#define YYTABLE_NINF -252
+#define YYTABLE_NINF -268
 
 #define yytable_value_is_error(Yytable_value) \
-  (!!((Yytable_value) == (-252)))
+  (!!((Yytable_value) == (-268)))
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-     903,  -412,  -412,  -412,  -412,  -412,  -412,     8,  -412,  2810,
-      16,  1502,  1407,  -412,  -412,  -412,  1973,  2810,  2810,    31,
-      31,    31,  -412,    31,    31,  -412,  -412,    46,   -66,  -412,
-    2810,  -412,  -412,  -412,  2810,  -412,   -54,   -20,   -19,  1880,
-    1785,    31,  1880,  2066,    35,  2810,    62,  2810,  2810,  2810,
-    2810,  2810,  2810,  2810,  2159,    31,    31,   341,   -13,  -412,
-       7,  -412,  -412,  -412,  -412,  2971,  -412,  -412,    -2,    73,
-      79,    82,  -412,    76,   123,   180,    92,  -412,  -412,  -412,
-    -412,  -412,    35,    90,  -412,    18,    28,    36,    47,   167,
-      88,   104,    16,  -412,    78,  -412,   102,  1971,  1407,  -412,
-    -412,  -412,   647,   742,  -412,    77,   731,   731,  -412,  -412,
-    -412,  -412,  -412,  -412,  -412,  2810,   117,   118,  2810,   122,
-     367,    16,    -4,  2971,   126,  2252,  1785,  -412,   367,   545,
-     -13,  -412,   438,  2810,  -412,  -412,   367,   212,   100,  -412,
-    -412,  2810,   367,  2903,  2345,   157,  -412,  -412,  -412,   367,
-     -13,   731,   731,   731,    71,    71,   219,   221,  -412,  -412,
-    2810,  2810,  2810,  2810,  2810,  2810,  2438,  2810,  2810,  2810,
-    2810,  2810,  2810,  2810,  2810,  2810,  2810,  2810,  2810,  2810,
-    2810,  2810,  -412,  -412,  -412,   245,  2531,  2810,  2810,  2810,
-    2810,  2810,  2810,  2810,  -412,   209,  -412,   213,  -412,  -412,
-    -412,  -412,  -412,   144,    55,  -412,  -412,   139,  -412,  -412,
-    -412,    16,  -412,  -412,  2810,  2810,  2810,  2810,  2810,  2810,
-    -412,  -412,  -412,  -412,  -412,  2810,  2810,    97,  -412,  -412,
-    -412,   141,   173,  -412,  -412,   256,   145,  2810,   -13,  -412,
-     242,  -412,  2624,   731,   157,    52,    57,    58,  -412,   312,
-     230,  -412,  2810,   244,   193,   193,  -412,  2971,   201,   103,
-    -412,   346,  1584,   483,  1768,   724,   502,  2971,  2929,   468,
-     468,  1675,   408,  1863,   630,   731,   731,  2810,  2810,   170,
-     177,   184,  -412,   186,  2717,    11,   187,   225,  -412,  -412,
-     473,   218,   119,   259,   125,   279,   132,   309,   837,  -412,
-     252,   235,     2,   288,  2810,  2810,  2810,  2810,  -412,   207,
-    -412,  -412,   236,  -412,  -412,  -412,  -412,  1596,    23,  -412,
-    2810,  2810,  -412,   341,  -412,   341,   341,   341,   341,   341,
-     222,   -30,  -412,  2810,  -412,   173,   323,    16,  -412,  -412,
-     534,  -412,    30,   540,  -412,  -412,  -412,   190,  2810,   340,
-    -412,  -412,  2810,   329,   208,  -412,  -412,  -412,  -412,  -412,
-     632,  -412,  -412,  2810,  -412,   352,  -412,   354,  -412,   380,
-    -412,   387,  -412,  -412,  -412,   328,  -412,  -412,  -412,   336,
-     301,   341,   302,   306,   341,   307,   308,  -412,  -412,  -412,
-    -412,   310,   325,   264,  -412,  2810,   334,   335,  -412,  2810,
-     338,  -412,   343,   426,  -412,  -412,  -412,    42,  -412,   211,
-    -412,  3013,   429,  -412,  -412,   344,  -412,  -412,  -412,  -412,
-     355,   173,   141,  -412,  2810,  -412,  -412,   435,   435,  2810,
-    2810,   435,  -412,   360,   356,   435,   435,   341,  -412,  -412,
-    -412,  -412,  -412,  -412,   390,     5,   173,  -412,   370,   435,
-     435,  -412,    32,    32,   373,   374,    78,  2810,  2810,   435,
-    -412,  -412,   932,  -412,  -412,  -412,  -412,   466,  1027,  -412,
-      78,    78,  -412,   435,   376,  -412,  -412,   435,   435,  -412,
-     382,   388,    78,  -412,    29,  -412,  -412,  -412,  -412,  1122,
-    -412,  2810,    78,    78,  -412,   435,  -412,   411,   471,  -412,
-    1217,  -412,   392,  -412,  -412,  -412,    78,  -412,  -412,  -412,
-    -412,   435,  1690,  -412,  1312,    32,   402,  -412,  -412,   435,
-    -412
+     824,  -440,  -440,  -440,  -440,  -440,  -440,    21,  -440,  2826,
+      44,  1518,  1423,  -440,  -440,  -440,  1989,  2826,  2826,    60,
+      60,    60,  -440,    60,    60,  -440,  -440,     8,   -68,  -440,
+    2826,  -440,  -440,  -440,  2826,  -440,   -46,   -29,   -18,  1896,
+    1801,    60,  1896,  2082,    16,  2826,   137,  2826,  2826,  2826,
+    2826,  2826,  2826,  2826,  2175,    60,    60,   170,    36,  -440,
+       7,  -440,  -440,  -440,  -440,  2945,  -440,  -440,    17,   126,
+     209,   221,  -440,    89,   239,   266,   113,  -440,  -440,  -440,
+    -440,  -440,    16,   106,  -440,    29,    32,    57,    61,   149,
+      66,    70,    44,  -440,   102,  -440,   116,   325,  1423,  -440,
+    -440,  -440,   663,   758,  -440,   195,   442,   442,  -440,  -440,
+    -440,  -440,  -440,  -440,  -440,  2826,    73,   122,  2826,   127,
+     318,    44,    -8,  2945,   142,  2268,  1801,  -440,   318,   561,
+      36,  -440,   485,  2826,  -440,  -440,   318,   215,    90,  -440,
+    -440,  2826,   318,  2919,  2361,   186,  -440,  -440,  -440,   318,
+      36,   442,   442,   442,   535,   535,   252,   256,  -440,  -440,
+    2826,  2826,  2826,  2826,  2826,  2826,  2454,  2826,  2826,  2826,
+    2826,  2826,  2826,  2826,  2826,  2826,  2826,  2826,  2826,  2826,
+    2826,  2826,  -440,  -440,  -440,    72,  2547,  2826,  2826,  2826,
+    2826,  2826,  2826,  2826,  -440,   244,  -440,   260,  -440,  -440,
+    -440,  -440,  -440,   190,    23,  -440,  -440,   184,  -440,  -440,
+    -440,    44,  -440,  -440,  2826,  2826,  2826,  2826,  2826,  2826,
+    -440,  -440,  -440,  -440,  -440,  2826,  2826,   217,  -440,  -440,
+    -440,   194,   227,  -440,  -440,   295,   187,  2826,    36,  -440,
+     296,  -440,  2640,   442,   186,    47,    52,    75,  -440,   309,
+     284,  -440,  2826,   301,   251,   251,  -440,  2945,   160,   230,
+    -440,   455,  1600,   518,  1879,   498,   646,  2945,   369,  1692,
+    1692,   419,  1786,  1972,   531,   442,   442,  2826,  2826,   224,
+     229,   231,  -440,   232,  2733,    48,   243,   274,  -440,  -440,
+     475,   192,   235,   370,   246,   399,   250,   408,   853,  -440,
+     338,   290,    -2,   355,  2826,  2826,  2826,  2826,  -440,   299,
+    -440,  -440,   297,  -440,  -440,  -440,  -440,  1612,    31,  -440,
+    2826,  2826,  -440,   170,  -440,   170,   170,   170,   170,   170,
+     303,    19,  -440,  2826,  -440,   227,   380,    44,  -440,  -440,
+     576,  -440,    98,   648,  -440,  -440,  -440,   264,  2826,   402,
+    -440,  -440,  2826,   418,   270,  -440,  -440,  -440,  -440,  -440,
+     661,  -440,  -440,  2826,  -440,   409,  -440,   412,  -440,   415,
+    -440,   416,  -440,  -440,  -440,   386,  -440,  -440,  -440,   411,
+     333,   170,   336,   337,   170,   339,   341,  -440,  -440,  -440,
+    -440,   340,   345,   312,  -440,  2826,   358,   359,  -440,  2826,
+     363,  -440,   112,   459,  -440,  -440,  -440,   107,  -440,   275,
+    -440,  2987,   465,  -440,  -440,   377,  -440,  -440,  -440,  -440,
+     368,   227,   194,  -440,  2826,  -440,  -440,   477,   477,  2826,
+    2826,   477,  -440,   384,   389,   477,   477,   170,  -440,  -440,
+    -440,   464,   464,  -440,  -440,  -440,   413,   396,  -440,  -440,
+    -440,  -440,   427,     5,   227,  -440,   398,   477,   477,  -440,
+     134,   134,   414,   421,   102,  2826,  2826,   477,  -440,  -440,
+    -440,   423,   423,   112,  -440,   948,  -440,  -440,  -440,  -440,
+     499,  1043,  -440,   102,   102,  -440,   477,   407,  -440,  -440,
+     477,   477,  -440,   422,   433,   102,  2826,  -440,  -440,  -440,
+    -440,     3,  -440,  -440,  -440,  -440,  1138,  -440,  2826,   102,
+     102,  -440,   477,  -440,  2945,   452,   493,  -440,  1233,  -440,
+     436,  -440,  -440,  -440,   102,  -440,  -440,  -440,  -440,   477,
+    1706,  -440,  1328,   134,   448,  -440,  -440,   477,  -440
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -226,85 +231,88 @@ static const yytype_int16 yypact[] =
      means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,     2,     4,     6,     8,    10,    12,     0,    16,   228,
+       0,     2,     4,     6,     8,    10,    12,     0,    16,   244,
        0,     0,     0,    19,     1,    19,     0,     0,     0,     0,
-       0,     0,   214,     0,     0,   185,   212,   173,   207,   209,
-     203,    84,   217,    84,   195,   216,   205,     0,     0,   198,
-     226,     0,     0,     0,     0,     0,     0,   201,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   229,   102,   215,
-     180,   163,   164,   165,   166,   105,   170,     5,   186,   175,
-     178,   177,   179,   176,     0,     0,     0,    16,     7,    60,
+       0,     0,   230,     0,     0,   201,   228,   189,   223,   225,
+     219,    84,   233,    84,   211,   232,   221,     0,     0,   214,
+     242,     0,     0,     0,     0,     0,     0,   217,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   245,   118,   231,
+     196,   179,   180,   181,   182,   121,   186,     5,   202,   191,
+     194,   193,   195,   192,     0,     0,     0,    16,     7,    60,
       27,    85,     0,     0,    83,     0,     0,     0,     0,     0,
        0,     0,     0,    56,    71,     9,     0,    61,     0,    11,
-      24,    23,     0,     0,   156,     0,   146,   147,   253,   256,
-     255,   254,   242,   243,   240,   226,     0,     0,     0,     0,
-     204,     0,    88,   196,     0,     0,   228,   199,   200,   253,
-     227,   112,   254,     0,   244,   162,   161,     0,     0,    86,
-      87,   226,   171,     0,     0,   219,   223,   225,   224,   202,
-     197,   148,   149,   168,   153,   154,   174,     0,   241,   246,
-       0,     0,     0,   103,     0,     0,     0,     0,     0,     0,
+      24,    23,     0,     0,   172,     0,   162,   163,   269,   272,
+     271,   270,   258,   259,   256,   242,     0,     0,     0,     0,
+     220,     0,    88,   212,     0,     0,   244,   215,   216,   269,
+     243,   128,   270,     0,   260,   178,   177,     0,     0,    86,
+      87,   242,   187,     0,     0,   235,   239,   241,   240,   218,
+     213,   164,   165,   184,   169,   170,   190,     0,   257,   262,
+       0,     0,     0,   119,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   150,   151,   152,     0,     0,     0,     0,     0,
+       0,     0,   166,   167,   168,     0,     0,     0,     0,     0,
        0,     0,     0,     0,    19,    82,    83,     0,    34,    16,
       16,    16,    16,    16,     0,    16,    16,     0,    16,    16,
       40,     0,    52,    55,     0,     0,     0,     0,     0,     0,
-      26,    25,    20,   155,   110,   228,     0,     0,   208,   114,
-      89,     0,    90,   206,   210,     0,     0,     0,   106,   158,
-       0,   189,     0,   169,     0,   175,   178,   177,   222,     0,
-      94,   218,     0,   172,   100,   101,    99,   104,     0,     0,
-     128,     0,   141,   137,   138,   134,   135,   132,     0,   143,
-     144,   142,   140,   139,   136,   145,   133,     0,     0,   248,
-     250,     0,   116,     0,     0,     0,   252,   109,   117,   187,
+      26,    25,    20,   171,   126,   244,     0,     0,   224,   130,
+      89,     0,    90,   222,   226,     0,     0,     0,   122,   174,
+       0,   205,     0,   185,     0,   191,   194,   193,   238,     0,
+      94,   234,     0,   188,   116,   117,   115,   120,     0,     0,
+     144,     0,   157,   153,   154,   150,   151,   148,     0,   159,
+     160,   158,   156,   155,   152,   161,   149,     0,     0,   264,
+     266,     0,   132,     0,     0,     0,   268,   125,   133,   203,
        0,     0,     0,     0,     0,     0,     0,     0,     0,    81,
-       0,    29,     0,     0,    76,     0,     0,     0,   238,     0,
-     239,   236,     0,   237,   233,   234,   235,     0,     0,    16,
+       0,    29,     0,     0,    76,     0,     0,     0,   254,     0,
+     255,   252,     0,   253,   249,   250,   251,     0,     0,    16,
        0,     0,    72,    64,    65,    78,    62,    63,    66,    67,
-       0,   230,   130,   226,    95,    90,    92,     0,   211,   113,
-       0,   157,   174,     0,   220,   221,    93,     0,     0,     0,
-     121,   127,     0,     0,     0,   191,   192,   193,   245,   125,
-       0,   190,   194,   228,   188,     0,   119,     0,   181,     0,
-     182,     0,    14,    16,    28,    88,    16,    16,    33,     0,
-       0,    77,     0,     0,    79,     0,     0,   232,    16,    75,
-      80,     0,     0,    61,    48,     0,     0,     0,   111,     0,
-       0,   115,     0,     0,    91,   159,   107,   172,   131,     0,
-     124,   167,     0,   120,   126,     0,   122,   183,   184,   118,
-       0,    90,     0,    53,   226,    73,    73,     0,     0,     0,
-       0,     0,    43,     0,     0,     0,     0,   231,   213,    96,
-      19,   129,   123,   108,     0,     0,    90,    19,     0,     0,
-       0,    18,    68,    68,     0,     0,    71,    76,     0,     0,
-      38,    39,     0,    21,    98,    97,    30,     0,     0,    35,
-      71,    71,    19,     0,     0,    36,    37,     0,     0,    51,
-       0,     0,    71,   160,     0,    19,    54,    41,    42,     0,
-      69,     0,    71,    71,    44,     0,    47,    58,     0,    22,
-       0,    17,     0,    46,    50,    73,    71,    19,    57,    15,
-      32,     0,     0,    49,     0,    68,     0,    59,    70,     0,
-      45
+       0,   246,   146,   242,   111,    90,    92,     0,   227,   129,
+       0,   173,   190,     0,   236,   237,    93,     0,     0,     0,
+     137,   143,     0,     0,     0,   207,   208,   209,   261,   141,
+       0,   206,   210,   244,   204,     0,   135,     0,   197,     0,
+     198,     0,    14,    16,    28,    88,    16,    16,    33,     0,
+       0,    77,     0,     0,    79,     0,     0,   248,    16,    75,
+      80,     0,     0,    61,    48,     0,     0,     0,   127,     0,
+       0,   131,   109,     0,    91,   175,   123,   188,   147,     0,
+     140,   183,     0,   136,   142,     0,   138,   199,   200,   134,
+       0,    90,     0,    53,   242,    73,    73,     0,     0,     0,
+       0,     0,    43,     0,     0,     0,     0,   247,   229,    97,
+      98,    95,    95,   105,   104,   108,   110,     0,    19,   145,
+     139,   124,     0,     0,    90,    19,     0,     0,     0,    18,
+      68,    68,     0,     0,    71,    76,     0,     0,    38,    39,
+      96,   100,   100,   106,   112,     0,    21,   114,   113,    30,
+       0,     0,    35,    71,    71,    19,     0,     0,    36,    37,
+       0,     0,    51,     0,     0,    71,   101,   103,    99,   107,
+     176,     0,    19,    54,    41,    42,     0,    69,     0,    71,
+      71,    44,     0,    47,   102,    58,     0,    22,     0,    17,
+       0,    46,    50,    73,    71,    19,    57,    15,    32,     0,
+       0,    49,     0,    68,     0,    59,    70,     0,    45
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -412,  -412,  -412,  -412,  -412,  -412,  -412,  -412,     3,  -412,
-     -60,   -37,  -412,   -15,  -412,   490,   410,    10,  -412,  -412,
-    -412,  -412,  -412,  -412,  -412,  -412,  -412,  -315,  -399,   -75,
-    -411,  -412,    53,   204,  -234,    19,  -412,   318,   499,  -412,
-     456,   165,  -329,   305,   134,  -412,  -412,    -6,   -36,  -412,
-    -412,  -412,  -412,  -412,  -412,  -412,  -412,   198,  -412,  -412,
-     415,  -106,  -125,  -412,  -412,   241,  -412,  -412,   357,   303,
-     -41,   -39,  -412,  -412,  -412,  -412,  -412,     9
+    -440,  -440,  -440,  -440,  -440,  -440,  -440,  -440,    10,  -440,
+     -60,   -95,  -440,   -15,  -440,   529,   454,    -3,  -440,  -440,
+    -440,  -440,  -440,  -440,  -440,  -440,  -440,  -315,  -439,  -103,
+    -420,  -440,    88,   282,  -206,    26,  -440,   361,   522,  -440,
+     506,   200,  -330,   353,   156,  -440,  -440,   136,  -440,   133,
+    -440,  -440,   177,  -440,  -440,    -6,   -36,  -440,  -440,  -440,
+    -440,  -440,  -440,  -440,  -440,    25,  -440,  -440,   468,  -106,
+    -125,  -440,  -440,   306,  -440,  -440,   450,   233,   -35,   -33,
+    -440,  -440,  -440,  -440,  -440,     4
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
       -1,     7,     8,     9,    10,    11,    12,    13,    94,   374,
-      15,   452,   472,   102,   484,   222,   100,   101,   375,   376,
-     303,   457,   505,   433,   447,   499,   508,    96,   475,   212,
-     449,   390,   380,   324,   383,   392,   300,   198,   121,   195,
-     141,   232,   337,   251,   335,   402,   466,    97,    58,    59,
-     333,   287,    60,    61,    62,    63,    64,    65,   117,    66,
-     145,   131,    67,   400,   386,   311,   312,   206,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,   158
+      15,   460,   485,   102,   501,   222,   100,   101,   375,   376,
+     303,   465,   523,   433,   455,   517,   526,    96,   488,   212,
+     457,   390,   380,   324,   383,   392,   300,   198,   121,   195,
+     141,   232,   337,   251,   471,   442,   443,   497,   444,   445,
+     446,   447,   335,   402,   479,    97,    58,    59,   333,   287,
+      60,    61,    62,    63,    64,    65,   117,    66,   145,   131,
+      67,   400,   386,   311,   312,   206,    68,    69,    70,    71,
+      72,    73,    74,    75,    76,   158
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -312,232 +320,215 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-     103,   236,   389,    57,   130,   147,   403,   148,    14,   224,
-     105,   377,   150,    78,    77,   450,   164,   194,   165,   230,
-      77,    95,   110,   110,   110,    77,   110,   110,   112,   113,
-     114,   108,   115,   116,   119,   241,   109,   138,    19,    20,
-      77,   252,   127,   110,   110,   135,   124,   163,   157,   133,
-     134,   108,   497,   348,   476,   139,   109,   118,   110,   110,
-     140,   187,   231,   188,   163,   159,  -247,  -249,  -247,  -249,
-      19,    20,    21,   385,   399,   473,   474,    19,    20,   130,
-     125,   126,   187,   391,   188,  -251,   396,   397,  -247,   223,
-    -247,  -249,   445,  -249,   512,   210,   -16,   238,   186,  -222,
-     330,   193,   246,   378,   247,   130,   464,   166,   221,   332,
-     197,  -221,   227,    55,   361,   350,   518,   467,   199,   235,
-      57,  -223,   310,   211,   229,    55,  -225,  -224,   200,   110,
-     498,   366,   189,    55,   190,   237,   201,   368,   249,   304,
-     305,   306,   307,   309,   370,   317,   318,   202,   320,   321,
-     160,   161,   162,   143,   254,   255,   256,    55,   258,   259,
-     261,   434,   144,   315,    55,   316,  -252,  -252,  -252,   185,
-     160,   161,   162,   160,   161,   162,   160,   161,   162,   298,
-     290,   291,   292,   293,   294,   295,   296,   297,   208,   191,
-     331,   192,   160,   161,   162,   454,   455,   389,   160,   161,
-     162,   240,   408,   213,   209,   160,   161,   162,   323,   325,
-     326,   327,   328,   329,   322,   106,   107,   225,   226,    57,
-     413,   228,   239,   441,   481,   233,   250,   401,   120,   299,
-     252,   340,   123,   302,   203,   308,   343,   128,   415,   319,
-     136,   334,   336,   142,   339,   149,   347,   151,   152,   153,
-     154,   155,   341,   346,   277,   348,   278,   502,   204,   395,
-     279,   280,   281,   160,   161,   162,   282,   205,   162,    55,
-     373,   353,   354,   355,   160,   161,   162,   315,   360,   316,
-     356,   160,   161,   162,   160,   161,   162,   357,   110,   358,
-     362,   160,   161,   162,   160,   161,   162,   130,   381,   325,
-     384,   384,   349,   214,   215,   216,   217,   283,   379,    55,
-     218,   393,   219,   420,   384,   384,   422,   423,   448,   365,
-     253,   398,   111,   111,   111,   363,   111,   111,   430,   160,
-     161,   162,   160,   161,   162,   -31,   388,   160,   161,   162,
-     405,   243,   409,   132,   111,   284,   404,   285,   286,   146,
-     410,   230,   160,   161,   162,   338,   424,    57,   111,   111,
-     367,   257,   416,   -79,   417,   262,   263,   264,   265,   266,
-     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
-     369,   479,   160,   161,   162,   160,   161,   162,   130,   384,
-     418,   453,   207,   437,   456,   487,   488,   419,   460,   461,
-     425,   426,   160,   161,   162,   427,   428,   496,   429,   431,
-     371,   345,   470,   471,   160,   161,   162,   503,   504,   160,
-     161,   162,   482,   384,   384,   462,   432,   170,   171,   132,
-     412,   513,   468,   435,   436,   440,   490,   438,  -175,   442,
-     492,   493,   439,   443,   451,   351,   245,   187,   465,   188,
-    -175,   381,   384,   179,   180,   459,   444,   489,   506,   181,
-     458,   463,   182,   183,   184,   185,   168,   169,   170,   171,
-     500,   469,   477,   478,   515,   485,   491,  -175,  -175,  -175,
-    -175,   507,   520,   494,  -175,   384,  -175,   495,   288,  -175,
-     509,   511,   514,   178,   179,   180,  -175,  -175,  -175,  -175,
-     181,   519,    99,   182,   183,   184,   185,   314,   220,   382,
-     480,  -175,  -175,  -175,   301,  -175,  -175,  -175,  -175,  -175,
-    -175,  -175,  -175,  -175,  -175,  -175,   168,   169,   170,   171,
-    -175,   516,   122,  -175,  -175,  -175,  -175,  -175,   196,  -175,
-     421,  -252,  -175,   170,   171,  -214,   160,   161,   162,   344,
-     411,   176,   177,   178,   179,   180,   446,  -214,   244,   394,
-     181,   313,   170,   182,   183,   184,   185,     0,     0,   179,
-     180,     0,   364,     0,     0,   181,     0,     0,   182,   183,
-     184,   185,     0,     0,  -214,  -214,  -214,  -214,   111,   180,
-       0,  -214,     0,  -214,   181,     0,  -214,   182,   183,   184,
-     185,     0,     0,  -214,  -214,  -214,  -214,   160,   161,   162,
-       0,     0,   387,   160,   161,   162,     0,     0,  -214,  -214,
-    -214,   314,  -214,  -214,  -214,  -214,  -214,  -214,  -214,  -214,
-    -214,  -214,  -214,   406,     0,     0,     0,  -214,     0,   407,
-    -214,  -214,  -214,  -214,  -214,     0,  -214,   -13,    79,  -214,
-       0,     0,     0,     0,     0,     0,    77,     0,    16,     0,
-      17,    18,    19,    20,    21,     0,     0,    22,    23,    24,
-      25,    26,     0,    27,    28,    29,    30,    31,    32,    80,
-      98,    81,    82,    33,    83,    84,    85,    86,    87,    88,
-     170,   171,     0,    89,    90,    91,    92,    34,     0,    35,
-      36,    37,    38,    39,    40,   160,   161,   162,     0,    41,
-      42,    43,    44,    45,    46,    47,     0,   180,     0,     0,
-       0,     0,   181,    48,     0,   182,   183,   184,   185,     0,
-       0,   414,     0,     0,     0,    49,    50,     0,    51,     0,
-      52,    53,    -3,    79,     0,     0,     0,    54,    93,    55,
-      56,    77,     0,    16,     0,    17,    18,    19,    20,    21,
-       0,     0,    22,    23,    24,    25,    26,     0,    27,    28,
-      29,    30,    31,    32,    80,    98,    81,    82,    33,    83,
-      84,    85,    86,    87,    88,     0,     0,     0,    89,    90,
-      91,    92,    34,     0,    35,    36,    37,    38,    39,    40,
-       0,     0,     0,     0,    41,    42,    43,    44,    45,    46,
-      47,   180,     0,     0,     0,     0,   181,     0,    48,   182,
-     183,   184,   185,   181,     0,     0,   182,   183,   184,   185,
-      49,    50,     0,    51,     0,    52,    53,     0,    79,     0,
-       0,     0,    54,    93,    55,    56,    77,   372,    16,     0,
-      17,    18,    19,    20,    21,     0,     0,    22,    23,    24,
-      25,    26,     0,    27,    28,    29,    30,    31,    32,    80,
-      98,    81,    82,    33,    83,    84,    85,    86,    87,    88,
-       0,     0,     0,    89,    90,    91,    92,    34,     0,    35,
-      36,    37,    38,    39,    40,     0,     0,     0,     0,    41,
-      42,    43,    44,    45,    46,    47,     1,     2,     3,     4,
-       5,     6,     0,    48,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    49,    50,     0,    51,     0,
-      52,    53,     0,    79,     0,     0,     0,    54,    93,    55,
-      56,    77,   483,    16,     0,    17,    18,    19,    20,    21,
-       0,     0,    22,    23,    24,    25,    26,     0,    27,    28,
-      29,    30,    31,    32,    80,    98,    81,    82,    33,    83,
-      84,    85,    86,    87,    88,     0,     0,     0,    89,    90,
-      91,    92,    34,     0,    35,    36,    37,    38,    39,    40,
-       0,     0,     0,     0,    41,    42,    43,    44,    45,    46,
-      47,     0,     0,     0,     0,     0,     0,     0,    48,     0,
+     103,   236,   389,    57,   130,   403,   458,   377,    95,   224,
+     105,   147,   150,   148,    77,   230,   164,   194,   165,   118,
+      78,    14,   489,   112,   113,   114,   515,   115,   116,   110,
+     110,   110,   119,   110,   110,   241,   139,   138,    19,    20,
+      21,   140,   106,   107,   133,   134,    19,    20,   157,   127,
+     110,   110,   135,    77,   124,   120,   187,    77,   188,   123,
+     159,  -263,   231,  -263,   128,   110,   110,   136,   108,    77,
+     142,   125,   149,   109,   151,   152,   153,   154,   155,   130,
+     108,   277,   126,   278,  -265,   109,  -265,   279,   280,   281,
+     310,   453,   -16,   282,   536,   221,   163,   238,  -267,   378,
+     330,   385,   210,   530,   516,   130,   477,   166,   246,   252,
+     247,   391,   227,   163,   396,   397,  -239,   186,   348,   235,
+      57,  -241,   193,   399,   480,    55,   197,   439,   440,   199,
+     237,   229,   200,    55,   283,   187,   110,   188,   249,   304,
+     305,   306,   307,   309,  -240,   317,   318,   211,   320,   321,
+      55,   361,    19,    20,   254,   255,   256,   201,   258,   259,
+     261,   202,    55,   160,   161,   162,   208,  -238,   243,   315,
+     209,   316,   284,   225,   285,   286,  -237,   486,   487,   298,
+     290,   291,   292,   293,   294,   295,   296,   297,   257,   434,
+     331,   240,   262,   263,   264,   265,   266,   267,   268,   269,
+     270,   271,   272,   273,   274,   275,   276,   223,   323,   325,
+     326,   327,   328,   329,   441,   389,   203,   213,  -263,    57,
+    -263,   322,   226,   462,   463,   239,   228,   401,   143,   332,
+    -265,   340,  -265,   160,   161,   162,   343,   144,   415,    55,
+     204,   233,   350,   160,   161,   162,   347,   366,   189,   205,
+     190,    55,   111,   111,   111,   250,   111,   111,   368,   395,
+     494,   349,   370,   252,   299,   160,   161,   162,   160,   161,
+     162,   353,   354,   132,   111,   191,   408,   192,   360,   146,
+     302,   308,   413,   315,   319,   316,   339,   449,   111,   111,
+     160,   161,   162,   365,   334,   110,   336,   130,   381,   325,
+     384,   384,   520,   160,   161,   162,   341,   346,   160,   161,
+     162,   393,   348,   420,   384,   384,   422,   423,   456,   160,
+     161,   162,   207,   160,   161,   162,   162,   355,   430,   160,
+     161,   162,   356,   461,   357,   358,   464,   160,   161,   162,
+     468,   469,   409,   160,   161,   162,   362,   405,   160,   161,
+     162,   214,   215,   216,   217,   253,   373,    57,   218,   132,
+     219,   492,   483,   484,   214,   215,   216,   217,   160,   161,
+     162,   218,   495,   219,   363,   379,   245,   411,   170,   171,
+     504,   505,   160,   161,   162,   160,   161,   162,   130,   384,
+     -31,   507,   513,   437,   338,   509,   510,   388,   160,   161,
+     162,    55,   398,   404,   179,   180,   521,   522,   345,   230,
+     181,   -79,   410,   182,   183,   184,   185,   524,   288,   416,
+     167,   531,   417,   384,   384,   418,   419,   168,   169,   170,
+     171,   424,   425,   475,   533,   426,   427,   314,   428,   431,
+     481,   429,   538,   160,   161,   162,   432,   172,   173,   352,
+     174,   175,   176,   177,   178,   179,   180,   435,   436,   381,
+     384,   181,   438,   478,   182,   183,   184,   185,   448,   452,
+     506,   367,   160,   161,   162,   450,   451,   168,   169,   170,
+     171,   160,   161,   162,   466,  -191,   459,   518,   467,   470,
+     473,   160,   161,   162,   187,   474,   188,  -191,   476,   482,
+     369,   496,   384,   177,   178,   179,   180,   508,   502,   371,
+     532,   181,   527,   490,   182,   183,   184,   185,   111,   412,
+     491,   514,   525,   511,  -191,  -191,  -191,  -191,   160,   161,
+     162,  -191,   512,  -191,   181,   529,  -191,   182,   183,   184,
+     185,    99,   387,  -191,  -191,  -191,  -191,   537,   160,   161,
+     162,   314,   220,   493,   351,   122,   534,   301,  -191,  -191,
+    -191,  -230,  -191,  -191,  -191,  -191,  -191,  -191,  -191,  -191,
+    -191,  -191,  -191,  -230,   364,   421,  -268,  -191,   170,   171,
+    -191,  -191,  -191,  -191,  -191,   180,  -191,   382,   196,  -191,
+     181,   170,   171,   182,   183,   184,   185,   344,   472,   454,
+    -230,  -230,  -230,  -230,   179,   180,   499,  -230,   498,  -230,
+     181,   244,  -230,   182,   183,   184,   185,     0,   180,  -230,
+    -230,  -230,  -230,   181,   394,     0,   182,   183,   184,   185,
+    -268,  -268,  -268,   185,  -230,  -230,  -230,     0,  -230,  -230,
+    -230,  -230,  -230,  -230,  -230,  -230,  -230,  -230,  -230,   160,
+     161,   162,     0,  -230,   313,     0,  -230,  -230,  -230,  -230,
+    -230,     0,  -230,   -13,    79,  -230,     0,     0,     0,     0,
+       0,     0,    77,     0,    16,   406,    17,    18,    19,    20,
+      21,     0,     0,    22,    23,    24,    25,    26,     0,    27,
+      28,    29,    30,    31,    32,    80,    98,    81,    82,    33,
+      83,    84,    85,    86,    87,    88,   170,     0,     0,    89,
+      90,    91,    92,    34,     0,    35,    36,    37,    38,    39,
+      40,   160,   161,   162,     0,    41,    42,    43,    44,    45,
+      46,    47,     0,   180,   160,   161,   162,     0,   181,    48,
+       0,   182,   183,   184,   185,     0,     0,   407,     0,     0,
+       0,    49,    50,     0,    51,     0,    52,    53,    -3,    79,
+     414,     0,     0,    54,    93,    55,    56,    77,     0,    16,
+       0,    17,    18,    19,    20,    21,     0,     0,    22,    23,
+      24,    25,    26,     0,    27,    28,    29,    30,    31,    32,
+      80,    98,    81,    82,    33,    83,    84,    85,    86,    87,
+      88,     0,     0,     0,    89,    90,    91,    92,    34,     0,
+      35,    36,    37,    38,    39,    40,     0,     0,     0,     0,
+      41,    42,    43,    44,    45,    46,    47,     1,     2,     3,
+       4,     5,     6,     0,    48,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    49,    50,     0,    51,
+       0,    52,    53,     0,    79,     0,     0,     0,    54,    93,
+      55,    56,    77,   372,    16,     0,    17,    18,    19,    20,
+      21,     0,     0,    22,    23,    24,    25,    26,     0,    27,
+      28,    29,    30,    31,    32,    80,    98,    81,    82,    33,
+      83,    84,    85,    86,    87,    88,     0,     0,     0,    89,
+      90,    91,    92,    34,     0,    35,    36,    37,    38,    39,
+      40,     0,     0,     0,     0,    41,    42,    43,    44,    45,
+      46,    47,     0,     0,     0,     0,     0,     0,     0,    48,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      49,    50,     0,    51,     0,    52,    53,     0,    79,     0,
-       0,     0,    54,    93,    55,    56,    77,   486,    16,     0,
-      17,    18,    19,    20,    21,     0,     0,    22,    23,    24,
-      25,    26,     0,    27,    28,    29,    30,    31,    32,    80,
-      98,    81,    82,    33,    83,    84,    85,    86,    87,    88,
-       0,     0,     0,    89,    90,    91,    92,    34,     0,    35,
-      36,    37,    38,    39,    40,     0,     0,     0,     0,    41,
-      42,    43,    44,    45,    46,    47,     0,     0,     0,     0,
-       0,     0,     0,    48,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    49,    50,     0,    51,     0,
-      52,    53,     0,    79,     0,     0,     0,    54,    93,    55,
-      56,    77,   501,    16,     0,    17,    18,    19,    20,    21,
-       0,     0,    22,    23,    24,    25,    26,     0,    27,    28,
-      29,    30,    31,    32,    80,    98,    81,    82,    33,    83,
-      84,    85,    86,    87,    88,     0,     0,     0,    89,    90,
-      91,    92,    34,     0,    35,    36,    37,    38,    39,    40,
-       0,     0,     0,     0,    41,    42,    43,    44,    45,    46,
-      47,     0,     0,     0,     0,     0,     0,     0,    48,     0,
+       0,    49,    50,     0,    51,     0,    52,    53,     0,    79,
+       0,     0,     0,    54,    93,    55,    56,    77,   500,    16,
+       0,    17,    18,    19,    20,    21,     0,     0,    22,    23,
+      24,    25,    26,     0,    27,    28,    29,    30,    31,    32,
+      80,    98,    81,    82,    33,    83,    84,    85,    86,    87,
+      88,     0,     0,     0,    89,    90,    91,    92,    34,     0,
+      35,    36,    37,    38,    39,    40,     0,     0,     0,     0,
+      41,    42,    43,    44,    45,    46,    47,     0,     0,     0,
+       0,     0,     0,     0,    48,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    49,    50,     0,    51,
+       0,    52,    53,     0,    79,     0,     0,     0,    54,    93,
+      55,    56,    77,   503,    16,     0,    17,    18,    19,    20,
+      21,     0,     0,    22,    23,    24,    25,    26,     0,    27,
+      28,    29,    30,    31,    32,    80,    98,    81,    82,    33,
+      83,    84,    85,    86,    87,    88,     0,     0,     0,    89,
+      90,    91,    92,    34,     0,    35,    36,    37,    38,    39,
+      40,     0,     0,     0,     0,    41,    42,    43,    44,    45,
+      46,    47,     0,     0,     0,     0,     0,     0,     0,    48,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      49,    50,     0,    51,     0,    52,    53,     0,    79,     0,
-       0,     0,    54,    93,    55,    56,    77,   510,    16,     0,
-      17,    18,    19,    20,    21,     0,     0,    22,    23,    24,
-      25,    26,     0,    27,    28,    29,    30,    31,    32,    80,
-      98,    81,    82,    33,    83,    84,    85,    86,    87,    88,
-       0,     0,     0,    89,    90,    91,    92,    34,     0,    35,
-      36,    37,    38,    39,    40,     0,     0,     0,     0,    41,
-      42,    43,    44,    45,    46,    47,     0,     0,     0,     0,
-       0,     0,     0,    48,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    49,    50,     0,    51,     0,
-      52,    53,     0,    79,     0,     0,     0,    54,    93,    55,
-      56,    77,     0,    16,     0,    17,    18,    19,    20,    21,
-       0,     0,    22,    23,    24,    25,    26,     0,    27,    28,
-      29,    30,    31,    32,    80,    98,    81,    82,    33,    83,
-      84,    85,    86,    87,    88,     0,     0,     0,    89,    90,
-      91,    92,    34,     0,    35,    36,    37,    38,    39,    40,
-       0,     0,     0,     0,    41,    42,    43,    44,    45,    46,
-      47,     0,     0,   517,     0,     0,     0,     0,    48,     0,
+       0,    49,    50,     0,    51,     0,    52,    53,     0,    79,
+       0,     0,     0,    54,    93,    55,    56,    77,   519,    16,
+       0,    17,    18,    19,    20,    21,     0,     0,    22,    23,
+      24,    25,    26,     0,    27,    28,    29,    30,    31,    32,
+      80,    98,    81,    82,    33,    83,    84,    85,    86,    87,
+      88,     0,     0,     0,    89,    90,    91,    92,    34,     0,
+      35,    36,    37,    38,    39,    40,     0,     0,     0,     0,
+      41,    42,    43,    44,    45,    46,    47,     0,     0,     0,
+       0,     0,     0,     0,    48,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    49,    50,     0,    51,
+       0,    52,    53,     0,    79,     0,     0,     0,    54,    93,
+      55,    56,    77,   528,    16,     0,    17,    18,    19,    20,
+      21,     0,     0,    22,    23,    24,    25,    26,     0,    27,
+      28,    29,    30,    31,    32,    80,    98,    81,    82,    33,
+      83,    84,    85,    86,    87,    88,     0,     0,     0,    89,
+      90,    91,    92,    34,     0,    35,    36,    37,    38,    39,
+      40,     0,     0,     0,     0,    41,    42,    43,    44,    45,
+      46,    47,     0,     0,     0,     0,     0,     0,     0,    48,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      49,    50,     0,    51,     0,    52,    53,     0,    79,     0,
-       0,     0,    54,    93,    55,    56,    77,     0,    16,     0,
-      17,    18,    19,    20,    21,     0,     0,    22,    23,    24,
-      25,    26,     0,    27,    28,    29,    30,    31,    32,    80,
-      98,    81,    82,    33,    83,    84,    85,    86,    87,    88,
-       0,     0,     0,    89,    90,    91,    92,    34,     0,    35,
-      36,    37,    38,    39,    40,     0,     0,     0,     0,    41,
-      42,    43,    44,    45,    46,    47,     0,     0,     0,     0,
-       0,     0,     0,    48,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    49,    50,     0,    51,     0,
-      52,    53,     0,    79,     0,     0,     0,    54,    93,    55,
-      56,    77,     0,    16,     0,    17,    18,    19,    20,    21,
+       0,    49,    50,     0,    51,     0,    52,    53,     0,    79,
+       0,     0,     0,    54,    93,    55,    56,    77,     0,    16,
+       0,    17,    18,    19,    20,    21,     0,     0,    22,    23,
+      24,    25,    26,     0,    27,    28,    29,    30,    31,    32,
+      80,    98,    81,    82,    33,    83,    84,    85,    86,    87,
+      88,     0,     0,     0,    89,    90,    91,    92,    34,     0,
+      35,    36,    37,    38,    39,    40,     0,     0,     0,     0,
+      41,    42,    43,    44,    45,    46,    47,     0,     0,   535,
+       0,     0,     0,     0,    48,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    49,    50,     0,    51,
+       0,    52,    53,     0,    79,     0,     0,     0,    54,    93,
+      55,    56,    77,     0,    16,     0,    17,    18,    19,    20,
+      21,     0,     0,    22,    23,    24,    25,    26,     0,    27,
+      28,    29,    30,    31,    32,    80,    98,    81,    82,    33,
+      83,    84,    85,    86,    87,    88,     0,     0,     0,    89,
+      90,    91,    92,    34,     0,    35,    36,    37,    38,    39,
+      40,     0,     0,     0,     0,    41,    42,    43,    44,    45,
+      46,    47,     0,     0,     0,     0,     0,     0,     0,    48,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    49,    50,     0,    51,     0,    52,    53,     0,    79,
+       0,     0,     0,    54,    93,    55,    56,    77,     0,    16,
+       0,    17,    18,    19,    20,    21,     0,     0,    22,    23,
+      24,    25,    26,     0,    27,    28,    29,    30,    31,    32,
+      80,     0,    81,    82,    33,    83,    84,    85,    86,    87,
+      88,     0,     0,     0,    89,    90,    91,    92,    34,     0,
+      35,    36,    37,    38,    39,    40,     0,     0,     0,     0,
+      41,    42,    43,    44,    45,    46,    47,     0,     0,     0,
+       0,     0,     0,     0,    48,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    49,    50,     0,    51,
+       0,    52,    53,    79,     0,     0,     0,     0,    54,    93,
+      55,    56,     0,    16,     0,    17,    18,    19,    20,    21,
        0,     0,    22,    23,    24,    25,    26,     0,    27,    28,
-      29,    30,    31,    32,    80,     0,    81,    82,    33,    83,
-      84,    85,    86,    87,    88,     0,     0,     0,    89,    90,
-      91,    92,    34,     0,    35,    36,    37,    38,    39,    40,
+      29,    30,    31,    32,     0,     0,     0,     0,    33,     0,
+       0,  -268,     0,     0,     0,     0,     0,     0,   168,   169,
+     170,   171,    34,     0,    35,    36,    37,    38,    39,    40,
        0,     0,     0,     0,    41,    42,    43,    44,    45,    46,
-      47,     0,     0,     0,     0,     0,     0,     0,    48,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      47,   174,   175,   176,   177,   178,   179,   180,    48,     0,
+       0,     0,   181,     0,     0,   182,   183,   184,   185,     0,
       49,    50,     0,    51,     0,    52,    53,    79,     0,     0,
-       0,     0,    54,    93,    55,    56,     0,    16,     0,    17,
+       0,     0,    54,   -74,    55,    56,     0,    16,     0,    17,
       18,    19,    20,    21,     0,     0,    22,    23,    24,    25,
       26,     0,    27,    28,    29,    30,    31,    32,     0,     0,
-       0,     0,    33,     0,     0,  -252,     0,     0,     0,     0,
-       0,     0,   168,   169,   170,   171,    34,     0,    35,    36,
+       0,     0,    33,     0,     0,     0,     0,     0,     0,     0,
+     168,   169,   170,   171,     0,     0,    34,     0,    35,    36,
       37,    38,    39,    40,     0,     0,     0,     0,    41,    42,
-      43,    44,    45,    46,    47,   174,   175,   176,   177,   178,
-     179,   180,    48,     0,     0,     0,   181,     0,     0,   182,
-     183,   184,   185,     0,    49,    50,     0,    51,     0,    52,
-      53,    79,     0,     0,     0,     0,    54,   -74,    55,    56,
-       0,    16,     0,    17,    18,    19,    20,    21,     0,     0,
-      22,    23,    24,    25,    26,     0,    27,    28,    29,    30,
-      31,    32,     0,     0,     0,     0,    33,     0,     0,     0,
-       0,     0,     0,   168,   169,   170,   171,     0,     0,     0,
-      34,     0,    35,    36,    37,    38,    39,    40,     0,     0,
-       0,     0,    41,    42,    43,    44,    45,    46,    47,   177,
-     178,   179,   180,     0,     0,     0,    48,   181,     0,     0,
-     182,   183,   184,   185,     0,     0,     0,     0,    49,    50,
-       0,    51,     0,    52,    53,     0,     0,     0,     0,   -74,
-      54,     0,    55,    56,    77,     0,    16,     0,    17,    18,
-      19,    20,    21,     0,     0,   129,    23,    24,    25,    26,
-     109,    27,    28,    29,    30,    31,    32,     0,     0,     0,
-       0,    33,     0,     0,     0,     0,   168,  -252,   170,   171,
-       0,     0,     0,     0,     0,    34,     0,    35,    36,    37,
-      38,    39,    40,     0,     0,     0,     0,    41,    42,    43,
-      44,    45,    46,    47,   179,   180,     0,     0,     0,     0,
-     181,    48,     0,   182,   183,   184,   185,     0,     0,     0,
-       0,     0,     0,    49,    50,     0,    51,     0,    52,    53,
-       0,     0,     0,     0,     0,    54,     0,    55,    56,    77,
-       0,    16,     0,    17,    18,    19,    20,    21,     0,     0,
-      22,    23,    24,    25,    26,     0,    27,    28,    29,    30,
-      31,    32,     0,     0,     0,     0,    33,     0,     0,     0,
-       0,   168,   169,   170,   171,     0,     0,     0,     0,     0,
-      34,     0,    35,    36,    37,    38,    39,    40,     0,     0,
-       0,     0,    41,    42,    43,    44,    45,    46,    47,   179,
-     180,     0,     0,     0,     0,   181,    48,     0,   182,   183,
-     184,   185,     0,     0,     0,     0,     0,     0,    49,    50,
-       0,    51,     0,    52,    53,     0,     0,     0,     0,     0,
-      54,     0,    55,    56,    16,   104,    17,    18,    19,    20,
-      21,     0,     0,    22,    23,    24,    25,    26,     0,    27,
-      28,    29,    30,    31,    32,     0,     0,     0,     0,    33,
-     214,   215,   216,   217,     0,     0,     0,   218,     0,   219,
-       0,     0,     0,    34,     0,    35,    36,    37,    38,    39,
-      40,     0,     0,     0,     0,    41,    42,    43,    44,    45,
-      46,    47,     0,     0,   160,   161,   162,     0,     0,    48,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    49,    50,     0,    51,     0,    52,    53,     0,     0,
-       0,     0,     0,    54,     0,    55,    56,    16,     0,    17,
+      43,    44,    45,    46,    47,   176,   177,   178,   179,   180,
+       0,     0,    48,     0,   181,     0,     0,   182,   183,   184,
+     185,     0,     0,     0,    49,    50,     0,    51,     0,    52,
+      53,     0,     0,     0,     0,   -74,    54,     0,    55,    56,
+      77,     0,    16,     0,    17,    18,    19,    20,    21,     0,
+       0,   129,    23,    24,    25,    26,   109,    27,    28,    29,
+      30,    31,    32,     0,     0,     0,     0,    33,     0,     0,
+       0,     0,     0,     0,   168,   169,   170,   171,     0,     0,
+       0,    34,     0,    35,    36,    37,    38,    39,    40,     0,
+       0,     0,     0,    41,    42,    43,    44,    45,    46,    47,
+       0,   178,   179,   180,     0,     0,     0,    48,   181,     0,
+       0,   182,   183,   184,   185,     0,     0,     0,     0,    49,
+      50,     0,    51,     0,    52,    53,     0,     0,     0,     0,
+       0,    54,     0,    55,    56,    77,     0,    16,     0,    17,
       18,    19,    20,    21,     0,     0,    22,    23,    24,    25,
       26,     0,    27,    28,    29,    30,    31,    32,     0,     0,
-       0,     0,    33,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    34,     0,    35,    36,
+       0,     0,    33,     0,     0,     0,     0,   168,  -268,   170,
+     171,     0,     0,     0,     0,     0,    34,     0,    35,    36,
       37,    38,    39,    40,     0,     0,     0,     0,    41,    42,
-      43,    44,    45,    46,    47,     0,     0,     0,     0,     0,
-       0,     0,    48,     0,     0,     0,     0,     0,     0,     0,
+      43,    44,    45,    46,    47,   179,   180,     0,     0,     0,
+       0,   181,    48,     0,   182,   183,   184,   185,     0,     0,
        0,     0,     0,     0,    49,    50,     0,    51,     0,    52,
-      53,     0,     0,     0,     0,     0,    54,   137,    55,    56,
-      16,     0,    17,    18,    19,    20,    21,     0,     0,    22,
+      53,     0,     0,     0,     0,     0,    54,     0,    55,    56,
+      16,   104,    17,    18,    19,    20,    21,     0,     0,    22,
       23,    24,    25,    26,     0,    27,    28,    29,    30,    31,
       32,     0,     0,     0,     0,    33,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    34,
+     168,   169,   170,   171,     0,     0,     0,     0,     0,    34,
        0,    35,    36,    37,    38,    39,    40,     0,     0,     0,
-       0,    41,    42,    43,    44,    45,    46,    47,     0,     0,
-       0,     0,     0,     0,     0,    48,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    49,    50,     0,
-      51,     0,    52,    53,     0,     0,     0,     0,   156,    54,
+       0,    41,    42,    43,    44,    45,    46,    47,   179,   180,
+       0,     0,     0,     0,   181,    48,     0,   182,   183,   184,
+     185,     0,     0,     0,     0,     0,     0,    49,    50,     0,
+      51,     0,    52,    53,     0,     0,     0,     0,     0,    54,
        0,    55,    56,    16,     0,    17,    18,    19,    20,    21,
        0,     0,    22,    23,    24,    25,    26,     0,    27,    28,
       29,    30,    31,    32,     0,     0,     0,     0,    33,     0,
@@ -547,7 +538,7 @@ static const yytype_int16 yytable[] =
       47,     0,     0,     0,     0,     0,     0,     0,    48,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
       49,    50,     0,    51,     0,    52,    53,     0,     0,     0,
-       0,   234,    54,     0,    55,    56,    16,     0,    17,    18,
+       0,     0,    54,   137,    55,    56,    16,     0,    17,    18,
       19,    20,    21,     0,     0,    22,    23,    24,    25,    26,
        0,    27,    28,    29,    30,    31,    32,     0,     0,     0,
        0,    33,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -556,7 +547,7 @@ static const yytype_int16 yytable[] =
       44,    45,    46,    47,     0,     0,     0,     0,     0,     0,
        0,    48,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,    49,    50,     0,    51,     0,    52,    53,
-       0,     0,     0,     0,   248,    54,     0,    55,    56,    16,
+       0,     0,     0,     0,   156,    54,     0,    55,    56,    16,
        0,    17,    18,    19,    20,    21,     0,     0,    22,    23,
       24,    25,    26,     0,    27,    28,    29,    30,    31,    32,
        0,     0,     0,     0,    33,     0,     0,     0,     0,     0,
@@ -565,7 +556,7 @@ static const yytype_int16 yytable[] =
       41,    42,    43,    44,    45,    46,    47,     0,     0,     0,
        0,     0,     0,     0,    48,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,    49,    50,     0,    51,
-       0,    52,    53,     0,     0,     0,     0,   260,    54,     0,
+       0,    52,    53,     0,     0,     0,     0,   234,    54,     0,
       55,    56,    16,     0,    17,    18,    19,    20,    21,     0,
        0,    22,    23,    24,    25,    26,     0,    27,    28,    29,
       30,    31,    32,     0,     0,     0,     0,    33,     0,     0,
@@ -575,7 +566,7 @@ static const yytype_int16 yytable[] =
        0,     0,     0,     0,     0,     0,     0,    48,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,    49,
       50,     0,    51,     0,    52,    53,     0,     0,     0,     0,
-     289,    54,     0,    55,    56,    16,     0,    17,    18,    19,
+     248,    54,     0,    55,    56,    16,     0,    17,    18,    19,
       20,    21,     0,     0,    22,    23,    24,    25,    26,     0,
       27,    28,    29,    30,    31,    32,     0,     0,     0,     0,
       33,     0,     0,     0,     0,     0,     0,     0,     0,     0,
@@ -584,7 +575,7 @@ static const yytype_int16 yytable[] =
       45,    46,    47,     0,     0,     0,     0,     0,     0,     0,
       48,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,    49,    50,     0,    51,     0,    52,    53,     0,
-       0,     0,     0,   342,    54,     0,    55,    56,    16,     0,
+       0,     0,     0,   260,    54,     0,    55,    56,    16,     0,
       17,    18,    19,    20,    21,     0,     0,    22,    23,    24,
       25,    26,     0,    27,    28,    29,    30,    31,    32,     0,
        0,     0,     0,    33,     0,     0,     0,     0,     0,     0,
@@ -593,7 +584,7 @@ static const yytype_int16 yytable[] =
       42,    43,    44,    45,    46,    47,     0,     0,     0,     0,
        0,     0,     0,    48,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,    49,    50,     0,    51,     0,
-      52,    53,     0,     0,     0,     0,   359,    54,     0,    55,
+      52,    53,     0,     0,     0,     0,   289,    54,     0,    55,
       56,    16,     0,    17,    18,    19,    20,    21,     0,     0,
       22,    23,    24,    25,    26,     0,    27,    28,    29,    30,
       31,    32,     0,     0,     0,     0,    33,     0,     0,     0,
@@ -602,7 +593,7 @@ static const yytype_int16 yytable[] =
        0,     0,    41,    42,    43,    44,    45,    46,    47,     0,
        0,     0,     0,     0,     0,     0,    48,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,    49,    50,
-       0,    51,     0,    52,    53,     0,     0,     0,     0,     0,
+       0,    51,     0,    52,    53,     0,     0,     0,     0,   342,
       54,     0,    55,    56,    16,     0,    17,    18,    19,    20,
       21,     0,     0,    22,    23,    24,    25,    26,     0,    27,
       28,    29,    30,    31,    32,     0,     0,     0,     0,    33,
@@ -610,250 +601,247 @@ static const yytype_int16 yytable[] =
        0,     0,     0,    34,     0,    35,    36,    37,    38,    39,
       40,     0,     0,     0,     0,    41,    42,    43,    44,    45,
       46,    47,     0,     0,     0,     0,     0,     0,     0,    48,
-     167,     0,     0,     0,     0,     0,     0,   168,   169,   170,
-     171,    49,    50,     0,    51,     0,    52,    53,     0,     0,
-       0,     0,     0,   242,     0,    55,    56,   172,   173,   352,
-     174,   175,   176,   177,   178,   179,   180,     0,     0,     0,
-       0,   181,   167,     0,   182,   183,   184,   185,     0,   168,
-     169,   170,   171,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   172,
-     173,     0,   174,   175,   176,   177,   178,   179,   180,     0,
-       0,     0,     0,   181,   167,     0,   182,   183,   184,   185,
-       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,     0,     0,   182,   183,
-     184,   185
+       0,    49,    50,     0,    51,     0,    52,    53,     0,     0,
+       0,     0,   359,    54,     0,    55,    56,    16,     0,    17,
+      18,    19,    20,    21,     0,     0,    22,    23,    24,    25,
+      26,     0,    27,    28,    29,    30,    31,    32,     0,     0,
+       0,     0,    33,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    34,     0,    35,    36,
+      37,    38,    39,    40,     0,     0,     0,     0,    41,    42,
+      43,    44,    45,    46,    47,     0,     0,     0,     0,     0,
+       0,     0,    48,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    49,    50,     0,    51,     0,    52,
+      53,     0,     0,     0,     0,     0,    54,     0,    55,    56,
+      16,     0,    17,    18,    19,    20,    21,     0,     0,    22,
+      23,    24,    25,    26,     0,    27,    28,    29,    30,    31,
+      32,     0,     0,     0,     0,    33,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    34,
+       0,    35,    36,    37,    38,    39,    40,     0,     0,     0,
+       0,    41,    42,    43,    44,    45,    46,    47,     0,     0,
+       0,     0,     0,     0,     0,    48,   167,     0,     0,     0,
+       0,     0,     0,   168,   169,   170,   171,    49,    50,     0,
+      51,     0,    52,    53,     0,     0,     0,     0,     0,   242,
+       0,    55,    56,   172,   173,     0,   174,   175,   176,   177,
+     178,   179,   180,     0,     0,     0,     0,   181,   167,     0,
+     182,   183,   184,   185,     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,
+       0,     0,   182,   183,   184,   185
 };
 
 static const yytype_int16 yycheck[] =
 {
-      15,   126,   317,     9,    40,    46,   335,    46,     0,   115,
-      16,     9,    48,    10,     9,   426,     9,    77,    11,    23,
-       9,    11,    19,    20,    21,     9,    23,    24,    19,    20,
-      21,    20,    23,    24,   100,   141,    25,    43,    15,    16,
-       9,    11,    39,    40,    41,    42,   100,    77,    54,    40,
-      41,    20,    23,    11,   453,    20,    25,    11,    55,    56,
-      25,     9,   122,    11,    77,    56,     9,     9,    11,    11,
-      15,    16,    17,   307,   104,    43,    44,    15,    16,   115,
-     100,   100,     9,   317,    11,     9,   320,   321,     9,    12,
-      11,     9,   421,    11,   505,    92,   100,   133,   100,    69,
-     225,     9,   143,   101,   143,   141,   101,   100,    98,    12,
-      20,    69,   118,   102,   103,    12,   515,   446,   100,   125,
-     126,    69,    67,    45,   121,   102,    69,    69,   100,   126,
-     101,    12,     9,   102,    11,   126,   100,    12,   144,   199,
-     200,   201,   202,   203,    12,   205,   206,   100,   208,   209,
-      73,    74,    75,    91,   160,   161,   162,   102,   164,   165,
-     166,   395,   100,   204,   102,   204,    95,    96,    97,    98,
-      73,    74,    75,    73,    74,    75,    73,    74,    75,   194,
-     186,   187,   188,   189,   190,   191,   192,   193,   100,     9,
-     226,    11,    73,    74,    75,   429,   430,   512,    73,    74,
-      75,   101,    12,   101,   100,    73,    74,    75,   214,   215,
-     216,   217,   218,   219,   211,    17,    18,   100,   100,   225,
-      12,    99,    10,    12,   458,    99,    69,   333,    30,    20,
-      11,   237,    34,    20,    67,    91,   242,    39,   363,   100,
-      42,   100,    69,    45,    99,    47,   252,    49,    50,    51,
-      52,    53,    10,    23,     9,    11,    11,   491,    91,   319,
-      15,    16,    17,    73,    74,    75,    21,   100,    75,   102,
-      18,   277,   278,   103,    73,    74,    75,   318,   284,   318,
-     103,    73,    74,    75,    73,    74,    75,   103,   285,   103,
-     103,    73,    74,    75,    73,    74,    75,   333,   304,   305,
-     306,   307,   101,    39,    40,    41,    42,    62,    20,   102,
-      46,   317,    48,   373,   320,   321,   376,   377,   424,   101,
-      99,    99,    19,    20,    21,   100,    23,    24,   388,    73,
-      74,    75,    73,    74,    75,   100,   100,    73,    74,    75,
-     337,   143,   348,    40,    41,   100,    23,   102,   103,    46,
-      10,    23,    73,    74,    75,    99,    20,   363,    55,    56,
-     101,   163,    10,    99,    10,   167,   168,   169,   170,   171,
-     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
-     101,   456,    73,    74,    75,    73,    74,    75,   424,   395,
-      10,   428,    89,   399,   431,   470,   471,    10,   435,   436,
-      99,    99,    73,    74,    75,    99,    99,   482,   100,    99,
-     101,    99,   449,   450,    73,    74,    75,   492,   493,    73,
-      74,    75,   459,   429,   430,   440,   101,    60,    61,   126,
-     101,   506,   447,    99,    99,     9,   473,    99,     0,    10,
-     477,   478,    99,    99,     9,    99,   143,     9,   445,    11,
-      12,   457,   458,    86,    87,    99,   101,   472,   495,    92,
-     100,    71,    95,    96,    97,    98,    58,    59,    60,    61,
-     485,   101,    99,    99,   511,     9,   100,    39,    40,    41,
-      42,    70,   519,   101,    46,   491,    48,    99,   185,    51,
-      19,    99,   507,    85,    86,    87,    58,    59,    60,    61,
-      92,    99,    12,    95,    96,    97,    98,   204,    98,   305,
-     457,    73,    74,    75,   196,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    58,    59,    60,    61,
-      92,   512,    33,    95,    96,    97,    98,    99,    82,   101,
-     375,    58,   104,    60,    61,     0,    73,    74,    75,   244,
-     352,    83,    84,    85,    86,    87,   422,    12,   143,   318,
-      92,   204,    60,    95,    96,    97,    98,    -1,    -1,    86,
-      87,    -1,    99,    -1,    -1,    92,    -1,    -1,    95,    96,
-      97,    98,    -1,    -1,    39,    40,    41,    42,   285,    87,
-      -1,    46,    -1,    48,    92,    -1,    51,    95,    96,    97,
-      98,    -1,    -1,    58,    59,    60,    61,    73,    74,    75,
-      -1,    -1,   309,    73,    74,    75,    -1,    -1,    73,    74,
-      75,   318,    77,    78,    79,    80,    81,    82,    83,    84,
-      85,    86,    87,    99,    -1,    -1,    -1,    92,    -1,    99,
-      95,    96,    97,    98,    99,    -1,   101,     0,     1,   104,
-      -1,    -1,    -1,    -1,    -1,    -1,     9,    -1,    11,    -1,
-      13,    14,    15,    16,    17,    -1,    -1,    20,    21,    22,
-      23,    24,    -1,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      60,    61,    -1,    46,    47,    48,    49,    50,    -1,    52,
-      53,    54,    55,    56,    57,    73,    74,    75,    -1,    62,
-      63,    64,    65,    66,    67,    68,    -1,    87,    -1,    -1,
-      -1,    -1,    92,    76,    -1,    95,    96,    97,    98,    -1,
-      -1,    99,    -1,    -1,    -1,    88,    89,    -1,    91,    -1,
-      93,    94,     0,     1,    -1,    -1,    -1,   100,   101,   102,
-     103,     9,    -1,    11,    -1,    13,    14,    15,    16,    17,
-      -1,    -1,    20,    21,    22,    23,    24,    -1,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    -1,    -1,    -1,    46,    47,
-      48,    49,    50,    -1,    52,    53,    54,    55,    56,    57,
-      -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,    67,
-      68,    87,    -1,    -1,    -1,    -1,    92,    -1,    76,    95,
-      96,    97,    98,    92,    -1,    -1,    95,    96,    97,    98,
-      88,    89,    -1,    91,    -1,    93,    94,    -1,     1,    -1,
-      -1,    -1,   100,   101,   102,   103,     9,    10,    11,    -1,
-      13,    14,    15,    16,    17,    -1,    -1,    20,    21,    22,
-      23,    24,    -1,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,    52,
-      53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,    62,
-      63,    64,    65,    66,    67,    68,     3,     4,     5,     6,
-       7,     8,    -1,    76,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,    -1,
-      93,    94,    -1,     1,    -1,    -1,    -1,   100,   101,   102,
-     103,     9,    10,    11,    -1,    13,    14,    15,    16,    17,
-      -1,    -1,    20,    21,    22,    23,    24,    -1,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    -1,    -1,    -1,    46,    47,
-      48,    49,    50,    -1,    52,    53,    54,    55,    56,    57,
-      -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,    67,
-      68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,    -1,
+      15,   126,   317,     9,    40,   335,   426,     9,    11,   115,
+      16,    46,    48,    46,     9,    23,     9,    77,    11,    11,
+      10,     0,   461,    19,    20,    21,    23,    23,    24,    19,
+      20,    21,   100,    23,    24,   141,    20,    43,    15,    16,
+      17,    25,    17,    18,    40,    41,    15,    16,    54,    39,
+      40,    41,    42,     9,   100,    30,     9,     9,    11,    34,
+      56,     9,   122,    11,    39,    55,    56,    42,    20,     9,
+      45,   100,    47,    25,    49,    50,    51,    52,    53,   115,
+      20,     9,   100,    11,     9,    25,    11,    15,    16,    17,
+      67,   421,   100,    21,   533,    98,    77,   133,     9,   101,
+     225,   307,    92,   523,   101,   141,   101,   100,   143,    11,
+     143,   317,   118,    77,   320,   321,    69,   100,    11,   125,
+     126,    69,     9,   104,   454,   102,    20,    15,    16,   100,
+     126,   121,   100,   102,    62,     9,   126,    11,   144,   199,
+     200,   201,   202,   203,    69,   205,   206,    45,   208,   209,
+     102,   103,    15,    16,   160,   161,   162,   100,   164,   165,
+     166,   100,   102,    73,    74,    75,   100,    69,   143,   204,
+     100,   204,   100,   100,   102,   103,    69,    43,    44,   194,
+     186,   187,   188,   189,   190,   191,   192,   193,   163,   395,
+     226,   101,   167,   168,   169,   170,   171,   172,   173,   174,
+     175,   176,   177,   178,   179,   180,   181,    12,   214,   215,
+     216,   217,   218,   219,   102,   530,    67,   101,     9,   225,
+      11,   211,   100,   429,   430,    10,    99,   333,    91,    12,
+       9,   237,    11,    73,    74,    75,   242,   100,   363,   102,
+      91,    99,    12,    73,    74,    75,   252,    12,     9,   100,
+      11,   102,    19,    20,    21,    69,    23,    24,    12,   319,
+     466,   101,    12,    11,    20,    73,    74,    75,    73,    74,
+      75,   277,   278,    40,    41,     9,    12,    11,   284,    46,
+      20,    91,    12,   318,   100,   318,    99,    12,    55,    56,
+      73,    74,    75,   101,   100,   285,    69,   333,   304,   305,
+     306,   307,   508,    73,    74,    75,    10,    23,    73,    74,
+      75,   317,    11,   373,   320,   321,   376,   377,   424,    73,
+      74,    75,    89,    73,    74,    75,    75,   103,   388,    73,
+      74,    75,   103,   428,   103,   103,   431,    73,    74,    75,
+     435,   436,   348,    73,    74,    75,   103,   337,    73,    74,
+      75,    39,    40,    41,    42,    99,    18,   363,    46,   126,
+      48,   464,   457,   458,    39,    40,    41,    42,    73,    74,
+      75,    46,   467,    48,   100,    20,   143,   352,    60,    61,
+     483,   484,    73,    74,    75,    73,    74,    75,   424,   395,
+     100,   486,   495,   399,    99,   490,   491,   100,    73,    74,
+      75,   102,    99,    23,    86,    87,   509,   510,    99,    23,
+      92,    99,    10,    95,    96,    97,    98,   512,   185,    10,
+      51,   524,    10,   429,   430,    10,    10,    58,    59,    60,
+      61,    20,    99,   448,   529,    99,    99,   204,    99,    99,
+     455,   100,   537,    73,    74,    75,   101,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    99,    99,   465,
+     466,    92,    99,   453,    95,    96,    97,    98,     9,   101,
+     485,   101,    73,    74,    75,    10,    99,    58,    59,    60,
+      61,    73,    74,    75,   100,     0,     9,   502,    99,    25,
+      77,    73,    74,    75,     9,    99,    11,    12,    71,   101,
+     101,    78,   508,    84,    85,    86,    87,   100,     9,   101,
+     525,    92,    19,    99,    95,    96,    97,    98,   285,   101,
+      99,   496,    70,   101,    39,    40,    41,    42,    73,    74,
+      75,    46,    99,    48,    92,    99,    51,    95,    96,    97,
+      98,    12,   309,    58,    59,    60,    61,    99,    73,    74,
+      75,   318,    98,   465,    99,    33,   530,   196,    73,    74,
+      75,     0,    77,    78,    79,    80,    81,    82,    83,    84,
+      85,    86,    87,    12,    99,   375,    58,    92,    60,    61,
+      95,    96,    97,    98,    99,    87,   101,   305,    82,   104,
+      92,    60,    61,    95,    96,    97,    98,   244,   442,   422,
+      39,    40,    41,    42,    86,    87,   473,    46,   472,    48,
+      92,   143,    51,    95,    96,    97,    98,    -1,    87,    58,
+      59,    60,    61,    92,   318,    -1,    95,    96,    97,    98,
+      95,    96,    97,    98,    73,    74,    75,    -1,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    73,
+      74,    75,    -1,    92,   204,    -1,    95,    96,    97,    98,
+      99,    -1,   101,     0,     1,   104,    -1,    -1,    -1,    -1,
+      -1,    -1,     9,    -1,    11,    99,    13,    14,    15,    16,
+      17,    -1,    -1,    20,    21,    22,    23,    24,    -1,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    60,    -1,    -1,    46,
+      47,    48,    49,    50,    -1,    52,    53,    54,    55,    56,
+      57,    73,    74,    75,    -1,    62,    63,    64,    65,    66,
+      67,    68,    -1,    87,    73,    74,    75,    -1,    92,    76,
+      -1,    95,    96,    97,    98,    -1,    -1,    99,    -1,    -1,
+      -1,    88,    89,    -1,    91,    -1,    93,    94,     0,     1,
+      99,    -1,    -1,   100,   101,   102,   103,     9,    -1,    11,
+      -1,    13,    14,    15,    16,    17,    -1,    -1,    20,    21,
+      22,    23,    24,    -1,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,
+      52,    53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,
+      62,    63,    64,    65,    66,    67,    68,     3,     4,     5,
+       6,     7,     8,    -1,    76,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,
+      -1,    93,    94,    -1,     1,    -1,    -1,    -1,   100,   101,
+     102,   103,     9,    10,    11,    -1,    13,    14,    15,    16,
+      17,    -1,    -1,    20,    21,    22,    23,    24,    -1,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    -1,    -1,    -1,    46,
+      47,    48,    49,    50,    -1,    52,    53,    54,    55,    56,
+      57,    -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,
+      67,    68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      88,    89,    -1,    91,    -1,    93,    94,    -1,     1,    -1,
-      -1,    -1,   100,   101,   102,   103,     9,    10,    11,    -1,
-      13,    14,    15,    16,    17,    -1,    -1,    20,    21,    22,
-      23,    24,    -1,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,    52,
-      53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,    62,
-      63,    64,    65,    66,    67,    68,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,    -1,
-      93,    94,    -1,     1,    -1,    -1,    -1,   100,   101,   102,
-     103,     9,    10,    11,    -1,    13,    14,    15,    16,    17,
-      -1,    -1,    20,    21,    22,    23,    24,    -1,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    -1,    -1,    -1,    46,    47,
-      48,    49,    50,    -1,    52,    53,    54,    55,    56,    57,
-      -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,    67,
-      68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,    -1,
+      -1,    88,    89,    -1,    91,    -1,    93,    94,    -1,     1,
+      -1,    -1,    -1,   100,   101,   102,   103,     9,    10,    11,
+      -1,    13,    14,    15,    16,    17,    -1,    -1,    20,    21,
+      22,    23,    24,    -1,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,
+      52,    53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,
+      62,    63,    64,    65,    66,    67,    68,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,
+      -1,    93,    94,    -1,     1,    -1,    -1,    -1,   100,   101,
+     102,   103,     9,    10,    11,    -1,    13,    14,    15,    16,
+      17,    -1,    -1,    20,    21,    22,    23,    24,    -1,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    -1,    -1,    -1,    46,
+      47,    48,    49,    50,    -1,    52,    53,    54,    55,    56,
+      57,    -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,
+      67,    68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      88,    89,    -1,    91,    -1,    93,    94,    -1,     1,    -1,
-      -1,    -1,   100,   101,   102,   103,     9,    10,    11,    -1,
-      13,    14,    15,    16,    17,    -1,    -1,    20,    21,    22,
-      23,    24,    -1,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,    52,
-      53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,    62,
-      63,    64,    65,    66,    67,    68,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,    -1,
-      93,    94,    -1,     1,    -1,    -1,    -1,   100,   101,   102,
-     103,     9,    -1,    11,    -1,    13,    14,    15,    16,    17,
-      -1,    -1,    20,    21,    22,    23,    24,    -1,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    -1,    -1,    -1,    46,    47,
-      48,    49,    50,    -1,    52,    53,    54,    55,    56,    57,
-      -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,    67,
-      68,    -1,    -1,    71,    -1,    -1,    -1,    -1,    76,    -1,
+      -1,    88,    89,    -1,    91,    -1,    93,    94,    -1,     1,
+      -1,    -1,    -1,   100,   101,   102,   103,     9,    10,    11,
+      -1,    13,    14,    15,    16,    17,    -1,    -1,    20,    21,
+      22,    23,    24,    -1,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,
+      52,    53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,
+      62,    63,    64,    65,    66,    67,    68,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,
+      -1,    93,    94,    -1,     1,    -1,    -1,    -1,   100,   101,
+     102,   103,     9,    10,    11,    -1,    13,    14,    15,    16,
+      17,    -1,    -1,    20,    21,    22,    23,    24,    -1,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    -1,    -1,    -1,    46,
+      47,    48,    49,    50,    -1,    52,    53,    54,    55,    56,
+      57,    -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,
+      67,    68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      88,    89,    -1,    91,    -1,    93,    94,    -1,     1,    -1,
-      -1,    -1,   100,   101,   102,   103,     9,    -1,    11,    -1,
-      13,    14,    15,    16,    17,    -1,    -1,    20,    21,    22,
-      23,    24,    -1,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,    52,
-      53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,    62,
-      63,    64,    65,    66,    67,    68,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,    -1,
-      93,    94,    -1,     1,    -1,    -1,    -1,   100,   101,   102,
-     103,     9,    -1,    11,    -1,    13,    14,    15,    16,    17,
+      -1,    88,    89,    -1,    91,    -1,    93,    94,    -1,     1,
+      -1,    -1,    -1,   100,   101,   102,   103,     9,    -1,    11,
+      -1,    13,    14,    15,    16,    17,    -1,    -1,    20,    21,
+      22,    23,    24,    -1,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,
+      52,    53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,
+      62,    63,    64,    65,    66,    67,    68,    -1,    -1,    71,
+      -1,    -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,
+      -1,    93,    94,    -1,     1,    -1,    -1,    -1,   100,   101,
+     102,   103,     9,    -1,    11,    -1,    13,    14,    15,    16,
+      17,    -1,    -1,    20,    21,    22,    23,    24,    -1,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    38,    39,    40,    41,    42,    -1,    -1,    -1,    46,
+      47,    48,    49,    50,    -1,    52,    53,    54,    55,    56,
+      57,    -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,
+      67,    68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    88,    89,    -1,    91,    -1,    93,    94,    -1,     1,
+      -1,    -1,    -1,   100,   101,   102,   103,     9,    -1,    11,
+      -1,    13,    14,    15,    16,    17,    -1,    -1,    20,    21,
+      22,    23,    24,    -1,    26,    27,    28,    29,    30,    31,
+      32,    -1,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    -1,    -1,    -1,    46,    47,    48,    49,    50,    -1,
+      52,    53,    54,    55,    56,    57,    -1,    -1,    -1,    -1,
+      62,    63,    64,    65,    66,    67,    68,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    -1,    91,
+      -1,    93,    94,     1,    -1,    -1,    -1,    -1,   100,   101,
+     102,   103,    -1,    11,    -1,    13,    14,    15,    16,    17,
       -1,    -1,    20,    21,    22,    23,    24,    -1,    26,    27,
-      28,    29,    30,    31,    32,    -1,    34,    35,    36,    37,
-      38,    39,    40,    41,    42,    -1,    -1,    -1,    46,    47,
-      48,    49,    50,    -1,    52,    53,    54,    55,    56,    57,
+      28,    29,    30,    31,    -1,    -1,    -1,    -1,    36,    -1,
+      -1,    51,    -1,    -1,    -1,    -1,    -1,    -1,    58,    59,
+      60,    61,    50,    -1,    52,    53,    54,    55,    56,    57,
       -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,    67,
-      68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      68,    81,    82,    83,    84,    85,    86,    87,    76,    -1,
+      -1,    -1,    92,    -1,    -1,    95,    96,    97,    98,    -1,
       88,    89,    -1,    91,    -1,    93,    94,     1,    -1,    -1,
       -1,    -1,   100,   101,   102,   103,    -1,    11,    -1,    13,
       14,    15,    16,    17,    -1,    -1,    20,    21,    22,    23,
       24,    -1,    26,    27,    28,    29,    30,    31,    -1,    -1,
-      -1,    -1,    36,    -1,    -1,    51,    -1,    -1,    -1,    -1,
-      -1,    -1,    58,    59,    60,    61,    50,    -1,    52,    53,
+      -1,    -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      58,    59,    60,    61,    -1,    -1,    50,    -1,    52,    53,
       54,    55,    56,    57,    -1,    -1,    -1,    -1,    62,    63,
-      64,    65,    66,    67,    68,    81,    82,    83,    84,    85,
-      86,    87,    76,    -1,    -1,    -1,    92,    -1,    -1,    95,
-      96,    97,    98,    -1,    88,    89,    -1,    91,    -1,    93,
-      94,     1,    -1,    -1,    -1,    -1,   100,   101,   102,   103,
-      -1,    11,    -1,    13,    14,    15,    16,    17,    -1,    -1,
-      20,    21,    22,    23,    24,    -1,    26,    27,    28,    29,
-      30,    31,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,
-      -1,    -1,    -1,    58,    59,    60,    61,    -1,    -1,    -1,
-      50,    -1,    52,    53,    54,    55,    56,    57,    -1,    -1,
-      -1,    -1,    62,    63,    64,    65,    66,    67,    68,    84,
-      85,    86,    87,    -1,    -1,    -1,    76,    92,    -1,    -1,
-      95,    96,    97,    98,    -1,    -1,    -1,    -1,    88,    89,
-      -1,    91,    -1,    93,    94,    -1,    -1,    -1,    -1,    99,
-     100,    -1,   102,   103,     9,    -1,    11,    -1,    13,    14,
-      15,    16,    17,    -1,    -1,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    -1,    -1,    -1,
-      -1,    36,    -1,    -1,    -1,    -1,    58,    59,    60,    61,
-      -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    53,    54,
-      55,    56,    57,    -1,    -1,    -1,    -1,    62,    63,    64,
-      65,    66,    67,    68,    86,    87,    -1,    -1,    -1,    -1,
-      92,    76,    -1,    95,    96,    97,    98,    -1,    -1,    -1,
-      -1,    -1,    -1,    88,    89,    -1,    91,    -1,    93,    94,
-      -1,    -1,    -1,    -1,    -1,   100,    -1,   102,   103,     9,
-      -1,    11,    -1,    13,    14,    15,    16,    17,    -1,    -1,
-      20,    21,    22,    23,    24,    -1,    26,    27,    28,    29,
-      30,    31,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,
-      -1,    58,    59,    60,    61,    -1,    -1,    -1,    -1,    -1,
-      50,    -1,    52,    53,    54,    55,    56,    57,    -1,    -1,
-      -1,    -1,    62,    63,    64,    65,    66,    67,    68,    86,
-      87,    -1,    -1,    -1,    -1,    92,    76,    -1,    95,    96,
-      97,    98,    -1,    -1,    -1,    -1,    -1,    -1,    88,    89,
-      -1,    91,    -1,    93,    94,    -1,    -1,    -1,    -1,    -1,
-     100,    -1,   102,   103,    11,    12,    13,    14,    15,    16,
-      17,    -1,    -1,    20,    21,    22,    23,    24,    -1,    26,
-      27,    28,    29,    30,    31,    -1,    -1,    -1,    -1,    36,
-      39,    40,    41,    42,    -1,    -1,    -1,    46,    -1,    48,
-      -1,    -1,    -1,    50,    -1,    52,    53,    54,    55,    56,
-      57,    -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,
-      67,    68,    -1,    -1,    73,    74,    75,    -1,    -1,    76,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    88,    89,    -1,    91,    -1,    93,    94,    -1,    -1,
-      -1,    -1,    -1,   100,    -1,   102,   103,    11,    -1,    13,
+      64,    65,    66,    67,    68,    83,    84,    85,    86,    87,
+      -1,    -1,    76,    -1,    92,    -1,    -1,    95,    96,    97,
+      98,    -1,    -1,    -1,    88,    89,    -1,    91,    -1,    93,
+      94,    -1,    -1,    -1,    -1,    99,   100,    -1,   102,   103,
+       9,    -1,    11,    -1,    13,    14,    15,    16,    17,    -1,
+      -1,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    -1,    -1,    -1,    -1,    36,    -1,    -1,
+      -1,    -1,    -1,    -1,    58,    59,    60,    61,    -1,    -1,
+      -1,    50,    -1,    52,    53,    54,    55,    56,    57,    -1,
+      -1,    -1,    -1,    62,    63,    64,    65,    66,    67,    68,
+      -1,    85,    86,    87,    -1,    -1,    -1,    76,    92,    -1,
+      -1,    95,    96,    97,    98,    -1,    -1,    -1,    -1,    88,
+      89,    -1,    91,    -1,    93,    94,    -1,    -1,    -1,    -1,
+      -1,   100,    -1,   102,   103,     9,    -1,    11,    -1,    13,
       14,    15,    16,    17,    -1,    -1,    20,    21,    22,    23,
       24,    -1,    26,    27,    28,    29,    30,    31,    -1,    -1,
-      -1,    -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    53,
+      -1,    -1,    36,    -1,    -1,    -1,    -1,    58,    59,    60,
+      61,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    53,
       54,    55,    56,    57,    -1,    -1,    -1,    -1,    62,    63,
-      64,    65,    66,    67,    68,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      64,    65,    66,    67,    68,    86,    87,    -1,    -1,    -1,
+      -1,    92,    76,    -1,    95,    96,    97,    98,    -1,    -1,
       -1,    -1,    -1,    -1,    88,    89,    -1,    91,    -1,    93,
-      94,    -1,    -1,    -1,    -1,    -1,   100,   101,   102,   103,
-      11,    -1,    13,    14,    15,    16,    17,    -1,    -1,    20,
+      94,    -1,    -1,    -1,    -1,    -1,   100,    -1,   102,   103,
+      11,    12,    13,    14,    15,    16,    17,    -1,    -1,    20,
       21,    22,    23,    24,    -1,    26,    27,    28,    29,    30,
       31,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,
+      58,    59,    60,    61,    -1,    -1,    -1,    -1,    -1,    50,
       -1,    52,    53,    54,    55,    56,    57,    -1,    -1,    -1,
-      -1,    62,    63,    64,    65,    66,    67,    68,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    76,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    -1,
-      91,    -1,    93,    94,    -1,    -1,    -1,    -1,    99,   100,
+      -1,    62,    63,    64,    65,    66,    67,    68,    86,    87,
+      -1,    -1,    -1,    -1,    92,    76,    -1,    95,    96,    97,
+      98,    -1,    -1,    -1,    -1,    -1,    -1,    88,    89,    -1,
+      91,    -1,    93,    94,    -1,    -1,    -1,    -1,    -1,   100,
       -1,   102,   103,    11,    -1,    13,    14,    15,    16,    17,
       -1,    -1,    20,    21,    22,    23,    24,    -1,    26,    27,
       28,    29,    30,    31,    -1,    -1,    -1,    -1,    36,    -1,
@@ -863,7 +851,7 @@ static const yytype_int16 yycheck[] =
       68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       88,    89,    -1,    91,    -1,    93,    94,    -1,    -1,    -1,
-      -1,    99,   100,    -1,   102,   103,    11,    -1,    13,    14,
+      -1,    -1,   100,   101,   102,   103,    11,    -1,    13,    14,
       15,    16,    17,    -1,    -1,    20,    21,    22,    23,    24,
       -1,    26,    27,    28,    29,    30,    31,    -1,    -1,    -1,
       -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
@@ -918,7 +906,7 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    62,    63,    64,    65,    66,    67,    68,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    76,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    88,    89,
-      -1,    91,    -1,    93,    94,    -1,    -1,    -1,    -1,    -1,
+      -1,    91,    -1,    93,    94,    -1,    -1,    -1,    -1,    99,
      100,    -1,   102,   103,    11,    -1,    13,    14,    15,    16,
       17,    -1,    -1,    20,    21,    22,    23,    24,    -1,    26,
       27,    28,    29,    30,    31,    -1,    -1,    -1,    -1,    36,
@@ -926,20 +914,34 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,    50,    -1,    52,    53,    54,    55,    56,
       57,    -1,    -1,    -1,    -1,    62,    63,    64,    65,    66,
       67,    68,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    76,
-      51,    -1,    -1,    -1,    -1,    -1,    -1,    58,    59,    60,
-      61,    88,    89,    -1,    91,    -1,    93,    94,    -1,    -1,
-      -1,    -1,    -1,   100,    -1,   102,   103,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    -1,    -1,    -1,
-      -1,    92,    51,    -1,    95,    96,    97,    98,    -1,    58,
-      59,    60,    61,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    78,
-      79,    -1,    81,    82,    83,    84,    85,    86,    87,    -1,
-      -1,    -1,    -1,    92,    51,    -1,    95,    96,    97,    98,
-      -1,    58,    59,    60,    61,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    79,    -1,    81,    82,    83,    84,    85,    86,
-      87,    -1,    -1,    -1,    -1,    92,    -1,    -1,    95,    96,
-      97,    98
+      -1,    88,    89,    -1,    91,    -1,    93,    94,    -1,    -1,
+      -1,    -1,    99,   100,    -1,   102,   103,    11,    -1,    13,
+      14,    15,    16,    17,    -1,    -1,    20,    21,    22,    23,
+      24,    -1,    26,    27,    28,    29,    30,    31,    -1,    -1,
+      -1,    -1,    36,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    53,
+      54,    55,    56,    57,    -1,    -1,    -1,    -1,    62,    63,
+      64,    65,    66,    67,    68,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    88,    89,    -1,    91,    -1,    93,
+      94,    -1,    -1,    -1,    -1,    -1,   100,    -1,   102,   103,
+      11,    -1,    13,    14,    15,    16,    17,    -1,    -1,    20,
+      21,    22,    23,    24,    -1,    26,    27,    28,    29,    30,
+      31,    -1,    -1,    -1,    -1,    36,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,
+      -1,    52,    53,    54,    55,    56,    57,    -1,    -1,    -1,
+      -1,    62,    63,    64,    65,    66,    67,    68,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    76,    51,    -1,    -1,    -1,
+      -1,    -1,    -1,    58,    59,    60,    61,    88,    89,    -1,
+      91,    -1,    93,    94,    -1,    -1,    -1,    -1,    -1,   100,
+      -1,   102,   103,    78,    79,    -1,    81,    82,    83,    84,
+      85,    86,    87,    -1,    -1,    -1,    -1,    92,    51,    -1,
+      95,    96,    97,    98,    -1,    58,    59,    60,    61,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    79,    -1,    81,    82,
+      83,    84,    85,    86,    87,    -1,    -1,    -1,    -1,    92,
+      -1,    -1,    95,    96,    97,    98
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -951,54 +953,55 @@ static const yytype_uint8 yystos[] =
       16,    17,    20,    21,    22,    23,    24,    26,    27,    28,
       29,    30,    31,    36,    50,    52,    53,    54,    55,    56,
       57,    62,    63,    64,    65,    66,    67,    68,    76,    88,
-      89,    91,    93,    94,   100,   102,   103,   152,   153,   154,
-     157,   158,   159,   160,   161,   162,   164,   167,   173,   174,
-     175,   176,   177,   178,   179,   180,   181,     9,   113,     1,
+      89,    91,    93,    94,   100,   102,   103,   160,   161,   162,
+     165,   166,   167,   168,   169,   170,   172,   175,   181,   182,
+     183,   184,   185,   186,   187,   188,   189,     9,   113,     1,
       32,    34,    35,    37,    38,    39,    40,    41,    42,    46,
-      47,    48,    49,   101,   113,   122,   132,   152,    33,   120,
-     121,   122,   118,   118,    12,   152,   162,   162,    20,    25,
-     113,   174,   182,   182,   182,   182,   182,   163,    11,   100,
-     162,   143,   143,   162,   100,   100,   100,   113,   162,    20,
-     153,   166,   174,   182,   182,   113,   162,   101,   152,    20,
-      25,   145,   162,    91,   100,   165,   174,   175,   176,   162,
-     153,   162,   162,   162,   162,   162,    99,   152,   182,   182,
+      47,    48,    49,   101,   113,   122,   132,   160,    33,   120,
+     121,   122,   118,   118,    12,   160,   170,   170,    20,    25,
+     113,   182,   190,   190,   190,   190,   190,   171,    11,   100,
+     170,   143,   143,   170,   100,   100,   100,   113,   170,    20,
+     161,   174,   182,   190,   190,   113,   170,   101,   160,    20,
+      25,   145,   170,    91,   100,   173,   182,   183,   184,   170,
+     161,   170,   170,   170,   170,   170,    99,   160,   190,   190,
       73,    74,    75,    77,     9,    11,   100,    51,    58,    59,
       60,    61,    78,    79,    81,    82,    83,    84,    85,    86,
       87,    92,    95,    96,    97,    98,   100,     9,    11,     9,
       11,     9,    11,     9,   115,   144,   145,    20,   142,   100,
-     100,   100,   100,    67,    91,   100,   172,   174,   100,   100,
+     100,   100,   100,    67,    91,   100,   180,   182,   100,   100,
      113,    45,   134,   101,    39,    40,    41,    42,    46,    48,
-     121,   122,   120,    12,   166,   100,   100,   152,    99,   113,
-      23,   115,   146,    99,    99,   152,   167,   182,   153,    10,
-     101,   166,   100,   162,   165,   174,   175,   176,    99,   152,
-      69,   148,    11,    99,   152,   152,   152,   162,   152,   152,
-      99,   152,   162,   162,   162,   162,   162,   162,   162,   162,
-     162,   162,   162,   162,   162,   162,   162,     9,    11,    15,
-      16,    17,    21,    62,   100,   102,   103,   156,   174,    99,
-     152,   152,   152,   152,   152,   152,   152,   152,   118,    20,
+     121,   122,   120,    12,   174,   100,   100,   160,    99,   113,
+      23,   115,   146,    99,    99,   160,   175,   190,   161,    10,
+     101,   174,   100,   170,   173,   182,   183,   184,    99,   160,
+      69,   148,    11,    99,   160,   160,   160,   170,   160,   160,
+      99,   160,   170,   170,   170,   170,   170,   170,   170,   170,
+     170,   170,   170,   170,   170,   170,   170,     9,    11,    15,
+      16,    17,    21,    62,   100,   102,   103,   164,   182,    99,
+     160,   160,   160,   160,   160,   160,   160,   160,   118,    20,
      141,   142,    20,   125,   115,   115,   115,   115,    91,   115,
-      67,   170,   171,   173,   174,   175,   176,   115,   115,   100,
-     115,   115,   113,   152,   138,   152,   152,   152,   152,   152,
-     167,   153,    12,   155,   100,   149,    69,   147,    99,    99,
-     152,    10,    99,   152,   148,    99,    23,   152,    11,   101,
-      12,    99,    80,   152,   152,   103,   103,   103,   103,    99,
-     152,   103,   103,   100,    99,   101,    12,   101,    12,   101,
+      67,   178,   179,   181,   182,   183,   184,   115,   115,   100,
+     115,   115,   113,   160,   138,   160,   160,   160,   160,   160,
+     175,   161,    12,   163,   100,   157,    69,   147,    99,    99,
+     160,    10,    99,   160,   148,    99,    23,   160,    11,   101,
+      12,    99,    80,   160,   160,   103,   103,   103,   103,    99,
+     160,   103,   103,   100,    99,   101,    12,   101,    12,   101,
       12,   101,    10,    18,   114,   123,   124,     9,   101,    20,
-     137,   152,   138,   139,   152,   139,   169,   174,   100,   132,
-     136,   139,   140,   152,   170,   115,   139,   139,    99,   104,
-     168,   166,   150,   147,    23,   113,    99,    99,    12,   152,
-      10,   162,   101,    12,    99,   167,    10,    10,    10,    10,
+     137,   160,   138,   139,   160,   139,   177,   182,   100,   132,
+     136,   139,   140,   160,   178,   115,   139,   139,    99,   104,
+     176,   174,   158,   147,    23,   113,    99,    99,    12,   160,
+      10,   170,   101,    12,    99,   175,    10,    10,    10,    10,
      115,   146,   115,   115,    20,    99,    99,    99,    99,   100,
-     115,    99,   101,   128,   139,    99,    99,   152,    99,    99,
-       9,    12,    10,    99,   101,   147,   149,   129,   166,   135,
-     135,     9,   116,   116,   139,   139,   116,   126,   100,    99,
-     116,   116,   118,    71,   101,   113,   151,   147,   118,   101,
-     116,   116,   117,    43,    44,   133,   133,    99,    99,   134,
-     137,   139,   116,    10,   119,     9,    10,   134,   134,   118,
-     116,   100,   116,   116,   101,    99,   134,    23,   101,   130,
-     118,    10,   139,   134,   134,   127,   116,    70,   131,    19,
-      10,    99,   135,   134,   118,   116,   140,    71,   133,    99,
-     116
+     115,    99,   101,   128,   139,    99,    99,   160,    99,    15,
+      16,   102,   150,   151,   153,   154,   155,   156,     9,    12,
+      10,    99,   101,   147,   157,   129,   174,   135,   135,     9,
+     116,   116,   139,   139,   116,   126,   100,    99,   116,   116,
+      25,   149,   149,    77,    99,   118,    71,   101,   113,   159,
+     147,   118,   101,   116,   116,   117,    43,    44,   133,   133,
+      99,    99,   134,   137,   139,   116,    78,   152,   152,   154,
+      10,   119,     9,    10,   134,   134,   118,   116,   100,   116,
+     116,   101,    99,   134,   170,    23,   101,   130,   118,    10,
+     139,   134,   134,   127,   116,    70,   131,    19,    10,    99,
+     135,   134,   118,   116,   140,    71,   133,    99,   116
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
@@ -1013,23 +1016,25 @@ static const yytype_uint8 yyr1[] =
      132,   132,   132,   132,   132,   132,   132,   132,   133,   133,
      133,   134,   134,   135,   136,   136,   137,   137,   138,   139,
      140,   141,   141,   142,   143,   144,   145,   145,   146,   146,
-     147,   147,   147,   148,   148,   150,   149,   151,   151,   152,
-     152,   152,   152,   153,   153,   153,   154,   154,   154,   154,
-     154,   154,   154,   154,   155,   154,   156,   156,   157,   157,
-     157,   157,   157,   157,   157,   157,   157,   157,   157,   157,
-     157,   157,   158,   158,   158,   158,   158,   158,   158,   158,
-     158,   158,   158,   158,   158,   158,   159,   159,   159,   159,
-     159,   159,   159,   159,   159,   160,   160,   160,   160,   160,
-     160,   161,   161,   162,   162,   162,   162,   162,   162,   162,
-     162,   162,   162,   162,   162,   162,   162,   162,   162,   162,
-     162,   162,   162,   162,   162,   162,   162,   162,   162,   162,
-     162,   162,   162,   162,   162,   162,   162,   162,   162,   162,
-     162,   162,   162,   162,   162,   162,   162,   162,   162,   162,
-     162,   162,   163,   162,   162,   162,   162,   162,   164,   164,
-     164,   165,   165,   165,   165,   165,   166,   166,   167,   167,
-     168,   168,   169,   170,   170,   170,   171,   171,   172,   172,
-     173,   174,   175,   176,   177,   177,   178,   179,   179,   180,
-     180,   181,   181,   182,   182,   182,   182
+     147,   147,   147,   148,   148,   149,   149,   150,   150,   151,
+     152,   152,   152,   153,   154,   154,   155,   155,   155,   156,
+     156,   158,   157,   159,   159,   160,   160,   160,   160,   161,
+     161,   161,   162,   162,   162,   162,   162,   162,   162,   162,
+     163,   162,   164,   164,   165,   165,   165,   165,   165,   165,
+     165,   165,   165,   165,   165,   165,   165,   165,   166,   166,
+     166,   166,   166,   166,   166,   166,   166,   166,   166,   166,
+     166,   166,   167,   167,   167,   167,   167,   167,   167,   167,
+     167,   168,   168,   168,   168,   168,   168,   169,   169,   170,
+     170,   170,   170,   170,   170,   170,   170,   170,   170,   170,
+     170,   170,   170,   170,   170,   170,   170,   170,   170,   170,
+     170,   170,   170,   170,   170,   170,   170,   170,   170,   170,
+     170,   170,   170,   170,   170,   170,   170,   170,   170,   170,
+     170,   170,   170,   170,   170,   170,   170,   170,   171,   170,
+     170,   170,   170,   170,   172,   172,   172,   173,   173,   173,
+     173,   173,   174,   174,   175,   175,   176,   176,   177,   178,
+     178,   178,   179,   179,   180,   180,   181,   182,   183,   184,
+     185,   185,   186,   187,   187,   188,   188,   189,   189,   190,
+     190,   190,   190
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1044,23 +1049,25 @@ static const yytype_uint8 yyr2[] =
        1,     1,     3,     3,     3,     3,     3,     3,     0,     2,
        6,     0,     2,     0,     0,     1,     0,     1,     1,     1,
        1,     1,     0,     0,     0,     0,     1,     1,     0,     1,
-       0,     2,     1,     2,     1,     0,     3,     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,
-       8,     2,     2,     1,     1,     1,     1,     5,     2,     3,
-       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,     6,     1,     1,     1,     1,     3,     2,
-       4,     3,     2,     1,     1,     1,     0,     1,     0,     1,
-       0,     2,     1,     1,     1,     1,     1,     1,     2,     2,
-       2,     2,     2,     2,     2,     4,     2,     1,     3,     1,
-       3,     1,     3,     1,     1,     1,     1
+       0,     2,     1,     2,     1,     0,     1,     1,     1,     3,
+       0,     1,     2,     3,     1,     1,     2,     3,     1,     0,
+       1,     0,     4,     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,     8,     2,     2,     1,
+       1,     1,     1,     5,     2,     3,     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,     6,
+       1,     1,     1,     1,     3,     2,     4,     3,     2,     1,
+       1,     1,     0,     1,     0,     1,     0,     2,     1,     1,
+       1,     1,     1,     1,     2,     2,     2,     2,     2,     2,
+       2,     4,     2,     1,     3,     1,     3,     1,     3,     1,
+       1,     1,     1
 };
 
 typedef enum {
@@ -1091,15 +1098,17 @@ static const toketypes yy_type_tab[] =
   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_ival,
   toketype_ival, toketype_ival, toketype_opval, toketype_opval, toketype_opval,
-  toketype_opval, toketype_opval, toketype_ival, 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_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_ival, 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_ival,
+  toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval, toketype_opval,
+  toketype_opval, toketype_opval
 };
 
 /* Generated from:
- * fba24dfc68a3a84c9ae95cb9e14cc156ac487e6f3228cdf84c166d3cd820e59a perly.y
+ * 719f2ad40259ac9c064749d399f2c7d1e1131abbc8c1f1ec0558cac2d8f2bc4c perly.y
  * 3e1dff60f26df8933d7aed0c0e87177a0f022c14800c0707eb62a7db4196ac98 regen_perly.pl
  * ex: set ro: */
diff --git a/perly.y b/perly.y
index 6eb4b23..f28124d 100644 (file)
--- a/perly.y
+++ b/perly.y
 %type <opval> formname subname proto optsubbody cont my_scalar my_var
 %type <opval> refgen_topic formblock
 %type <opval> subattrlist myattrlist myattrterm myterm
-%type <opval> subsignature termbinop termunop anonymous termdo
+%type <opval> termbinop termunop anonymous termdo
+%type <ival>  sigslurpsigil
+%type <opval> sigvarname sigdefault sigscalarelem sigslurpelem
+%type <opval> sigelem siglist siglistornull subsignature 
 %type <opval> formstmtseq formline formarg
 
 %nonassoc <ival> PREC_LOW
@@ -628,25 +631,268 @@ myattrlist:      COLONATTR THING
                        { $$ = (OP*)NULL; }
        ;
 
-/* Subroutine signature */
-subsignature:  '('
-                       {
-                         /* We shouldn't get here otherwise */
-                         assert(FEATURE_SIGNATURES_IS_ENABLED);
 
-                         Perl_ck_warner_d(aTHX_
-                               packWARN(WARN_EXPERIMENTAL__SIGNATURES),
-                               "The signatures feature is experimental");
-                         $<opval>$ = parse_subsignature();
+
+/* --------------------------------------
+ * subroutine signature parsing
+ */
+
+/* the '' or 'foo' part of a '$' or '@foo' etc signature variable  */
+sigvarname:   /* NULL */
+                       { $$ = (OP*)NULL; }
+        |       PRIVATEREF
+                        {
+                            $$ = $1;
+                            PL_parser->in_my = 0;
+                        }
+       ;
+
+sigslurpsigil:
+                '@'
+                        { $$ = '@'; }
+        |       '%'
+                        { $$ = '%'; }
+
+/* @, %, @foo, %foo */
+sigslurpelem: sigslurpsigil sigvarname sigdefault/* def only to catch errors */ 
+                        {
+                            I32 sigil = $1;
+                            OP *var   = $2;
+                            OP *defexpr = $3;
+                            int type = (sigil == '@' ? OP_PADAV : OP_PADHV);
+
+                            if (PL_parser->sig_slurpy)
+                                yyerror("Multiple slurpy parameters not allowed");
+                            PL_parser->sig_slurpy = sigil;
+
+                            if (defexpr)
+                                yyerror("a slurpy parameter may not have "
+                                        "a default value");
+
+                            if (var) {
+                                OP *slice;
+
+                                var->op_type    = type;
+                                var->op_ppaddr  = PL_ppaddr[type];
+                                var->op_flags   = (OPf_WANT_LIST | OPf_MOD);
+                                var->op_private = OPpLVAL_INTRO;
+
+                                slice = PL_parser->sig_elems
+                                    ? op_prepend_elem(OP_ASLICE,
+                                        newOP(OP_PUSHMARK, 0),
+                                        newLISTOP(OP_ASLICE, 0,
+                                            list(newRANGE(0,
+                                                newSVOP(OP_CONST, 0,
+                                                    newSViv(PL_parser->sig_elems)),
+                                                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));
+                                $$ = newSTATEOP(0, NULL,
+                                       newASSIGNOP(OPf_STACKED, var, 0, slice));
+                            }
+                            else
+                                $$ = (OP*)NULL;
+                        }
+       ;
+
+/* default part of sub signature scalar element: i.e. '= default_expr' */
+sigdefault:    /* NULL */
+                       { $$ = (OP*)NULL; }
+        |       ASSIGNOP
+                        { $$ = newOP(OP_NULL, 0); }
+        |       ASSIGNOP term
+                        { $$ = $2; }
+
+
+/* subroutine signature scalar element: e.g. '$x', '$=', '$x = $default' */
+sigscalarelem:
+                '$' sigvarname sigdefault
+                        {
+                            OP *var     = $2;
+                            OP *defexpr = $3;
+                            OP *argn    = NULL;
+                            OP *expr    = NULL;
+
+                            if (PL_parser->sig_slurpy)
+                                yyerror("Slurpy parameter not last");
+
+                            PL_parser->sig_elems++;
+
+                            if (var) {
+                                var->op_type    = OP_PADSV;
+                                var->op_ppaddr  = PL_ppaddr[OP_PADSV];
+                                var->op_flags   = (OPf_WANT_SCALAR | OPf_MOD);
+                                var->op_private = OPpLVAL_INTRO;
+                            }
+
+                            /* $_[N] */
+                            argn = newBINOP(OP_AELEM, 0,
+                                ref(newUNOP(OP_RV2AV, 0,
+                                        newGVOP(OP_GV, 0, PL_defgv)),
+                                    OP_RV2AV),
+                                newSVOP(OP_CONST, 0,
+                                    newSViv(PL_parser->sig_elems - 1)));
+
+                            if (defexpr) {
+                                PL_parser->sig_optelems++;
+                                /* is it '$var=undef', '$=' ? */
+                                if (    (   defexpr->op_type == OP_NULL
+                                         || defexpr->op_type == OP_UNDEF)
+                                    && !(defexpr->op_flags & OPf_KIDS))
+                                {
+                                    if (var) {
+                                        /* '$=' is legal, '$var=' isn't */
+                                        if (defexpr->op_type == OP_NULL)
+                                            yyerror("Optional parameter "
+                                                "lacks default expression");
+                                        else
+                                            expr = argn;
+                                    }
+                                    op_free(defexpr);
+                                }
+                                else {
+                                    /* @_ >= N */
+                                    OP *ge_op = 
+                                        newBINOP(OP_GE, 0,
+                                        scalar(newUNOP(OP_RV2AV, 0,
+                                                newGVOP(OP_GV, 0, PL_defgv))),
+                                        newSVOP(OP_CONST, 0,
+                                            newSViv(PL_parser->sig_elems)));
+
+                                    expr = var
+                                        ? newCONDOP(0, ge_op, argn, defexpr)
+                                        : newLOGOP(OP_OR, 0, ge_op, defexpr);
+                                }
+                            }
+                            else {
+                                if (PL_parser->sig_optelems)
+                                    yyerror("Mandatory parameter "
+                                            "follows optional parameter");
+                                expr = argn;
+                            }
+
+                            if (var)
+                                expr = newASSIGNOP(OPf_STACKED, var, 0, expr);
+                            if (expr)
+                                $$ = op_prepend_elem(OP_LINESEQ,
+                                        newSTATEOP(0, NULL, NULL),
+                                        expr);
+                            else
+                                $$ = (OP*)NULL;
+                        }
+       ;
+
+
+/* subroutine signature element: e.g. '$x = $default' or '%h' */
+sigelem:        sigscalarelem
+                        { parser->expect = XSIGVAR; $$ = $1; }
+        |       sigslurpelem
+                        { parser->expect = XSIGVAR; $$ = $1; }
+       ;
+
+/* list of subroutine signature elements */
+siglist:
+               siglist ','
+                       { $$ = $1; }
+       |       siglist ',' sigelem
+                       {
+                         $$ = op_append_list(OP_LINESEQ, $1, $3);
                        }
-               ')'
+        |      sigelem  %prec PREC_LOW
+                       { $$ = $1; }
+       ;
+
+/* () or (....) */
+siglistornull:         /* NULL */
+                       { $$ = (OP*)NULL; }
+       |       siglist
+                       { $$ = $1; }
+
+/* Subroutine signature */
+subsignature:  '('
+                        {
+                            ENTER;
+                            SAVEINT(PL_parser->sig_elems);
+                            SAVEINT(PL_parser->sig_optelems);
+                            SAVEI8(PL_parser->sig_slurpy);
+                            PL_parser->sig_elems    = 0;
+                            PL_parser->sig_optelems = 0;
+                            PL_parser->sig_slurpy   = 0;
+                            parser->expect = XSIGVAR;
+                        }
+                siglistornull
+                ')'
                        {
-                         $$ = op_append_list(OP_LINESEQ, $<opval>2,
-                               newSTATEOP(0, NULL, sawparens(newNULLLIST())));
-                         parser->expect = XATTRBLOCK;
+                            OP *sigops = $3;
+                            int min_arity =
+                                PL_parser->sig_elems - PL_parser->sig_optelems;
+
+                            assert(FEATURE_SIGNATURES_IS_ENABLED);
+
+                            /* We shouldn't get here otherwise */
+                            Perl_ck_warner_d(aTHX_
+                                packWARN(WARN_EXPERIMENTAL__SIGNATURES),
+                                "The signatures feature is experimental");
+
+                            /* handle odd/even for %foo */
+                            if (PL_parser->sig_slurpy == '%') {
+                                OP *chkop =
+                                    newLOGOP(
+                                        (PL_parser->sig_elems & 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))),
+                                        op_convert_list(OP_DIE, 0,
+                                            op_convert_list(OP_SPRINTF, 0,
+                                                op_append_list(OP_LIST,
+                                                    newSVOP(OP_CONST, 0,
+                                                        newSVpvs("Odd name/value argument for subroutine at %s line %d.\n")),
+                                                    newSLICEOP(0,
+                                                        op_append_list(OP_LIST,
+                                                            newSVOP(OP_CONST, 0, newSViv(1)),
+                                                            newSVOP(OP_CONST, 0, newSViv(2))),
+                                                        newOP(OP_CALLER, 0))))));
+                                if (PL_parser->sig_optelems)
+                                    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(PL_parser->sig_elems))),
+                                                chkop);
+                                sigops = op_prepend_elem(OP_LINESEQ,
+                                            chkop, sigops);
+
+                            }
+                            if (min_arity)
+                                sigops = op_prepend_elem(OP_LINESEQ,
+                                            Perl_check_arity(aTHX_ min_arity,
+                                                FALSE),
+                                            sigops);
+                            if (!PL_parser->sig_slurpy)
+                                sigops = op_prepend_elem(OP_LINESEQ,
+                                            Perl_check_arity(aTHX_
+                                                PL_parser->sig_elems, TRUE),
+                                            sigops);
+
+                            $$ = op_append_elem(OP_LINESEQ, sigops,
+                                newSTATEOP(0, NULL, NULL));
+
+                            parser->expect = XATTRBLOCK;
+                            LEAVE;
                        }
        ;
 
+
+
 /* Optional subroutine body, for named subroutine declaration */
 optsubbody:    block
        |       ';'     { $$ = (OP*)NULL; }
index 146cd52..19e9dff 100644 (file)
@@ -44,6 +44,22 @@ letter.
 
 =over 4
 
+=item a signature parameter must start with '$', '@' or '%'
+
+(F) Each subroutine signature parameter declaration must start with a valid
+sigil; for example:
+
+    sub foo ($a, $, $b = 1, @c) {}
+
+=item a slurpy parameter may not have a default value
+
+(F) Only scalar subroutine signature parameters may have a default value;
+for example:
+
+    sub foo ($a = 1)        {} # legal
+    sub foo (@a = (1))      {} # invalid
+    sub foo (%a = (a => b)) {} # invalid
+
 =item accept() on closed socket %s
 
 (W closed) You tried to do an accept on a closed socket.  Did you forget
@@ -2576,6 +2592,22 @@ declaration.  The '_' in a prototype must be followed by a ';',
 indicating the rest of the parameters are optional, or one of '@'
 or '%', since those two will accept 0 or more final parameters.
 
+=item illegal character following sigil in a subroutine signature
+
+(F) A parameter in a subroutine signature contained an unexpected character
+following the C<$>, C<@> or C<%> sigil character. Normally the sigil
+should be followed by the variable name or C<=> etc. Perhaps you are
+trying use a prototype while in the scope of C<use feature 'signatures'>?
+For example:
+
+    sub foo ($$) {}            # legal - a prototype
+
+    use feature 'signatures;
+    sub foo ($$) {}            # illegal - was expecting a signature
+    sub foo ($a, $b)
+            :prototype($$) {}  # legal
+
+
 =item Illegal character \%o (carriage return)
 
 (F) Perl normally treats carriage returns in the program text as it
@@ -3641,6 +3673,15 @@ mutable before freeing the ops.
 (W syntax) Multidimensional arrays aren't written like C<$foo[1,2,3]>.
 They're written like C<$foo[1][2][3]>, as in C.
 
+=item Multiple slurpy parameters not allowed
+
+(F) In subroutine signatures, a slurpy parameter (C<@> or C<%>) must be
+the last parameter, and there must not be more than one of them; for
+example:
+
+    sub foo ($a, @b)    {} # legal
+    sub foo ($a, @b, %) {} # invalid
+
 =item '/' must follow a numeric type in unpack
 
 (F) You had an unpack template that contained a '/', but this did not
@@ -4053,6 +4094,19 @@ doesn't somehow point to a valid subroutine.  See L<overload>.
 (W syntax) A format specified more picture fields than the next line
 supplied.  See L<perlform>.
 
+=item '#' not allowed immediately following a sigil in a subroutine signature
+
+(F) In a subroutine signature definition, a comment following a sigil
+(C<$>, C<@> or C<%>), needs to be separated by whitespace or a commma etc.,
+in particular to avoid confusion with the C<$#> variable. For example:
+
+    # bad
+    sub f ($# ignore first arg
+           , $b) {}
+    # good
+    sub f ($, # ignore first arg
+           $b) {}
+
 =item %s: not found
 
 (A) You've accidentally run your script through the Bourne shell instead
diff --git a/proto.h b/proto.h
index 0d554b9..befd902 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -266,6 +266,7 @@ PERL_CALLCONV U32   Perl_cast_ulong(NV f)
 PERL_CALLCONV UV       Perl_cast_uv(NV f)
                        __attribute__warn_unused_result__;
 
+PERL_CALLCONV OP*      Perl_check_arity(pTHX_ int arity, bool max);
 PERL_CALLCONV bool     Perl_check_utf8_print(pTHX_ const U8 *s, const STRLEN len);
 #define PERL_ARGS_ASSERT_CHECK_UTF8_PRINT      \
        assert(s)
@@ -2449,9 +2450,6 @@ 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);
 #define PERL_ARGS_ASSERT_PARSE_UNICODE_OPTS    \
diff --git a/sv.c b/sv.c
index c77a8bb..7459d70 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -12981,8 +12981,9 @@ Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
     parser->in_my      = proto->in_my;
     parser->in_my_stash        = hv_dup(proto->in_my_stash, param);
     parser->error_count        = proto->error_count;
-
-
+    parser->sig_elems  = proto->sig_elems;
+    parser->sig_optelems= proto->sig_optelems;
+    parser->sig_slurpy  = proto->sig_slurpy;
     parser->linestr    = sv_dup_inc(proto->linestr, param);
 
     {
index 217efa3..3db1b40 100644 (file)
@@ -415,7 +415,8 @@ like $@, qr/\AToo many arguments for subroutine at \(eval \d+\) line 1\.\n\z/;
 is $a, 123;
 
 eval "#line 8 foo\nsub t024 (\$a =) { }";
-is $@, "Optional parameter lacks default expression at foo line 8\.\n";
+is $@,
+    qq{Optional parameter lacks default expression at foo line 8, near "=) "\n};
 
 sub t025 ($ = undef) { $a // "z" }
 is prototype(\&t025), undef;
@@ -557,10 +558,13 @@ like $@, qr/\AToo many arguments for subroutine at \(eval \d+\) line 1\.\n\z/;
 is $a, 123;
 
 eval "#line 8 foo\nsub t030 (\$a = 222, \$b) { }";
-is $@, "Mandatory parameter follows optional parameter at foo line 8\.\n";
+is $@, qq{Mandatory parameter follows optional parameter at foo line 8, near "\$b) "\n};
 
 eval "#line 8 foo\nsub t031 (\$a = 222, \$b = 333, \$c, \$d) { }";
-is $@, "Mandatory parameter follows optional parameter at foo line 8\.\n";
+is $@, <<EOF;
+Mandatory parameter follows optional parameter at foo line 8, near "\$c,"
+Mandatory parameter follows optional parameter at foo line 8, near "\$d) "
+EOF
 
 sub t034 (@abc) { join("/", @abc).";".scalar(@abc) }
 is prototype(\&t034), undef;
@@ -575,10 +579,10 @@ is eval("t034(456, 789, 987, 654, 321, 111)"), "456/789/987/654/321/111;6";
 is $a, 123;
 
 eval "#line 8 foo\nsub t136 (\@abc = 222) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{a slurpy parameter may not have a default value at foo line 8, near "222) "\n};
 
 eval "#line 8 foo\nsub t137 (\@abc =) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{a slurpy parameter may not have a default value at foo line 8, near "=) "\n};
 
 sub t035 (@) { $a }
 is prototype(\&t035), undef;
@@ -593,10 +597,10 @@ is eval("t035(456, 789, 987, 654, 321, 111)"), 123;
 is $a, 123;
 
 eval "#line 8 foo\nsub t138 (\@ = 222) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{a slurpy parameter may not have a default value at foo line 8, near "222) "\n};
 
 eval "#line 8 foo\nsub t139 (\@ =) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{a slurpy parameter may not have a default value at foo line 8, near "=) "\n};
 
 sub t039 (%abc) { join("/", map { $_."=".$abc{$_} } sort keys %abc) }
 is prototype(\&t039), undef;
@@ -615,10 +619,10 @@ is eval("t039(456, 789, 987, 654, 321, 111)"), "321=111/456=789/987=654";
 is $a, 123;
 
 eval "#line 8 foo\nsub t140 (\%abc = 222) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{a slurpy parameter may not have a default value at foo line 8, near "222) "\n};
 
 eval "#line 8 foo\nsub t141 (\%abc =) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{a slurpy parameter may not have a default value at foo line 8, near "=) "\n};
 
 sub t040 (%) { $a }
 is prototype(\&t040), undef;
@@ -637,10 +641,10 @@ is eval("t040(456, 789, 987, 654, 321, 111)"), 123;
 is $a, 123;
 
 eval "#line 8 foo\nsub t142 (\% = 222) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{a slurpy parameter may not have a default value at foo line 8, near "222) "\n};
 
 eval "#line 8 foo\nsub t143 (\% =) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{a slurpy parameter may not have a default value at foo line 8, near "=) "\n};
 
 sub t041 ($a, @b) { $a.";".join("/", @b) }
 is prototype(\&t041), undef;
@@ -873,67 +877,70 @@ 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";
+is $@, qq{Slurpy parameter not last at foo line 8, near "\$b) "\n};
 
 eval "#line 8 foo\nsub t060 (\@a, \$b = 222) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "222) "\n};
 
 eval "#line 8 foo\nsub t061 (\@a, \@b) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Multiple slurpy parameters not allowed at foo line 8, near "\@b) "\n};
 
 eval "#line 8 foo\nsub t062 (\@a, \%b) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Multiple slurpy parameters not allowed at foo line 8, near "%b) "\n};
 
 eval "#line 8 foo\nsub t063 (\@, \$b) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "\$b) "\n};
 
 eval "#line 8 foo\nsub t064 (\@, \$b = 222) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "222) "\n};
 
 eval "#line 8 foo\nsub t065 (\@, \@b) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Multiple slurpy parameters not allowed at foo line 8, near "\@b) "\n};
 
 eval "#line 8 foo\nsub t066 (\@, \%b) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Multiple slurpy parameters not allowed at foo line 8, near "%b) "\n};
 
 eval "#line 8 foo\nsub t067 (\@a, \$) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "\$) "\n};
 
 eval "#line 8 foo\nsub t068 (\@a, \$ = 222) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "222) "\n};
 
 eval "#line 8 foo\nsub t069 (\@a, \@) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Multiple slurpy parameters not allowed at foo line 8, near "\@) "\n};
 
 eval "#line 8 foo\nsub t070 (\@a, \%) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Multiple slurpy parameters not allowed at foo line 8, near "\%) "\n};
 
 eval "#line 8 foo\nsub t071 (\@, \$) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "\$) "\n};
 
 eval "#line 8 foo\nsub t072 (\@, \$ = 222) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "222) "\n};
 
 eval "#line 8 foo\nsub t073 (\@, \@) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Multiple slurpy parameters not allowed at foo line 8, near "\@) "\n};
 
 eval "#line 8 foo\nsub t074 (\@, \%) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Multiple slurpy parameters not allowed at foo line 8, near "\%) "\n};
 
 eval "#line 8 foo\nsub t075 (\%a, \$b) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "\$b) "\n};
 
 eval "#line 8 foo\nsub t076 (\%, \$b) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "\$b) "\n};
 
 eval "#line 8 foo\nsub t077 (\$a, \@b, \$c) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "\$c) "\n};
 
 eval "#line 8 foo\nsub t078 (\$a, \%b, \$c) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, qq{Slurpy parameter not last at foo line 8, near "\$c) "\n};
 
 eval "#line 8 foo\nsub t079 (\$a, \@b, \$c, \$d) { }";
-is $@, "Slurpy parameter not last at foo line 8\.\n";
+is $@, <<EOF;
+Slurpy parameter not last at foo line 8, near "\$c,"
+Slurpy parameter not last at foo line 8, near "\$d) "
+EOF
 
 sub t080 ($a,,, $b) { $a.$b }
 is prototype(\&t080), undef;
@@ -962,10 +969,10 @@ like $@, qr/\AToo many arguments for subroutine at \(eval \d+\) line 1\.\n\z/;
 is $a, 123;
 
 eval "#line 8 foo\nsub t082 (, \$a) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{syntax error at foo line 8, near "(,"\n};
 
 eval "#line 8 foo\nsub t083 (,) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{syntax error at foo line 8, near "(,"\n};
 
 sub t084($a,$b){ $a.$b }
 is prototype(\&t084), undef;
@@ -1058,38 +1065,52 @@ 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/;
+like $@, qr{\A'#' not allowed immediately following a sigil in a subroutine signature at foo line 8, near "\(\$"\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/;
+like $@, qr{\A'#' not allowed immediately following a sigil in a subroutine signature at foo line 8, near "\(\@"\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/;
+like $@, qr{\A'#' not allowed immediately following a sigil in a subroutine signature at foo line 8, near "\(%"\n};
 
 eval "#line 8 foo\nsub t094 (123) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+like $@, qr{\Aa signature parameter must start with '\$', '\@' or '%' at foo line 8, near "\(1"\n};
 
 eval "#line 8 foo\nsub t095 (\$a, 123) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, <<EOF;
+a signature parameter must start with '\$', '\@' or '%' at foo line 8, near ", 1"
+syntax error at foo line 8, near ", 123"
+EOF
 
 eval "#line 8 foo\nsub t096 (\$a 123) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, qq{syntax error at foo line 8, near "\$a 123"\n};
 
 eval "#line 8 foo\nsub t097 (\$a { }) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, <<EOF;
+syntax error at foo line 8, near "\$a { "
+a signature parameter must start with '\$', '\@' or '%' at foo line 8, near "{ }"
+Missing right curly or square bracket at foo line 8, at end of line
+EOF
 
 eval "#line 8 foo\nsub t098 (\$a; \$b) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, <<EOF;
+syntax error at foo line 8, at EOF
+syntax error at foo line 8, near "\$b) "
+EOF
 
 eval "#line 8 foo\nsub t099 (\$\$) { }";
-like $@, qr/\AParse error at foo line 8\.\n/;
+is $@, <<EOF;
+illegal character following sigil in a subroutine signature at foo line 8, near "(\$"
+syntax error at foo line 8, near "\$\$"
+EOF
 
 eval "#line 8 foo\nsub t101 (\@_) { }";
 like $@, qr/\ACan't use global \@_ in "my" at foo line 8/;
@@ -1286,10 +1307,6 @@ while(<$kh>) {
         # $y should be an error after $x=foo.  The exact error we get may
         # differ if this is __END__ or s or some other special keyword.
         eval 'sub ($x = ' . $word . ', $y) {}';
-        local $::TODO = 'does not work yet'
-          if $word =~ /^(?:chmod|chown|die|exec|glob|kill|mkdir|print
-                          |printf|return|reverse|select|setpgrp|sort|split
-                          |system|unlink|utime|warn)\z/x;
         isnt $@, "", "$word does not swallow trailing comma";
     }
 }
diff --git a/toke.c b/toke.c
index 440353c..09d15a9 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -4403,7 +4403,7 @@ S_tokenize_use(pTHX_ int is_use, char *s) {
     static const char* const exp_name[] =
        { "OPERATOR", "TERM", "REF", "STATE", "BLOCK", "ATTRBLOCK",
          "ATTRTERM", "TERMBLOCK", "XBLOCKTERM", "POSTDEREF",
-         "TERMORDORDOR"
+         "SIGVAR", "TERMORDORDOR"
        };
 #endif
 
@@ -4807,6 +4807,67 @@ Perl_yylex(pTHX)
     PL_oldbufptr = s;
     PL_parser->saw_infix_sigil = 0;
 
+    if (PL_expect == XSIGVAR) {
+        /* we expect the sigil and optional var name part of a
+         * signature element here. Since a '$' is not necessarily
+         * followed by a var name, handle it specially here; the general
+         * yylex code would otherwise try to interpret whatever follows
+         * as a var; e.g. ($, ...) would be seen as the var '$,'
+         */
+
+        char sigil;
+
+        s = skipspace(s);
+        sigil = *s++;
+        PL_bufptr = s; /* for error reporting */
+        switch (sigil) {
+        case '$':
+        case '@':
+        case '%':
+            /* spot stuff that looks like an prototype */
+            if (strchr("$:@%&*;\\[]", *s)) {
+                yyerror("illegal character following sigil in a subroutine signature");
+                break;
+            }
+            /* '$#' is banned, while '$ # comment' isn't */
+            if (*s == '#') {
+                yyerror("'#' not allowed immediately following a sigil in a subroutine signature");
+                break;
+            }
+            s = skipspace(s);
+            if (isIDFIRST_lazy_if(s, UTF)) {
+                char *dest = PL_tokenbuf + 1;
+                /*  on next call to yylex this causes pending_ident()
+                 *  to allocmy() etc */
+                PL_in_my = KEY_my;
+                /* read var name, including sigil, into PL_tokenbuf */
+                PL_tokenbuf[0] = sigil;
+                parse_ident(&s, &dest, dest + sizeof(PL_tokenbuf) - 1,
+                    0, cBOOL(UTF), FALSE);
+                *dest = '\0';
+                assert(PL_tokenbuf[1]); /* we have a variable name */
+                force_ident_maybe_lex(sigil);
+            }
+            PL_expect = XOPERATOR;
+            break;
+
+        case ')':
+            PL_expect = XBLOCK;
+            break;
+        case ',': /* handle ($a,,$b) */
+            break;
+
+        default:
+            yyerror("a signature parameter must start with '$', '@' or '%'");
+            /* very crude error recovery: skip to likely next signature
+             * element */
+            while (*s && *s != '$' && *s != '@' && *s != '%' && *s != ')')
+                s++;
+            break;
+        }
+        TOKEN(sigil);
+    }
+
   retry:
     switch (*s) {
     default:
@@ -11736,219 +11797,6 @@ Perl_parse_stmtseq(pTHX_ U32 flags)
     return stmtseqop;
 }
 
-#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] = (char)sigil;
-    parse_ident(&s, &d, PL_tokenbuf + sizeof(PL_tokenbuf) - 1, 0,
-               cBOOL(UTF), FALSE);
-    PL_bufptr = s;
-    if (d == PL_tokenbuf+1)
-       return NULL;
-    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))),
-                           op_convert_list(OP_DIE, 0,
-                               op_convert_list(OP_SPRINTF, 0,
-                                   op_append_list(OP_LIST,
-                                       newSVOP(OP_CONST, 0,
-                                           newSVpvs("Odd name/value argument for subroutine at %s line %d.\n")),
-                                       newSLICEOP(0,
-                                           op_append_list(OP_LIST,
-                                               newSVOP(OP_CONST, 0, newSViv(1)),
-                                               newSVOP(OP_CONST, 0, newSViv(2))),
-                                           newOP(OP_CALLER, 0))))));
-                   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))),
-                   op_convert_list(OP_DIE, 0,
-                       op_convert_list(OP_SPRINTF, 0,
-                           op_append_list(OP_LIST,
-                               newSVOP(OP_CONST, 0,
-                                   newSVpvs("Too few arguments for subroutine at %s line %d.\n")),
-                               newSLICEOP(0,
-                                   op_append_list(OP_LIST,
-                                       newSVOP(OP_CONST, 0, newSViv(1)),
-                                       newSVOP(OP_CONST, 0, newSViv(2))),
-                                   newOP(OP_CALLER, 0))))))),
-           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))),
-                   op_convert_list(OP_DIE, 0,
-                       op_convert_list(OP_SPRINTF, 0,
-                           op_append_list(OP_LIST,
-                               newSVOP(OP_CONST, 0,
-                                   newSVpvs("Too many arguments for subroutine at %s line %d.\n")),
-                               newSLICEOP(0,
-                                   op_append_list(OP_LIST,
-                                       newSVOP(OP_CONST, 0, newSViv(1)),
-                                       newSVOP(OP_CONST, 0, newSViv(2))),
-                                   newOP(OP_CALLER, 0))))))),
-           initops);
-    }
-    return initops;
-}
-
 /*
  * ex: set ts=8 sts=4 sw=4 et:
  */