%precedence 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
The syntax of a precedence declaration is nearly the same as that of
%left <type> symbols...
And indeed any of these declarations serves the purposes of
But in addition, they specify the associativity and relative precedence for
all the symbols:
%leftspecifies left-associativity (grouping x with y first) and
%rightspecifies right-associativity (grouping y with z first).
%nonassocspecifies no associativity, which means that ‘x op y op z’ is considered a syntax error.
%precedence gives only precedence to the symbols, and
defines no associativity at all. Use this to define precedence only,
and leave any potential conflict due to associativity enabled.
For backward compatibility, there is a confusing difference between the
argument lists of
%token and precedence declarations.
%token can associate a literal string with a token type name.
A precedence declaration always interprets a literal string as a reference to a
%left OR "<=" // Does not declare an alias. %left OR 134 "<=" 135 // Declares 134 for OR and 135 for "<=".