The semantics of all operator applications except for or and and is defined by syntactically replacing the operator application by procedure calls as explained in 4.5. Symbols belonging to other_special's can only be used if the programmer has given an appropriate procedure declaration. The operators or and and are only defined for the type BOOL and subtypes of BOOL. They designate the short circuit logical operations.
The (in-)equality operators are defined for operands of arbitrary types. `=' yields true only if the values of the operands are equal; when comparing two entities of a reference type only the pointers are compared!
If a designator occurs as a primary then it must either designate a parameterless procedure or a variable. In the first case the method is called; the result of the call is the value of the primary. In the latter case the value of the primary is the current value of the variable. If the identifier occurs in the scope of a non-shared attribute, self must not be uninitialized.
If a primary evaluates into a parameterless bound procedure of type t, then the procedure is called and its result is treated likewise except when the primary is used as a general expression in a context where a value of type t is required.
If an identifier is qualified with a class specifier, C::x, then x
must designate a shared attribute or a method of class C. Within
method calls C::m or
the variable self has the
value void if C is a reference class. Otherwise self is
uninitialized.
If an identifier is qualified with an object designator, a.x, then first the object a is determined. The qualification a.x designates the attribute or method x of the designated object.
A primary followed by a bracketed expression list designates an array access as described in 4.5 and 8.2.1.