-/* Loops: while, until, for, and a bare block */
-loop : label WHILE lpar_or_qw remember texpr ')' mintro mblock cont
- { OP *innerop;
- PL_parser->copline = (line_t)IVAL($2);
- $$ = block_end($4,
- newSTATEOP(0, PVAL($1),
- innerop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
- IVAL($2), $5, $8, $9, $7)));
- TOKEN_GETMAD($1,innerop,'L');
- TOKEN_GETMAD($2,innerop,'W');
- TOKEN_GETMAD($3,innerop,'(');
- TOKEN_GETMAD($6,innerop,')');
- }
-
- | label UNTIL lpar_or_qw remember iexpr ')' mintro mblock cont
- { OP *innerop;
- PL_parser->copline = (line_t)IVAL($2);
- $$ = block_end($4,
- newSTATEOP(0, PVAL($1),
- innerop = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
- IVAL($2), $5, $8, $9, $7)));
- TOKEN_GETMAD($1,innerop,'L');
- TOKEN_GETMAD($2,innerop,'W');
- TOKEN_GETMAD($3,innerop,'(');
- TOKEN_GETMAD($6,innerop,')');
- }
- | label FOR MY remember my_scalar lpar_or_qw mexpr ')' mblock cont
- { OP *innerop;
- $$ = block_end($4,
- innerop = newFOROP(0, PVAL($1), (line_t)IVAL($2),
- $5, $7, $9, $10));
- TOKEN_GETMAD($1,((LISTOP*)innerop)->op_first,'L');
- TOKEN_GETMAD($2,((LISTOP*)innerop)->op_first->op_sibling,'W');
- TOKEN_GETMAD($3,((LISTOP*)innerop)->op_first->op_sibling,'d');
- TOKEN_GETMAD($6,((LISTOP*)innerop)->op_first->op_sibling,'(');
- TOKEN_GETMAD($8,((LISTOP*)innerop)->op_first->op_sibling,')');
- }
- | label FOR scalar lpar_or_qw remember mexpr ')' mblock cont
- { OP *innerop;
- $$ = block_end($5,
- innerop = newFOROP(0, PVAL($1), (line_t)IVAL($2),
- mod($3, OP_ENTERLOOP), $6, $8, $9));
- TOKEN_GETMAD($1,((LISTOP*)innerop)->op_first,'L');
- TOKEN_GETMAD($2,((LISTOP*)innerop)->op_first->op_sibling,'W');
- TOKEN_GETMAD($4,((LISTOP*)innerop)->op_first->op_sibling,'(');
- TOKEN_GETMAD($7,((LISTOP*)innerop)->op_first->op_sibling,')');
- }
- | label FOR lpar_or_qw remember mexpr ')' mblock cont
- { OP *innerop;
- $$ = block_end($4,
- innerop = newFOROP(0, PVAL($1), (line_t)IVAL($2),
- (OP*)NULL, $5, $7, $8));
- TOKEN_GETMAD($1,((LISTOP*)innerop)->op_first,'L');
- TOKEN_GETMAD($2,((LISTOP*)innerop)->op_first->op_sibling,'W');
- TOKEN_GETMAD($3,((LISTOP*)innerop)->op_first->op_sibling,'(');
- TOKEN_GETMAD($6,((LISTOP*)innerop)->op_first->op_sibling,')');
- }
- | label FOR lpar_or_qw remember mnexpr ';' texpr ';' mintro mnexpr ')'
- mblock
- /* basically fake up an initialize-while lineseq */
- { OP *forop;
- PL_parser->copline = (line_t)IVAL($2);
- forop = newSTATEOP(0, PVAL($1),
- newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
- IVAL($2), scalar($7),
- $12, $10, $9));
-#ifdef MAD
- forop = newUNOP(OP_NULL, 0, op_append_elem(OP_LINESEQ,
- newSTATEOP(0,
- CopLABEL_alloc(($1)->tk_lval.pval),
- ($5 ? $5 : newOP(OP_NULL, 0)) ),
- forop));
-
- token_getmad($2,forop,'3');
- token_getmad($3,forop,'(');
- token_getmad($6,forop,'1');
- token_getmad($8,forop,'2');
- token_getmad($11,forop,')');
- token_getmad($1,forop,'L');
-#else
- if ($5) {
- forop = op_append_elem(OP_LINESEQ,
- newSTATEOP(0, CopLABEL_alloc($1), $5),
- forop);
- }
-
-
-#endif
- $$ = block_end($4, forop); }
- | label block cont /* a block is a loop that happens once */
- { $$ = newSTATEOP(0, PVAL($1),
- newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
- NOLINE, (OP*)NULL, $2, $3, 0));
- TOKEN_GETMAD($1,((LISTOP*)$$)->op_first,'L'); }
- ;
-
-/* Switch blocks */
-switch : label GIVEN lpar_or_qw remember mydefsv mexpr ')' mblock
- { PL_parser->copline = (line_t) IVAL($2);
- $$ = block_end($4,
- newSTATEOP(0, PVAL($1),
- newGIVENOP($6, scope($8),
- (PADOFFSET) $5) )); }
- ;
-