The notation used for representing the C++ syntax in this document is described here.
| cppkeyword | → | auto | break | bool | case | catch | char | const | const_cast | continue | default | delete | do | double | dynamic_cast | else | extern | false | float | for | goto | if | int | long | mutable | namespace | new | nullptr | operator | register | reinterpret_cast | return | short | signed | sizeof | static | static_cast | switch | this | throw | true | try | typedef | typeid | unsigned | using | void | volatile | wchar_t | while |
| statement | → | labeled‑statement | empty‑statement | compound‑statement | selection‑statement | iteration‑statement | jump‑statement | declaration‑statement | try‑statement | expression‑statement |
| labeled‑statement | → | identifier : statement | case : statement | default : statement |
| empty‑statement | → | ; |
| compound‑statement | → | { statement* } |
| selection‑statement | → | if‑statement | switch‑statement |
| if‑statement | → | if ( condition | ) statement (else statement)? |
| switch‑statement | → | switch ( condition | ) statement |
| iteration‑statement | → | while‑statement | do‑statement | range‑for‑statement | for‑statement |
| while‑statement | → | while ( condition | ) statement |
| do‑statement | → | do statement while ( expression ) ; |
| range‑for‑statement | → | for ( for‑range‑declaration : expression ) statement |
| for‑range‑declaration | → | type‑specifier‑seq declarator |
| for‑statement | → | for ( for‑init‑statement condition ; expression? ) statement |
| for‑init‑statement | → | empty‑statement | expression‑statement | simple‑declaration |
| jump‑statement | → | break‑statement | continue‑statement | return‑statement | goto‑statement |
| break‑statement | → | break ; |
| continue‑statement | → | continue ; |
| return‑statement | → | return expression? ; |
| goto‑statement | → | goto identifier ; |
| declaration‑statement | → | block‑declaration |
| condition | → | type‑id declarator = assignment‑expression | expression |
| try‑statement | → | try compound‑statement handler‑seq |
| handler‑seq | → | handler handler‑seq? |
| handler | → | catch ( exception‑declaration ) compound‑statement |
| exception‑declaration | → | type‑specifier‑seq ( declarator | abstract‑declarator )? | ... |
| expression‑statement | → | expression ; |
| expression | → | assignment‑expression (, assignment‑expression)* |
| constant‑expression | → | expression |
| assignment‑expression | → | logical‑or‑expression assignment‑op assignment‑expression | conditional‑expression | throw‑expression |
| assignment‑op | → | = | *= | /= | %= | += | -= | <<= | >>= | &= | ^= | |= |
| conditional‑expression | → | logical‑or‑expression ? expression : assignment‑expression |
| throw‑expression | → | throw assignment‑expression? |
| logical‑or‑expression | → | logical‑and‑expression (|| logical‑and‑expression)* |
| logical‑and‑expression | → | inclusive‑or‑expression (&& inclusive‑or‑expression)* |
| inclusive‑or‑expression | → | exclusive‑or‑expression (| exclusive‑or‑expression)* |
| exclusive‑or‑expression | → | and‑expression (^ and‑expression)* |
| and‑expression | → | equality‑expression (& equality‑expression)* |
| equality‑expression | → | relational‑expression ((== | !=) relational‑expression)* |
| relational‑expression | → | shift‑expression ((< | > | <= | >=) shift‑expression)* |
| shift‑expression | → | additive‑expression ((<< | >>) additive‑expression)* |
| additive‑expression | → | multiplicative‑expression ((+ | -) multiplicative‑expression)* |
| multiplicative‑expression | → | pm‑expression ((* | / | %) pm‑expression)* |
| pm‑expression | → | cast‑expression ((.* | ->*) cast‑expression)* |
| cast‑expression | → | ( type‑id ) cast‑expression | unary‑expression |
| unary‑expression | → | postfix‑expression | postcast‑expression | ++ unary‑expression | -- unary‑expression | unary‑operator cast‑expression | sizeof ( type‑id ) | sizeof unary‑expression | new‑expression | delete‑expression |
| unary‑operator | → | + | - | * | & | ! | ~ |
| postfix‑expression | → |
primary‑expression ( [ expression ] | ( expression‑list ) | . id‑expression | -> id‑expression | ++ | -- )* | type‑specifier‑or‑type‑name ( expression‑list ) |
| postcast‑expression | → | ( dynamic_cast | static_cast | reinterpret_cast | const_cast ) < type‑id > ( expression ) | type‑id ( expression ) |
| expression‑list | → | assignment‑expression (, assignment‑expression)* |
| primary‑expression | → | literal | this | ( expression ) | id‑expression |
| id‑expression | → | qualified‑cpp‑id :: operator‑function‑id | ::? operator‑function‑id | qualified‑cpp‑id |
| type‑specifier‑or‑type‑name | → | simple‑type‑specifier | type‑name |
| new‑expression | → | ::? new new‑placement (new‑type‑id | ( type‑id )) new‑initializer? |
| new‑placement | → | ( expression‑list ) |
| new‑type‑id | → | (type‑specifier‑seq | type‑name) new‑declarator |
| new‑declarator | → | (ptr‑operator new‑declarator? | direct‑new‑declarator |
| new‑initializer | → | ( expression‑list? ) |
| direct‑new‑declarator | → | [ expression ] ([ constant‑expression ] )* |
| delete‑expression | → | ::? delete ([ ])? cast‑expression |
| operator‑function‑id | → | operator operator |
| operator | → | [ ] | ( ) | ->* | -> | , | -- | ++ | || | && | <= | >= | != | = | <<= | >>= | << | >> | |= | &= | ^= | %= | /= | *= | -= | += | < | > | = | ! | ~ | | | & | ^ | % | / | * | - | + | new [ ] | delete [ ] | new | delete |
| qualified‑cpp‑id | → | ::? identifer (:: identifer)* |
| literal | → | integer‑literal | floating‑literal | character‑literal | string‑literal | true | false | nullptr |
| init‑declarator‑list | → | init‑declarator (, init‑declarator)* |
| init‑declarator | → | declarator initiazer? |
| declarator | → | direct‑declarator | ptr‑operator declarator |
| direct‑declarator | → | declarator‑id ( [ constant‑expression? ] | ( declarator ) )* |
| declarator‑id | → | id‑expression | type‑name |
| type‑id | → | (type‑specifier‑seq | type‑name) abstract‑declarator? |
| type | → | type‑specifier+ | type‑name |
| type‑specifier‑seq | → | type‑specifier+ |
| abstract‑declarator | → | ptr‑operator abstract‑declarator? | direct‑abstract‑declarator |
| direct‑abstract‑declarator | → | [ constant‑expression? ] ( abstract‑declarator ) |
| ptr‑operator | → | * cv‑qualifier‑seq? | & |
| cv‑qualifier‑seq | → | cv‑qualifier+ |
| initializer | → | = initializer‑clause | ( expression‑list ) |
| initializer‑clause | → | assignment‑expression | { initializer‑list } | { } |
| initializer‑list | → | initializer‑clause (, initializer‑clause)* |
| block‑declaration | → | namespace‑alias‑definition | using‑directive | using‑declaration | simple‑declaration |
| simple‑declaration | → | decl‑specifier‑seq? init‑declarator‑list? ; |
| decl‑specifier‑seq | → | decl‑specifier+ | type‑name |
| decl‑specifier | → | storage‑class‑specifier | type‑specifier | typedef |
| storage‑class‑specifier | → | auto | register | static | extern | mutable |
| type‑specifier | → | simple‑type‑specifier | cv‑qualifier |
| simple‑type‑specifier | → | char | wchar_t | bool | short | int | long | signed | unsigned | float | double | void |
| type‑name | → | qualified‑cpp‑id (< template‑argument‑list >)? |
| template‑argument‑list | → | template‑argument (, template‑argument)* |
| template‑argument | → | type‑id | assignment‑expression |
| typedef | → | typedef |
| cv‑qualifier | → | const | volatile |
| namespace‑alias‑definition | → | namespace identifer = qualified‑cpp‑id ; |
| using‑declaration | → | using qualified‑cpp‑id ; |
| using‑directive | → | using namespace qualified‑cpp‑id ; |