5.3.5 How Precedence Works

The first effect of the precedence declarations is to assign precedence
levels to the terminal symbols declared. The second effect is to assign
precedence levels to certain rules: each rule gets its precedence from
the last terminal symbol mentioned in the components. (You can also
specify explicitly the precedence of a rule. See Context-Dependent Precedence.)

Finally, the resolution of conflicts works by comparing the precedence
of the rule being considered with that of the lookahead token. If the
token’s precedence is higher, the choice is to shift. If the rule’s
precedence is higher, the choice is to reduce. If they have equal
precedence, the choice is made based on the associativity of that
precedence level. The verbose output file made by ‘-v’
(see Invoking Bison) says how each conflict was
resolved.

Not all rules and not all tokens have precedence. If either the rule or
the lookahead token has no precedence, then the default is to shift.