12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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:
|