+#else
+ ;
+ $$ = (OP*)NULL;
+#endif
+ intro_my();
+ }
+ | PACKAGE WORD WORD ';'
+ {
+#ifdef MAD
+ $$ = package($3);
+ token_getmad($1,$$,'o');
+ if ($2)
+ package_version($2);
+ token_getmad($4,$$,';');
+#else
+ package($3);
+ if ($2)
+ package_version($2);
+ $$ = (OP*)NULL;
+#endif
+ }
+ | USE startsub
+ { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
+ WORD WORD optlistexpr ';'
+ {
+ SvREFCNT_inc_simple_void(PL_compcv);
+#ifdef MAD
+ $$ = utilize(IVAL($1), $2, $4, $5, $6);
+ token_getmad($1,$$,'o');
+ token_getmad($7,$$,';');
+ if (PL_parser->rsfp_filters &&
+ AvFILLp(PL_parser->rsfp_filters) >= 0)
+ append_madprops(newMADPROP('!', MAD_NULL, NULL, 0), $$, 0);
+#else
+ utilize(IVAL($1), $2, $4, $5, $6);
+ $$ = (OP*)NULL;
+#endif
+ }
+ | IF '(' remember mexpr ')' mblock else
+ {
+ $$ = block_end($3,
+ newCONDOP(0, $4, op_scope($6), $7));
+ TOKEN_GETMAD($1,$$,'I');
+ TOKEN_GETMAD($2,$$,'(');
+ TOKEN_GETMAD($5,$$,')');
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | UNLESS '(' remember miexpr ')' mblock else
+ {
+ $$ = block_end($3,
+ newCONDOP(0, $4, op_scope($6), $7));
+ TOKEN_GETMAD($1,$$,'I');
+ TOKEN_GETMAD($2,$$,'(');
+ TOKEN_GETMAD($5,$$,')');
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | GIVEN '(' remember mexpr ')' mblock
+ {
+ const PADOFFSET offset = pad_findmy_pvs("$_", 0);
+ $$ = block_end($3,
+ newGIVENOP($4, op_scope($6),
+ offset == NOT_IN_PAD
+ || PAD_COMPNAME_FLAGS_isOUR(offset)
+ ? 0
+ : offset));
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | WHEN '(' remember mexpr ')' mblock
+ { $$ = block_end($3, newWHENOP($4, op_scope($6))); }
+ | DEFAULT block
+ { $$ = newWHENOP(0, op_scope($2)); }
+ | WHILE '(' remember texpr ')' mintro mblock cont
+ {
+ $$ = block_end($3,
+ newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
+ $4, $7, $8, $6));
+ TOKEN_GETMAD($1,$$,'W');
+ TOKEN_GETMAD($2,$$,'(');
+ TOKEN_GETMAD($5,$$,')');
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | UNTIL '(' remember iexpr ')' mintro mblock cont
+ {
+ $$ = block_end($3,
+ newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
+ $4, $7, $8, $6));
+ TOKEN_GETMAD($1,$$,'W');
+ TOKEN_GETMAD($2,$$,'(');
+ TOKEN_GETMAD($5,$$,')');
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | FOR '(' remember mnexpr ';' texpr ';' mintro mnexpr ')'
+ mblock
+ {
+ OP *initop = IF_MAD($4 ? $4 : newOP(OP_NULL, 0), $4);
+ OP *forop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
+ scalar($6), $11, $9, $8);
+ if (initop) {
+ forop = op_prepend_elem(OP_LINESEQ, initop,
+ op_append_elem(OP_LINESEQ,
+ newOP(OP_UNSTACK, OPf_SPECIAL),
+ forop));
+ }
+ DO_MAD({ forop = newUNOP(OP_NULL, 0, forop); })
+ $$ = block_end($3, forop);
+ TOKEN_GETMAD($1,$$,'3');
+ TOKEN_GETMAD($2,$$,'(');
+ TOKEN_GETMAD($5,$$,'1');
+ TOKEN_GETMAD($7,$$,'2');
+ TOKEN_GETMAD($10,$$,')');
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | FOR MY remember my_scalar '(' mexpr ')' mblock cont
+ {
+ $$ = block_end($3, newFOROP(0, $4, $6, $8, $9));
+ TOKEN_GETMAD($1,$$,'W');
+ TOKEN_GETMAD($2,$$,'d');
+ TOKEN_GETMAD($5,$$,'(');
+ TOKEN_GETMAD($7,$$,')');
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | FOR scalar '(' remember mexpr ')' mblock cont
+ {
+ $$ = block_end($4, newFOROP(0,
+ op_lvalue($2, OP_ENTERLOOP), $5, $7, $8));
+ TOKEN_GETMAD($1,$$,'W');
+ TOKEN_GETMAD($3,$$,'(');
+ TOKEN_GETMAD($6,$$,')');
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | FOR '(' remember mexpr ')' mblock cont
+ {
+ $$ = block_end($3,
+ newFOROP(0, (OP*)NULL, $4, $6, $7));
+ TOKEN_GETMAD($1,$$,'W');
+ TOKEN_GETMAD($2,$$,'(');
+ TOKEN_GETMAD($5,$$,')');
+ PL_parser->copline = (line_t)IVAL($1);
+ }
+ | block cont
+ {
+ /* a block is a loop that happens once */
+ $$ = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
+ (OP*)NULL, $1, $2, 0);
+ }
+ | PACKAGE WORD WORD '{' remember
+ {
+ package($3);
+ if ($2) {
+ package_version($2);
+ }
+ }
+ stmtseq '}'
+ {
+ /* a block is a loop that happens once */
+ $$ = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
+ (OP*)NULL, block_end($5, $7), (OP*)NULL, 0);
+ TOKEN_GETMAD($4,$$,'{');
+ TOKEN_GETMAD($8,$$,'}');
+ if (PL_parser->copline > (line_t)IVAL($4))
+ PL_parser->copline = (line_t)IVAL($4);
+ }
+ | sideff ';'
+ {