| expression | → | equivalence |
| equivalence | → | implication (<=> implication)* |
| implication | → | disjunction (=> implication)? |
| disjunction | → | conjunction (|| conjunction)* |
| conjunction | → | bit‑or (&& bit‑or)* |
| bit‑or | → | bit‑xor (| bit‑xor)* |
| bit‑xor | → | bit‑and (^ bit‑and)* |
| bit‑and | → | equality (& equality)* |
| equality | → | relational ((== | !=) relational)* |
| relational | → | shift ((<= | >= | < | > | is type‑expr | as type‑expr) shift | <empty>)* |
| shift | → | additive ((<< | >>) additive)* |
| additive | → | multiplicative ((+ | -) multiplicative)* |
| multiplicative | → | prefix ((* | / | %) prefix)* |
| prefix | → | (++ | -- | + | - | ! | ~ | * | &) prefix | postfix |
| postfix | → | primary (++ | -- | . identifier | -> identifier | [ expression ] | ( argument‑list ))* |
| primary | → | ( expression ) | literal | basic‑type | template‑id | identifier | this | base | size‑of‑expr | type‑name‑expr | type‑id‑expr | cast‑expr | construct‑expr | new‑expr |
| size‑of‑expr | → | sizeof ( expression ) |
| type‑name‑expr | → | typename ( expression ) |
| type‑id‑expr | → | typeid ( expression ) |
| cast‑expr | → | cast < type‑expr > ( expression ) |
| construct‑expr | → | construct < type‑expr > ( expression‑list ) |
| new‑expr | → | new type‑expr (( argument‑list ))? |
| argument‑list | → | expression‑list? |
| expression‑list | → | expression % , |
| invoke‑expr | → | (template‑id | identifier) (. identifier)* ( argument‑list ) |