-termbinop: term ASSIGNOP term /* $x = $y, $x += $y */
- { $$ = newASSIGNOP(OPf_STACKED, $1, $2, $3); }
- | term POWOP term /* $x ** $y */
- { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
- | term MULOP term /* $x * $y, $x x $y */
- { if ($2 != OP_REPEAT)
- scalar($1);
- $$ = newBINOP($2, 0, $1, scalar($3));
- }
- | term ADDOP term /* $x + $y */
- { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
- | term SHIFTOP term /* $x >> $y, $x << $y */
- { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
- | term RELOP term /* $x > $y, etc. */
- { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
- | term EQOP term /* $x == $y, $x eq $y */
- { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
- | term BITANDOP term /* $x & $y */
- { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
- | term BITOROP term /* $x | $y */
- { $$ = newBINOP($2, 0, scalar($1), scalar($3)); }
- | term DOTDOT term /* $x..$y, $x...$y */
- { $$ = newRANGE($2, scalar($1), scalar($3)); }
- | term ANDAND term /* $x && $y */
- { $$ = newLOGOP(OP_AND, 0, $1, $3); }
- | term OROR term /* $x || $y */
- { $$ = newLOGOP(OP_OR, 0, $1, $3); }
- | term DORDOR term /* $x // $y */
- { $$ = newLOGOP(OP_DOR, 0, $1, $3); }
- | term MATCHOP term /* $x =~ /$y/ */
- { $$ = bind_match($2, $1, $3); }
+termbinop: term[lhs] ASSIGNOP term[rhs] /* $x = $y, $x += $y */
+ { $$ = newASSIGNOP(OPf_STACKED, $lhs, $ASSIGNOP, $rhs); }
+ | term[lhs] POWOP term[rhs] /* $x ** $y */
+ { $$ = newBINOP($POWOP, 0, scalar($lhs), scalar($rhs)); }
+ | term[lhs] MULOP term[rhs] /* $x * $y, $x x $y */
+ { if ($MULOP != OP_REPEAT)
+ scalar($lhs);
+ $$ = newBINOP($MULOP, 0, $lhs, scalar($rhs));
+ }
+ | term[lhs] ADDOP term[rhs] /* $x + $y */
+ { $$ = newBINOP($ADDOP, 0, scalar($lhs), scalar($rhs)); }
+ | term[lhs] SHIFTOP term[rhs] /* $x >> $y, $x << $y */
+ { $$ = newBINOP($SHIFTOP, 0, scalar($lhs), scalar($rhs)); }
+ | termrelop %prec PREC_LOW /* $x > $y, etc. */
+ { $$ = $termrelop; }
+ | termeqop %prec PREC_LOW /* $x == $y, $x cmp $y */
+ { $$ = $termeqop; }
+ | term[lhs] BITANDOP term[rhs] /* $x & $y */
+ { $$ = newBINOP($BITANDOP, 0, scalar($lhs), scalar($rhs)); }
+ | term[lhs] BITOROP term[rhs] /* $x | $y */
+ { $$ = newBINOP($BITOROP, 0, scalar($lhs), scalar($rhs)); }
+ | term[lhs] DOTDOT term[rhs] /* $x..$y, $x...$y */
+ { $$ = newRANGE($DOTDOT, scalar($lhs), scalar($rhs)); }
+ | term[lhs] ANDAND term[rhs] /* $x && $y */
+ { $$ = newLOGOP(OP_AND, 0, $lhs, $rhs); }
+ | term[lhs] OROR term[rhs] /* $x || $y */
+ { $$ = newLOGOP(OP_OR, 0, $lhs, $rhs); }
+ | term[lhs] DORDOR term[rhs] /* $x // $y */
+ { $$ = newLOGOP(OP_DOR, 0, $lhs, $rhs); }
+ | term[lhs] MATCHOP term[rhs] /* $x =~ /$y/ */
+ { $$ = bind_match($MATCHOP, $lhs, $rhs); }