Your problem is what you have expr OP INTEGERfor each rule.
The way you have it, the bison analyzes it as:
expr * 2 -> (4 + 5) * 2
It forces the priority to go left instead of the priority determined by your priority rules.
Priority only applies if there are several ways to analyze the text instead of what you have, try
expr : expr '+' expr {$$ = $1 + $3;}
| expr '-' expr {$$ = $1 - $3;}
| expr '*' expr {$$ = $1 * $3;}
| INTEGER {$$ = $1;}
;
Thus, it 5 + 4 * 2can be parsed as ((5 + 4) * 2)or (5 + (4 * 2)), and the bison will cope with priority to determine the correct parsing.