Back to Twig

Operator Associativity

doc/operators_precedence.rst

3.24.024.9 KB
Original Source

+------------+------------------+---------+---------------+-------------------------------------------------------------------+ | Precedence | Operator | Type | Associativity | Description | +============+==================+=========+===============+===================================================================+ | 512 | ... | prefix | n/a | Spread operator | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | => 300 | | | infix | Left | Twig filter call | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ( | | | Twig function call | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ., ?. | | | Get an attribute on a variable | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | [ | | | Array access | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 500 | - | prefix | n/a | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | + | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 300 => 5 | ?? | infix | Right | Null coalescing operator (a ?? b) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 250 | => | infix | Left | Arrow function (x => expr) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 200 | ** | infix | Right | Exponentiation operator | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 100 | is | infix | Left | Twig tests | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | is not | | | Twig tests | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 60 | * | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | / | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | // | | | Floor division | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | % | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 50 => 70 | not | prefix | n/a | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 40 => 27 | ~ | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 30 | + | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | - | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 25 | .. | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 20 | == | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | != | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | <=> | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | < | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | > | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | >= | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | <= | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | not in | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | in | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | matches | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | starts with | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ends with | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | has some | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | has every | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | === | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | !== | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 18 | b-and | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 17 | b-xor | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 16 | b-or | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 15 | and | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 12 | xor | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 10 | or | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 5 | ?:, ? : | infix | Right | Elvis operator (a ?: b) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 0 | ( | prefix | n/a | Explicit group expression (a) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ? | infix | Left | Conditional operator (a ? b : c) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | = | | Right | Assignment operator | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | literal | prefix | n/a | A literal value (boolean, string, number, sequence, mapping, ...) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+

When a precedence will change in 4.0, the new precedence is indicated by the arrow =>.

Here is the same table for Twig 4.0 with adjusted precedences:

+------------+------------------+---------+---------------+-------------------------------------------------------------------+ | Precedence | Operator | Type | Associativity | Description | +============+==================+=========+===============+===================================================================+ | 512 | ... | prefix | n/a | Spread operator | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ( | infix | Left | Twig function call | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ., ?. | | | Get an attribute on a variable | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | [ | | | Array access | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 500 | - | prefix | n/a | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | + | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 300 | | | infix | Left | Twig filter call | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 250 | => | infix | Left | Arrow function (x => expr) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 200 | ** | infix | Right | Exponentiation operator | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 100 | is | infix | Left | Twig tests | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | is not | | | Twig tests | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 70 | not | prefix | n/a | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 60 | * | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | / | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | // | | | Floor division | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | % | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 30 | + | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | - | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 27 | ~ | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 25 | .. | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 20 | == | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | != | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | <=> | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | < | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | > | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | >= | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | <= | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | not in | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | in | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | matches | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | starts with | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ends with | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | has some | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | has every | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | === | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | !== | | | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 18 | b-and | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 17 | b-xor | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 16 | b-or | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 15 | and | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 12 | xor | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 10 | or | infix | Left | | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 5 | ?? | infix | Right | Null coalescing operator (a ?? b) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ?:, ? : | | | Elvis operator (a ?: b) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | 0 | ( | prefix | n/a | Explicit group expression (a) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | ? | infix | Left | Conditional operator (a ? b : c) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | = | | Right | Assignment operator | +------------+------------------+---------+---------------+-------------------------------------------------------------------+ | | literal | prefix | n/a | A literal value (boolean, string, number, sequence, mapping, ...) | +------------+------------------+---------+---------------+-------------------------------------------------------------------+