The grammar rules for an expression are, in order of precedence,
from high to low (note stands for the empty string):
expr:: idnumber
{ atom,
,atom }
expr :: expr
[-
+
*
&
|
^] expr
expr ** expr
expr [*
/
«
»] expr
expr [+
-] expr
expr mod expr
expr in expr
expr union expr
expr [=
=
<
<=
>
>=] expr
~ expr
expr & expr
expr [|
^] expr
expr <-> expr
expr -> expr
expr ? expr : expr
expr .. expr
( expr )
[ expr,
,expr ]
[ expr,
,expr : atom = expr .. expr ]
bin ( expr , expr )
All operators of the same precedence except ``?:'' associate to the left. For example, a / b * c is parsed as (a / b) * c. The ternary ``?:'' associates to the right. Thus
a ? b : c ? d : eis parsed as
a ? b : (c ? d : e)