The first rule statement describes the various forms of a statement. The remaining rules implement the constraints that are sensitive to the context in which the statement occurs: single_statement for a context in which only one statement is allowed, and decl_statement for a context in which a declaration, statement, or sequence thereof is allowed.
| stmt | ::= | directive |
| | | metaidStmt | |
| | | expr; | |
| | | if (dot_expr) single_stmt [else single_stmt] | |
| | | for ([dot_expr]; [dot_expr]; [dot_expr]) single_stmt | |
| | | while (dot_expr) single_stmt | |
| | | do single_stmt while (dot_expr); | |
| | | iter_ident (dot_expr *) single_stmt | |
| | | switch ([dot_expr]) {case_line * } | |
| | | return [dot_expr]; | |
| | | { [stmt_seq] } | |
| | | NEST(decl_stmt +, when) | |
| | | NEST(expr, when) | |
| | | break; | |
| | | continue; | |
| | | id: | |
| | | goto id; | |
| | | {stmt_seq } | |
| directive | ::= | include |
| | | #define id [top] | |
| | | #define id (PARAMSEQ(id, ε)) [top] | |
| | | #undef id | |
| | | #pragma id id + | |
| | | #pragma id (PARAMSEQ(expr, ε)) | |
| | | #pragma id ... | |
| single_stmt | ::= | stmt |
| | | OR(stmt) | |
| decl_stmt | ::= | metaidStmtList |
| | | decl_var | |
| | | stmt | |
| | | OR(stmt_seq) | |
| stmt_seq | ::= | decl_stmt * [DOTSEQ(decl_stmt +, when) decl_stmt *] |
| | | decl_stmt * [DOTSEQ(expr, when) decl_stmt *] | |
| case_line | ::= | default : stmt_seq |
| | | case dot_expr : stmt_seq | |
| iter_ident | ::= | IteratorId |
| | | metaidIterator |
| OR(gram_o) | ::= | ( gram_o (|gram_o) *) |
| DOTSEQ(gram_d, when_d) | ::= | …[when_d] (gram_d …[when_d]) * |
| NEST(gram_n, when_n) | ::= | <…[when_n] gram_n (…[when_n] gram_n) * …> |
| | | <+…[when_n] gram_n (…[when_n] gram_n) * …+> |
OR is a macro that generates a disjunction of patterns. The three tokens (, |, and ) must appear in the leftmost column, to differentiate them from the parentheses and bit-or tokens that can appear within expressions (and cannot appear in the leftmost column). These token may also be preceded by \ when they are used in an other column. These tokens are furthermore different from (, ∣, and ), which are part of the grammar metalanguage.