Precedence of Operators in Notations
How Precedence is determined
The precedence of any new notation or operator is determined by examining the components from which it is constructed. For instance,
+
is grouped according to the precedence of +, the operator
n is grouped according to the precedence of

, and the mapping

is grouped according to the precedence of

. Generally the grouping behavior of positioning boxes is determined by the "base element". For instance, the expression
SubscriptBox[symb, sub] is grouped according to
symb. But for some other structural boxes the grouping behavior of surrounding elements is not affected by the behavior of the contents of the box. The precedence of compound objects is determined according to the following table:
| |
| AdjustmentBox, ErrorBox, StyleBox, SubscriptBox, SuperscriptBox, SubsuperscriptBox, UnderscriptBox, OverscriptBox, UnderoverscriptBox, TagBox | These box structures do not isolate their contents from the outside; the contents of these boxes can affect the grouping of surrounding elements |
| ButtonBox, FormBox, FractionBox, FrameBox, GridBox, InterpretationBox, RowBox, RadicalBox, SqrtBox | These box structures isolate their contents from the outside; the contents of these boxes do not affect the grouping of surrounding elements |
The standard boxes and their relationship to precedence.
This defines a notation for ring addition and ring multiplication. |
Mathematica now can parse and format expressions containing ring additions and multiplications.
| Out[30]= |  |
Out[31]//FullForm= |
| |  |
|
The ring multiplication operator
*
has a higher precedence than the ring addition operator
+
because
* has a higher precedence than
+ . Moreover, the notation is automatically set up to parenthesize the expression appropriately to maintain the correct structure.
The output has the correct formatting, styling, spacing, and parenthesization.
| Out[32]= |  |
|
However the above notation for ring addition and ring multiplication is still somewhat limited.
| Out[33]= |  |
|
Now + and * act as true infix operators for RingPlus and RingTimes.
| Out[38]= |  |
|
Parentheses in Notations
It is important to point out that bracketing expressions by using
{},
(),


,
[],
| or other braces in a notation not only changes the grouping of the notation but requires the brackets to be literally present in the input expression.
The following defines a notation that uses parentheses.
Out[40]//FullForm= |
| |  |
|
Without parentheses input is not recognized as a Semantic wrapper.
Out[41]//FullForm= |
| |  |
|
Changing Precedences in Notations
You can isolate the elements around an operator or expression by surrounding the operator or expression with a box structure that isolates its contents (cf. the
table above). The box structure typically used to do this encapsulation / isolation is the
TagBox. Furthermore it is possible to change the precedence of an operator through the use of the
TagBox option
SyntaxForm. More will be said on this later in
Complex Patterns and Advanced Features.
| Out[42]= |  |
|
The embedded
TagBox in







is necessary for several reasons: to contain the
StyleBox asserting
ZeroWidthTimes, to suppress the natural prefix operator grouping of

, and to allow the parsing and formatting rules to act on an encapsulated unit.