Manual
Manual
Manual
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Chapter 5: The Bison Parser Algorithm 75<br />
can also specify explicitly the precedence of a rule. See Section 5.4 [Context-Dependent<br />
Precedence], page 75.)<br />
Finally, the resolution of conflicts works by comparing the precedence of the rule being<br />
considered with that of the look-ahead token. If the token’s precedence is higher, the choice<br />
is to shift. If the rule’s precedence is higher, the choice is to reduce. If they have equal<br />
precedence, the choice is made based on the associativity of that precedence level. The<br />
verbose output file made by ‘-v’ (see Chapter 9 [Invoking Bison], page 97) says how each<br />
conflict was resolved.<br />
Not all rules and not all tokens have precedence. If either the rule or the look-ahead<br />
token has no precedence, then the default is to shift.<br />
5.4 Context-Dependent Precedence<br />
Often the precedence of an operator depends on the context. This sounds outlandish at first,<br />
but it is really very common. For example, a minus sign typically has a very high precedence<br />
as a unary operator, and a somewhat lower precedence (lower than multiplication) as a<br />
binary operator.<br />
The Bison precedence declarations, %left, %right and %nonassoc, can only be used once<br />
for a given token; so a token has only one precedence declared in this way. For contextdependent<br />
precedence, you need to use an additional mechanism: the %prec modifier for<br />
rules.<br />
The %prec modifier declares the precedence of a particular rule by specifying a terminal<br />
symbol whose precedence should be used for that rule. It’s not necessary for that symbol<br />
to appear otherwise in the rule. The modifier’s syntax is:<br />
%prec terminal-symbol<br />
and it is written after the components of the rule. Its effect is to assign the rule the<br />
precedence of terminal-symbol, overriding the precedence that would be deduced for it in<br />
the ordinary way. The altered rule precedence then affects how conflicts involving that rule<br />
are resolved (see Section 5.3 [Operator Precedence], page 73).<br />
Here is how %prec solves the problem of unary minus. First, declare a precedence for a<br />
fictitious terminal symbol named UMINUS. There are no tokens of this type, but the symbol<br />
serves to stand for its precedence:<br />
...<br />
%left ’+’ ’-’<br />
%left ’*’<br />
%left UMINUS<br />
Now the precedence of UMINUS can be used in specific rules:<br />
exp: ...<br />
| exp ’-’ exp<br />
...<br />
| ’-’ exp %prec UMINUS<br />
5.5 Parser States<br />
The function yyparse is implemented using a finite-state machine. The values pushed<br />
on the parser stack are not simply token type codes; they represent the entire sequence of