Next: Union Decl, Previous: Token Decl, Up: Declarations
Use the %left
, %right
or %nonassoc
declaration to
declare a token and specify its precedence and associativity, all at
once. These are called precedence declarations.
See Operator Precedence, for general information on
operator precedence.
The syntax of a precedence declaration is nearly the same as that of
%token
: either
%left symbols...
or
%left <type> symbols...
And indeed any of these declarations serves the purposes of %token
.
But in addition, they specify the associativity and relative precedence for
all the symbols:
%left
specifies
left-associativity (grouping x with y first) and
%right
specifies right-associativity (grouping y with
z first). %nonassoc
specifies no associativity, which
means that ‘x op y op z’ is
considered a syntax error.
For backward compatibility, there is a confusing difference between the
argument lists of %token
and precedence declarations.
Only a %token
can associate a literal string with a token type name.
A precedence declaration always interprets a literal string as a reference to a
separate token.
For example:
%left OR "<=" // Does not declare an alias. %left OR 134 "<=" 135 // Declares 134 for OR and 135 for "<=".