
Grammar extracted by Vadim Zaytsev, see the Grammar Zoo entry for details: cpp/cpp98/iso-14882-1998/extracted
Source used for this grammar: ISO/IEC 14882:1998(E), Programming languages — C++, First edition, September 1998, Annex A, pages 667–684
translation-unit, declaration-seq, declaration, block-declaration, simple-declaration, decl-specifier-seq, decl-specifier, storage-class-specifier, type-specifier, simple-type-specifier, nested-name-specifier, class-or-namespace-name, class-name, template-id, template-name, template-argument-list, template-argument, assignment-expression, conditional-expression, logical-or-expression, logical-and-expression, inclusive-or-expression, exclusive-or-expression, and-expression, equality-expression, relational-expression, shift-expression, additive-expression, multiplicative-expression, pm-expression, cast-expression, unary-expression, postfix-expression, primary-expression, expression, id-expression, unqualified-id, operator-function-id, operator, conversion-function-id, conversion-type-id, type-specifier-seq, conversion-declarator, ptr-operator, cv-qualifier-seq, cv-qualifier, qualified-id, expression-list, pseudo-destructor-name, type-name, enum-name, typedef-name, type-id, abstract-declarator, direct-abstract-declarator, parameter-declaration-clause, parameter-declaration-list, parameter-declaration, declarator, direct-declarator, declarator-id, exception-specification, type-id-list, constant-expression, unary-operator, new-expression, new-placement, new-type-id, new-declarator, direct-new-declarator, new-initializer, delete-expression, assignment-operator, throw-expression, namespace-name, original-namespace-name, namespace-alias, class-specifier, class-head, class-key, base-clause, base-specifier-list, base-specifier, access-specifier, member-specification, member-declaration, member-declarator-list, member-declarator, pure-specifier, constant-initializer, function-definition, ctor-initializer, mem-initializer-list, mem-initializer, mem-initializer-id, function-body, compound-statement, statement-seq, statement, labeled-statement, expression-statement, selection-statement, condition, iteration-statement, for-init-statement, jump-statement, declaration-statement, try-block, handler-seq, handler, exception-declaration, function-try-block, using-declaration, template-declaration, template-parameter-list, template-parameter, type-parameter, enum-specifier, enumerator-list, enumerator-definition, enumerator, elaborated-type-specifier, function-specifier, init-declarator-list, init-declarator, initializer, initializer-clause, initializer-list, asm-definition, namespace-alias-definition, qualified-namespace-specifier, using-directive, explicit-instantiation, explicit-specialization, linkage-specification, namespace-definition, named-namespace-definition, original-namespace-definition, namespace-body, extension-namespace-definition, unnamed-namespace-definition), 1 root (translation-unit), 0 top (—), 3 bottom (string-literal 3, literal, identifier 28).translation-unit ::=
declaration-seqdeclaration-seq ::= declaration declaration-seq declaration
declaration ::= block-declaration function-definition template-declaration explicit-instantiation explicit-specialization linkage-specification namespace-definition
block-declaration ::= simple-declaration asm-definition namespace-alias-definition using-declaration using-directive
simple-declaration ::= decl-specifier-seq init-declarator-list ";"
decl-specifier-seq ::=
decl-specifier-seq decl-specifierdecl-specifier ::= storage-class-specifier type-specifier function-specifier "friend" "typedef"
storage-class-specifier ::= "auto" "register" "static" "extern" "mutable"
type-specifier ::= simple-type-specifier class-specifier enum-specifier elaborated-type-specifier cv-qualifier
simple-type-specifier ::= "::" nested-name-specifier type-name "::" nested-name-specifier "template" template-id "char" "wchar_t" "bool" "short" "int" "long" "signed" "unsigned" "float" "double" "void"
nested-name-specifier ::= class-or-namespace-name "::" nested-name-specifier class-or-namespace-name "::" "template" nested-name-specifier
class-or-namespace-name ::= class-name namespace-name
class-name ::= identifier template-id
template-id ::= template-name "<" template-argument-list ">"
template-name ::= identifier
template-argument-list ::=
template-argument
template-argument-list "," template-argumenttemplate-argument ::= assignment-expression type-id id-expression
assignment-expression ::= conditional-expression logical-or-expression assignment-operator assignment-expression throw-expression
conditional-expression ::= logical-or-expression logical-or-expression "?" expression ":" assignment-expression
logical-or-expression ::=
logical-and-expression
logical-or-expression "||" logical-and-expressionlogical-and-expression ::=
inclusive-or-expression
logical-and-expression "&&" inclusive-or-expressioninclusive-or-expression ::=
exclusive-or-expression
inclusive-or-expression "|" exclusive-or-expressionexclusive-or-expression ::=
and-expression
exclusive-or-expression "^" and-expressionand-expression ::=
equality-expression
and-expression "&" equality-expressionequality-expression ::= relational-expression equality-expression "==" relational-expression equality-expression "!=" relational-expression
relational-expression ::= shift-expression relational-expression "<" shift-expression relational-expression ">" shift-expression relational-expression "<=" shift-expression relational-expression ">=" shift-expression
shift-expression ::= additive-expression shift-expression "<<" additive-expression shift-expression ">>" additive-expression
additive-expression ::= multiplicative-expression additive-expression "+" multiplicative-expression additive-expression "-" multiplicative-expression
multiplicative-expression ::= pm-expression multiplicative-expression "*" pm-expression multiplicative-expression "/" pm-expression multiplicative-expression "%" pm-expression
pm-expression ::= cast-expression pm-expression ".*" cast-expression pm-expression "->*" cast-expression
cast-expression ::= unary-expression "(" type-id ")" cast-expression
unary-expression ::= postfix-expression "++" cast-expression "--" cast-expression unary-operator cast-expression "sizeof" unary-expression "sizeof" "(" type-id ")" new-expression delete-expression
postfix-expression ::= primary-expression postfix-expression "[" expression "]" postfix-expression "(" expression-list ")" simple-type-specifier "(" expression-list ")" "typename" "::" nested-name-specifier identifier "(" expression-list ")" "typename" "::" nested-name-specifier "template" template-id "(" expression-list ")" postfix-expression "." "template" id-expression postfix-expression "->" "template" id-expression postfix-expression "." pseudo-destructor-name postfix-expression "->" pseudo-destructor-name postfix-expression "++" postfix-expression "--" "dynamic_cast" "<" type-id ">" "(" expression ")" "static_cast" "<" type-id ">" "(" expression ")" "reinterpret_cast" "<" type-id ">" "(" expression ")" "const_cast" "<" type-id ">" "(" expression ")" "typeid" "(" expression ")" "typeid" "(" type-id ")"
primary-expression ::= literal "this" "(" expression ")" id-expression
expression ::=
assignment-expression
expression "," assignment-expressionid-expression ::= unqualified-id qualified-id
unqualified-id ::=
identifier
operator-function-id
conversion-function-id
"~" class-name
template-idoperator-function-id ::=
"operator" operatoroperator ::= "new" "delete" "new" "[" "]" "delete" "[" "]" "+" "-" "*" "/" "%" "^" "&" "|" "~" "!" "=" "<" ">" "+=" "-=" "*=" "/=" "%=" "^=" "&=" "|=" "<<" ">>" ">>=" "<<=" "==" "!=" "<=" ">=" "&&" "||" "++" "--" "," "->*" "->" "(" ")" "[" "]"
conversion-function-id ::=
"operator" conversion-type-idconversion-type-id ::=
type-specifier-seq conversion-declaratortype-specifier-seq ::=
type-specifier type-specifier-seqconversion-declarator ::=
ptr-operator conversion-declaratorptr-operator ::= "*" cv-qualifier-seq "&" "::" nested-name-specifier "*" cv-qualifier-seq
cv-qualifier-seq ::=
cv-qualifier cv-qualifier-seqcv-qualifier ::= "const" "volatile"
qualified-id ::= "::" nested-name-specifier "template" unqualified-id "::" identifier "::" operator-function-id "::" template-id
expression-list ::=
assignment-expression
expression-list "," assignment-expressionpseudo-destructor-name ::= "::" nested-name-specifier type-name "::" "~" type-name "::" nested-name-specifier "template" template-id "::" "~" type-name "::" nested-name-specifier "~" type-name
type-name ::= class-name enum-name typedef-name
enum-name ::= identifier
typedef-name ::= identifier
type-id ::=
type-specifier-seq abstract-declaratorabstract-declarator ::=
ptr-operator abstract-declarator
direct-abstract-declaratordirect-abstract-declarator ::= direct-abstract-declarator "(" parameter-declaration-clause ")" cv-qualifier-seq exception-specification direct-abstract-declarator "[" constant-expression "]" "(" abstract-declarator ")"
parameter-declaration-clause ::= parameter-declaration-list "..." parameter-declaration-list "," "..."
parameter-declaration-list ::=
parameter-declaration
parameter-declaration-list "," parameter-declarationparameter-declaration ::= decl-specifier-seq declarator decl-specifier-seq declarator "=" assignment-expression decl-specifier-seq abstract-declarator decl-specifier-seq abstract-declarator "=" assignment-expression
declarator ::= direct-declarator ptr-operator declarator
direct-declarator ::= declarator-id direct-declarator "(" parameter-declaration-clause ")" cv-qualifier-seq exception-specification direct-declarator "[" constant-expression "]" "(" declarator ")"
declarator-id ::= id-expression "::" nested-name-specifier type-name
exception-specification ::= "throw" "(" type-id-list ")"
type-id-list ::=
type-id
type-id-list "," type-idconstant-expression ::= conditional-expression
unary-operator ::= "*" "&" "+" "-" "!" "~"
new-expression ::= "::" "new" new-placement new-type-id new-initializer "::" "new" new-placement "(" type-id ")" new-initializer
new-placement ::= "(" expression-list ")"
new-type-id ::=
type-specifier-seq new-declaratornew-declarator ::=
ptr-operator new-declarator
direct-new-declaratordirect-new-declarator ::= "[" expression "]" direct-new-declarator "[" constant-expression "]"
new-initializer ::= "(" expression-list ")"
delete-expression ::= "::" "delete" cast-expression "::" "delete" "[" "]" cast-expression
assignment-operator ::= "=" "*=" "/=" "%=" "+=" "-=" ">>=" "<<=" "&=" "^=" "|="
throw-expression ::= "throw" assignment-expression
namespace-name ::= original-namespace-name namespace-alias
original-namespace-name ::= identifier
namespace-alias ::= identifier
class-specifier ::= class-head "{" member-specification "}"
class-head ::= class-key identifier base-clause class-key nested-name-specifier identifier base-clause class-key nested-name-specifier template-id base-clause
class-key ::= "class" "struct" "union"
base-clause ::=
":" base-specifier-listbase-specifier-list ::=
base-specifier
base-specifier-list "," base-specifierbase-specifier ::= "::" nested-name-specifier class-name "virtual" access-specifier "::" nested-name-specifier class-name access-specifier "virtual" "::" nested-name-specifier class-name
access-specifier ::= "private" "protected" "public"
member-specification ::= member-declaration member-specification access-specifier ":" member-specification
member-declaration ::= decl-specifier-seq member-declarator-list ";" function-definition ";" "::" nested-name-specifier "template" unqualified-id ";" using-declaration template-declaration
member-declarator-list ::=
member-declarator
member-declarator-list "," member-declaratormember-declarator ::= declarator pure-specifier declarator constant-initializer identifier ":" constant-expression
pure-specifier ::= "=" "0"
constant-initializer ::=
"=" constant-expressionfunction-definition ::= decl-specifier-seq declarator ctor-initializer function-body decl-specifier-seq declarator function-try-block
ctor-initializer ::=
":" mem-initializer-listmem-initializer-list ::=
mem-initializer
mem-initializer "," mem-initializer-listmem-initializer ::= mem-initializer-id "(" expression-list ")"
mem-initializer-id ::= "::" nested-name-specifier class-name identifier
function-body ::= compound-statement
compound-statement ::= "{" statement-seq "}"
statement-seq ::= statement statement-seq statement
statement ::= labeled-statement expression-statement compound-statement selection-statement iteration-statement jump-statement declaration-statement try-block
labeled-statement ::= identifier ":" statement "case" constant-expression ":" statement "default" ":" statement
expression-statement ::= expression ";"
selection-statement ::= "if" "(" condition ")" statement "if" "(" condition ")" statement "else" statement "switch" "(" condition ")" statement
condition ::=
expression
type-specifier-seq declarator "=" assignment-expressioniteration-statement ::= "while" "(" condition ")" statement "do" statement "while" "(" expression ")" ";" "for" "(" for-init-statement condition ";" expression ")" statement
for-init-statement ::= expression-statement simple-declaration
jump-statement ::= "break" ";" "continue" ";" "return" expression ";" "goto" identifier ";"
declaration-statement ::= block-declaration
try-block ::=
"try" compound-statement handler-seqhandler-seq ::=
handler handler-seqhandler ::= "catch" "(" exception-declaration ")" compound-statement
exception-declaration ::=
type-specifier-seq declarator
type-specifier-seq abstract-declarator
type-specifier-seq
"..."function-try-block ::= "try" ctor-initializer function-body handler-seq
using-declaration ::= "using" "typename" "::" nested-name-specifier unqualified-id ";" "using" "::" unqualified-id ";"
template-declaration ::= "export" "template" "<" template-parameter-list ">" declaration
template-parameter-list ::=
template-parameter
template-parameter-list "," template-parametertemplate-parameter ::= type-parameter parameter-declaration
type-parameter ::= "class" identifier "class" identifier "=" type-id "typename" identifier "typename" identifier "=" type-id "template" "<" template-parameter-list ">" "class" identifier "template" "<" template-parameter-list ">" "class" identifier "=" id-expression
enum-specifier ::= "enum" identifier "{" enumerator-list "}"
enumerator-list ::=
enumerator-definition
enumerator-list "," enumerator-definitionenumerator-definition ::=
enumerator
enumerator "=" constant-expressionenumerator ::= identifier
elaborated-type-specifier ::= class-key "::" nested-name-specifier identifier "enum" "::" nested-name-specifier identifier "typename" "::" nested-name-specifier identifier "typename" "::" nested-name-specifier "template" template-id
function-specifier ::= "inline" "virtual" "explicit"
init-declarator-list ::=
init-declarator
init-declarator-list "," init-declaratorinit-declarator ::=
declarator initializerinitializer ::= "=" initializer-clause "(" expression-list ")"
initializer-clause ::= assignment-expression "{" initializer-list "," "}" "{" "}"
initializer-list ::=
initializer-clause
initializer-list "," initializer-clauseasm-definition ::= "asm" "(" string-literal ")" ";"
namespace-alias-definition ::= "namespace" identifier "=" qualified-namespace-specifier ";"
qualified-namespace-specifier ::= "::" nested-name-specifier namespace-name
using-directive ::= "using" "namespace" "::" nested-name-specifier namespace-name ";"
explicit-instantiation ::=
"template" declarationexplicit-specialization ::= "template" "<" ">" declaration
linkage-specification ::= "extern" string-literal "{" declaration-seq "}" "extern" string-literal declaration
namespace-definition ::= named-namespace-definition unnamed-namespace-definition
named-namespace-definition ::= original-namespace-definition extension-namespace-definition
original-namespace-definition ::= "namespace" identifier "{" namespace-body "}"
namespace-body ::=
declaration-seqextension-namespace-definition ::= "namespace" original-namespace-name "{" namespace-body "}"
unnamed-namespace-definition ::= "namespace" "{" namespace-body "}"