-termbinop: term ASSIGNOP term /* $x = $y */
- { $$ = newASSIGNOP(OPf_STACKED, $1, IVAL($2), $3);
- TOKEN_GETMAD($2,$$,'o');
- }
- | term POWOP term /* $x ** $y */
- { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
- TOKEN_GETMAD($2,$$,'o');
- }
- | term MULOP term /* $x * $y, $x x $y */
- { if (IVAL($2) != OP_REPEAT)
- scalar($1);
- $$ = newBINOP(IVAL($2), 0, $1, scalar($3));
- TOKEN_GETMAD($2,$$,'o');
- }
- | term ADDOP term /* $x + $y */
- { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
- TOKEN_GETMAD($2,$$,'o');
- }
- | term SHIFTOP term /* $x >> $y, $x << $y */
- { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
- TOKEN_GETMAD($2,$$,'o');
- }
- | term RELOP term /* $x > $y, etc. */
- { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
- TOKEN_GETMAD($2,$$,'o');
- }
- | term EQOP term /* $x == $y, $x eq $y */
- { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
- TOKEN_GETMAD($2,$$,'o');
- }
- | term BITANDOP term /* $x & $y */
- { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
- TOKEN_GETMAD($2,$$,'o');
- }
- | term BITOROP term /* $x | $y */
- { $$ = newBINOP(IVAL($2), 0, scalar($1), scalar($3));
- TOKEN_GETMAD($2,$$,'o');
- }
- | term DOTDOT term /* $x..$y, $x...$y */
- {
- $$ = newRANGE(IVAL($2), scalar($1), scalar($3));
- DO_MAD({
- UNOP *op;
- op = (UNOP*)$$;
- op = (UNOP*)op->op_first; /* get to flop */
- op = (UNOP*)op->op_first; /* get to flip */
- op = (UNOP*)op->op_first; /* get to range */
- token_getmad($2,(OP*)op,'o');
- })
- }
- | term ANDAND term /* $x && $y */
- { $$ = newLOGOP(OP_AND, 0, $1, $3);
- TOKEN_GETMAD($2,$$,'o');
- }
- | term OROR term /* $x || $y */
- { $$ = newLOGOP(OP_OR, 0, $1, $3);
- TOKEN_GETMAD($2,$$,'o');
- }
- | term DORDOR term /* $x // $y */
- { $$ = newLOGOP(OP_DOR, 0, $1, $3);
- TOKEN_GETMAD($2,$$,'o');
- }
- | term MATCHOP term /* $x =~ /$y/ */
- { $$ = bind_match(IVAL($2), $1, $3);
- TOKEN_GETMAD($2,
- ($$->op_type == OP_NOT
- ? ((UNOP*)$$)->op_first : $$),
- '~');
- }
+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); }