@Section
   @Title { Precedence and associativity of symbols }
   @Tag { precedence }
@Begin
@PP
Every symbol in Lout has a {@I precedence},
preceden @Index { Precedence }
which is a positive whole number.  When two symbols compete for an object,
the one with the higher precedence wins it.  For example,
@ID @Code {
"a  |  b  /  c"
}
is equivalent to @OneCol @Code { "{" a "|" b "}" "/" c } rather than
{@OneCol @Code { a "|" "{" b "/" c "}"} }, because @Code "|" has higher
precedence than @Code "/" and thus wins the {@Code b}.
@PP
When the two competing symbols have equal precedence, Lout applies a
second rule.  Each symbol is either @I left-associative or
associativity @Index { Associativity }
{@I right-associative}.  The value of @OneCol @Code { a op1 b op2 c} is taken
to be @OneCol @Code { "{" a op1 b "}" op2 c } if the symbols are both
left-associative, and @OneCol @Code "a op1 { b op2 c }" if they are
right-associative.  In cases not covered by these two rules, use braces.
@PP
It sometimes happens that the result is the same regardless of how the
expression is grouped.  For example, @OneCol @Code { "{" a "|" b "}" "|" c }
and @OneCol @Code { a "|" "{" b "|" c "}" } are always the same, for any
combination of objects, gaps, and variants of {@Code "|"}.  In such cases
the symbols are said to be {@I associative}, and we can confidently omit
the braces.
@PP
User-defined symbols may be given a precedence and associativity:
@ID @OneRow @Code {
"def @Super"
"   precedence 50"
"   associativity right"
"   left x"
"   right y"
"{"
"   @OneRow { | -2p @Font y ^/0.5fk x }"
"}"
}
They come just after any @Code into clause and before any parameter
definitions.  The precedence may be any whole number between 10 and
100, and if omitted is assigned the value 100.  The higher the number,
the higher the precedence.  The associativity may be @Code left or
{@Code right}, and if omitted defaults to {@Code right}.
@PP
In the example above, the precedence and associativity are both
literal words ({@Code 50} and {@Code right}).  It is also possible
to define a macro whose value is a suitable literal word, and
invoke that macro as the value of a precedence or associativity.
But arbitrary expressions, including invocations of symbols other
than macros, are not permitted.
@PP
Lout's symbols have the following precedences and associativities:
@ID @Tab
   vmargin { 0.5vx }
   @Fmta { @Col @CC A ! @Col @CC B ! @Col C }
{
@Rowa
   A { Precedence }
   B { Associativity }
   C { Symbols }
@Rowa
@Rowa
   A { 5 }
   B { associative }
   C { @Code "/  ^/  //  ^//" }
@Rowa
   A { 6 }
   B { associative }
   C { @Code "|  ^|  ||  ^||" }
@Rowa
   A { 7 }
   B { associative }
   C { @Code "&  ^&" }
@Rowa
   A { 7 }
   B { associative }
   C { @Code "&" in the form of one or more white space characters }
@Rowa
   A { 10-100 }
   B { @Code left or @Code right }
   C { user-defined symbols }
@Rowa
   A { 100 }
   B { @Code right }
   C { @@Wide, @@High, @@Graphic, etc. }
@Rowa
   A { 101 }
   B { - }
   C { @Code "&&" }
@Rowa
   A { 102 }
   B { associative }
   C { @Code "&" in the form of 0 spaces }
@Rowa
   A { 103 }
   B { - }
   C { Body parameters and right parameters of @@Open }
}
Actually the precedence of juxtaposition (two objects separated
by zero spaces) is a little more complicated.  If either of the
two objects is enclosed in braces, the precedence is 7 as for
one or more spaces.  If neither object is enclosed in braces,
the precedence is 102 as shown above.  This complicated rule
seems to accord better with what people expect and need in
practice than a pure precedence rule can do.
@End @Section
