%left '-' '+'
%left '*' '/'
%right '^'
+%left '%'
%nonassoc UMINUS
%parse-param { long long *result }
%parse-param { double *dresult }
$$.dval = $1.ival * $2.ival;
$$.has_error = $1.has_error || $2.has_error;
}
+ | expression '%' expression {
+ if ($1.has_dval || $3.has_dval)
+ yyerror(0, 0, 0, 0, "modulo on floats");
+ if ($3.ival == 0)
+ yyerror(0, 0, 0, 0, "divide by zero");
+ else {
+ $$.ival = $1.ival % $3.ival;
+ $$.dval = $$.ival;
+ }
+ $$.has_error = $1.has_error || $3.has_error;
+ }
| expression '^' expression {
$$.has_error = $1.has_error || $3.has_error;
if (!$1.has_dval && !$3.has_dval) {
tmp = 1.0;
$$.has_error = 1;
} else {
- tmp = pow((double) $1.ival,
- (double) $3.ival);
+ double x = (double) $1.ival;
+ double y = (double) $3.ival;
+ tmp = pow(x, y);
}
$$.ival = (long long) tmp;
}