Syntax ====== This section lists Nim's standard syntax. How the parser handles the indentation is already described in the `Lexical Analysis`_ section. Nim allows user-definable operators. Binary operators have 11 different levels of precedence. Associativity ------------- Binary operators whose first character is ``^`` are right-associative, all other binary operators are left-associative. .. code-block:: nim proc `^/`(x, y: float): float = # a right-associative division operator result = x / y echo 12 ^/ 4 ^/ 8 # 24.0 (4 / 8 = 0.5, then 12 / 0.5 = 24.0) echo 12 / 4 / 8 # 0.375 (12 / 4 = 3.0, then 3 / 8 = 0.375) Precedence ---------- Unary operators always bind stronger than any binary operator: ``\$a + b`` is ``(\$a) + b`` and not ``\$(a + b)``. If an unary operator's first character is ``@`` it is a `sigil-like`:idx: operator which binds stronger than a ``primarySuffix``: ``@x.abc`` is parsed as ``(@x).abc`` whereas ``\$x.abc`` is parsed as ``\$(x.abc)``. For binary operators that are not keywords the precedence is determined by the following rules: Operators ending in either ``->``, ``~>`` or ``=>`` are called `arrow like`:idx:, and have the lowest precedence of all operators. If the operator ends with ``=`` and its first character is none of ``<``, ``>``, ``!``, ``=``, ``~``, ``?``, it is an *assignment operator* which has the second lowest precedence. Otherwise precedence is determined by the first character. ================ =============================================== ================== =============== Precedence level Operators First character Terminal symbol ================ =============================================== ================== =============== 10 (highest) ``\$ ^`` OP10 9 ``* / div mod shl shr %`` ``* % \ /`` OP9 8 ``+ -`` ``+ - ~ |`` OP8 7 ``&`` ``&`` OP7 6 ``..`` ``.`` OP6 5 ``== <= < >= > != in notin is isnot not of`` ``= < > !`` OP5 4 ``and`` OP4 3 ``or xor`` OP3 2 ``@ : ?`` OP2 1 *assignment operator* (like ``+=``, ``*=``) OP1 0 (lowest) *arrow like operator* (like ``->``, ``=>``) OP0 ================ =============================================== ================== =============== Whether an operator is used a prefix operator is also affected by preceding whitespace (this parsing change was introduced with version 0.13.0): .. code-block:: nim echo \$foo # is parsed as echo(\$foo) Grammar ------- The grammar's start symbol is ``module``. .. include:: ../grammar.txt :literal: