- | DO WORD '(' expr crp
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_WORD,stabent($2,MULTI)),
- make_list($4),
- Nullarg); Safefree($2); $2 = Nullch;
- $$->arg_flags |= AF_DEPR; }
- | AMPER WORD '(' expr crp
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_WORD,stabent($2,MULTI)),
- make_list($4),
- Nullarg); Safefree($2); $2 = Nullch; }
- | DO WORD '(' ')'
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_WORD,stabent($2,MULTI)),
- make_list(Nullarg),
- Nullarg);
- $$->arg_flags |= AF_DEPR; }
- | AMPER WORD '(' ')'
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_WORD,stabent($2,MULTI)),
- make_list(Nullarg),
- Nullarg); }
- | AMPER WORD
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_WORD,stabent($2,MULTI)),
- Nullarg,
- Nullarg); }
- | DO REG '(' expr crp
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_STAB,$2),
- make_list($4),
- Nullarg);
- $$->arg_flags |= AF_DEPR; }
- | AMPER REG '(' expr crp
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_STAB,$2),
- make_list($4),
- Nullarg); }
- | DO REG '(' ')'
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_STAB,$2),
- make_list(Nullarg),
- Nullarg);
- $$->arg_flags |= AF_DEPR; }
- | AMPER REG '(' ')'
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_STAB,$2),
- make_list(Nullarg),
- Nullarg); }
- | AMPER REG
- { $$ = make_op((perldb ? O_DBSUBR : O_SUBR), 2,
- stab2arg(A_STAB,$2),
- Nullarg,
- Nullarg); }
- | LOOPEX
- { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); }
- | LOOPEX WORD
- { $$ = make_op($1,1,cval_to_arg($2),
- Nullarg,Nullarg); }
- | UNIOP
- { $$ = make_op($1,0,Nullarg,Nullarg,Nullarg); }
- | UNIOP block
- { $$ = make_op($1,1,cmd_to_arg($2),Nullarg,Nullarg); }
- | UNIOP sexpr
- { $$ = make_op($1,1,$2,Nullarg,Nullarg); }
- | SSELECT
- { $$ = make_op(O_SELECT, 0, Nullarg, Nullarg, Nullarg);}
- | SSELECT WORD
- { $$ = make_op(O_SELECT, 1,
- stab2arg(A_WORD,stabent($2,TRUE)),
- Nullarg,
- Nullarg);
- Safefree($2); $2 = Nullch; }
- | SSELECT '(' handle ')'
- { $$ = make_op(O_SELECT, 1, $3, Nullarg, Nullarg); }
- | SSELECT '(' sexpr csexpr csexpr csexpr ')'
- { arg4 = $6;
- $$ = make_op(O_SSELECT, 4, $3, $4, $5); }
- | OPEN WORD %prec '('
- { $$ = make_op(O_OPEN, 2,
- stab2arg(A_WORD,stabent($2,TRUE)),
- stab2arg(A_STAB,stabent($2,TRUE)),
- Nullarg); }
- | OPEN '(' WORD ')'
- { $$ = make_op(O_OPEN, 2,
- stab2arg(A_WORD,stabent($3,TRUE)),
- stab2arg(A_STAB,stabent($3,TRUE)),
- Nullarg); }
- | OPEN '(' handle cexpr ')'
- { $$ = make_op(O_OPEN, 2,
- $3,
- $4, Nullarg); }
- | FILOP '(' handle ')'
- { $$ = make_op($1, 1,
- $3,
- Nullarg, Nullarg); }
- | FILOP WORD
- { $$ = make_op($1, 1,
- stab2arg(A_WORD,stabent($2,TRUE)),
- Nullarg, Nullarg);
- Safefree($2); $2 = Nullch; }
- | FILOP REG
- { $$ = make_op($1, 1,
- stab2arg(A_STAB,$2),
- Nullarg, Nullarg); }
- | FILOP '(' ')'
- { $$ = make_op($1, 1,
- stab2arg(A_WORD,Nullstab),
- Nullarg, Nullarg); }
- | FILOP %prec '('
- { $$ = make_op($1, 0,
- Nullarg, Nullarg, Nullarg); }
- | FILOP2 '(' handle cexpr ')'
- { $$ = make_op($1, 2, $3, $4, Nullarg); }
- | FILOP3 '(' handle csexpr cexpr ')'
- { $$ = make_op($1, 3, $3, $4, make_list($5)); }
- | FILOP22 '(' handle ',' handle ')'
- { $$ = make_op($1, 2, $3, $5, Nullarg); }
- | FILOP4 '(' handle csexpr csexpr cexpr ')'
- { arg4 = $6; $$ = make_op($1, 4, $3, $4, $5); }
- | FILOP25 '(' handle ',' handle csexpr csexpr cexpr ')'
- { arg4 = $7; arg5 = $8;
- $$ = make_op($1, 5, $3, $5, $6); }
- | PUSH '(' aryword ',' expr crp
- { $$ = make_op($1, 2,
- $3,
- make_list($5),
- Nullarg); }
- | POP aryword %prec '('
- { $$ = make_op(O_POP, 1, $2, Nullarg, Nullarg); }
- | POP '(' aryword ')'
- { $$ = make_op(O_POP, 1, $3, Nullarg, Nullarg); }
- | SHIFT aryword %prec '('
- { $$ = make_op(O_SHIFT, 1, $2, Nullarg, Nullarg); }
- | SHIFT '(' aryword ')'
- { $$ = make_op(O_SHIFT, 1, $3, Nullarg, Nullarg); }
- | SHIFT %prec '('
- { $$ = make_op(O_SHIFT, 1,
- stab2arg(A_STAB,
- aadd(stabent(subline ? "_" : "ARGV", TRUE))),
- Nullarg, Nullarg); }
- | SPLIT %prec '('
- { static char p[]="/\\s+/";
- char *oldend = bufend;
- ARG *oldarg = yylval.arg;
-
- bufend=p+5;
- (void)scanpat(p);
- bufend=oldend;
- $$ = make_split(defstab,yylval.arg,Nullarg);
- yylval.arg = oldarg; }
- | SPLIT '(' sexpr csexpr csexpr ')'
- { $$ = mod_match(O_MATCH, $4,
- make_split(defstab,$3,$5));}
- | SPLIT '(' sexpr csexpr ')'
- { $$ = mod_match(O_MATCH, $4,
- make_split(defstab,$3,Nullarg) ); }
- | SPLIT '(' sexpr ')'
- { $$ = mod_match(O_MATCH,
- stab2arg(A_STAB,defstab),
- make_split(defstab,$3,Nullarg) ); }
- | FLIST2 '(' sexpr cexpr ')'
- { $$ = make_op($1, 2,
- $3,
- listish(make_list($4)),
- Nullarg); }
- | FLIST '(' expr crp
- { $$ = make_op($1, 1,
- make_list($3),
- Nullarg,
- Nullarg); }
- | LVALFUN sexpr %prec '('
- { $$ = l(make_op($1, 1, fixl($1,$2),
- Nullarg, Nullarg)); }
- | LVALFUN
- { $$ = l(make_op($1, 1,
- stab2arg(A_STAB,defstab),
- Nullarg, Nullarg)); }
- | FUNC0
- { $$ = make_op($1, 0, Nullarg, Nullarg, Nullarg); }
+ | arylen %prec '(' /* $#x, $#{ something } */
+ { $$ = newUNOP(OP_AV2ARYLEN, 0, ref($1, OP_AV2ARYLEN));}
+ | subscripted
+ { $$ = $1; }
+ | '(' expr ')' '[' expr ']' /* list slice */
+ { $$ = newSLICEOP(0, $5, $2); }
+ | '(' ')' '[' expr ']' /* empty list slice! */
+ { $$ = newSLICEOP(0, $4, Nullop); }
+ | ary '[' expr ']' /* array slice */
+ { $$ = prepend_elem(OP_ASLICE,
+ newOP(OP_PUSHMARK, 0),
+ newLISTOP(OP_ASLICE, 0,
+ list($3),
+ ref($1, OP_ASLICE))); }
+ | ary '{' expr ';' '}' /* @hash{@keys} */
+ { $$ = prepend_elem(OP_HSLICE,
+ newOP(OP_PUSHMARK, 0),
+ newLISTOP(OP_HSLICE, 0,
+ list($3),
+ ref(oopsHV($1), OP_HSLICE)));
+ PL_expect = XOPERATOR; }
+ | THING %prec '('
+ { $$ = $1; }
+ | amper /* &foo; */
+ { $$ = newUNOP(OP_ENTERSUB, 0, scalar($1)); }
+ | amper '(' ')' /* &foo() */
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar($1)); }
+ | amper '(' expr ')' /* &foo(@args) */
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, $3, scalar($1))); }
+ | NOAMP WORD listexpr /* foo(@args) */
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, $3, scalar($2))); }
+ | LOOPEX /* loop exiting command (goto, last, dump, etc) */
+ { $$ = newOP($1, OPf_SPECIAL);
+ PL_hints |= HINT_BLOCK_SCOPE; }
+ | LOOPEX term
+ { $$ = newLOOPEX($1,$2); }
+ | NOTOP argexpr /* not $foo */
+ { $$ = newUNOP(OP_NOT, 0, scalar($2)); }
+ | UNIOP /* Unary op, $_ implied */
+ { $$ = newOP($1, 0); }
+ | UNIOP block /* eval { foo }, I *think* */
+ { $$ = newUNOP($1, 0, $2); }
+ | UNIOP term /* Unary op */
+ { $$ = newUNOP($1, 0, $2); }
+ | UNIOPSUB term /* Sub treated as unop */
+ { $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
+ append_elem(OP_LIST, $2, scalar($1))); }
+ | FUNC0 /* Nullary operator */
+ { $$ = newOP($1, 0); }