program := definitions definitions := definition [definitions] definition := variable-definition := namespace-definition := function-definition pointer-modifier := '*' ['const'] array-modifier := '[' expression ']' [array-modifier] [pointer-modifier] reference-modifier := '&' := '&&' type-modifiers := pointer-modifier := array-modifier := reference-modifier type-base := identifier := expression := type-literal := 'auto' type-definition := ['const'] ['volatile'] type-base [type-modifiers] variable-definition := ['static'] [type-definition] identifier = expression := ['static'] [type-definition] identifier function-call := ['static'] [type-definition] identifier namespace-definition := 'namespace' identifier '{' [definitions] '}' function-definition := [type-definition] identifier function-arguments-list compound-statement function-arguments-list := '(' function-arguments ')' [function-arguments-list] function-arguments := [type-definition] identifier variable-modifiers := ['static'] ['auto'] [type-definition] type-definition-list := type-definition [',' type-definition-list] function-call-expression := expression function-call function-call := '(' [expression-list] ')' identifier := [_\w][_\w\d]* cast-expression := 'static_cast' function-call := 'dynamic_cast' function-call := 'reinterpret_cast' function-call := 'const_cast' function-call arithmetic-expression := expression '*' expression := expression '+' expression := expression '/' expression := expression '-' expression := '+' expression := '-' expression := expression '+=' expression := expression '*=' expression := expression '/=' expression := expression '-=' expression boolean-expression := expression '>' expression := expression '<' expression := expression '==' expression := expression '!=' expression := expression '<=' expression := expression '>=' expression := '!' expression member-expression := expression '.' identifier := expression '->' identifier bitwise-expression := expression '>>' expression := expression '<<' expression := expression '>>=' expression := expression '<<=' expression := '~' expression := expression '&' expression := expression '|' expression := expression '^' expression type-literal := 'type' [':' type-definition-list] '{' [definitions] '}' integral-literal := \d+ := '0x' [\dA-F]+ string-literal := \"(\\.|[^\\"])*\" floating-point-literal := \d+ '.' \d+ literal-expression := type-literal := integral-literal := floating-point-literal := string-literal access-expression := expression '[' expression ']' assignment-expression := expression '=' expression this-expression := 'this' expression-list := [expression [',' expression-list]] initializer-expression := expression := variable-definition expression := member-expression := boolean-expression := arithmetic-expression := cast-expression := function-call-expression := access-expression := assignment-expression := identifier := this-expression := literal-expression := bitwise-expression := type-definition if-statement := 'if' '(' initializer-expression ')' statement [else-statement] else-statement := 'else' statement label-statement := identifier ':' goto-statement := 'goto' identifier return-statement := 'return' expression throw-statement := 'throw' expression try-statement := 'try' compound-statement catch-statement catch-statement := 'catch' '(' type-definition identifier ')' compound-statement [catch-statement] := 'catch' '(' '...' ')' compound-statement for-statement := 'for' '(' initializer-expression ';' expression ';' expression ')' compound-statement while-statement := 'while' '(' initializer-expression ')' compound-statement do-while-statement := 'do' compound-statement 'while' '(' expression ')' case-statement := 'case' expression ':' statement-list [case-statement] := 'default' ':' statement-list switch-statement := 'switch' '(' initializer-expression ')' '{' case-statement '}' break-statement := 'break' continue-statement := 'continue' statement := expression := return-statement := if-statement := throw-statement := try-statement := compound-statement := label-statement := goto-statement := for-statement := while-statement := do-while-statement := switch-statement := break-statement := continue-statement statement-list := statement [statement-list] compound-statement := '{' [statement-list] '}'