If you are a C++ developer then you sometimes need to have a look at the C++ BNF grammar. At least I do.
But reading a set of BNF rules is difficult since you have to jump from one rule to the next one, maybe pages away from it.
With this document I tried to make it easier to navigate among the BNF rules of the C++ language grammar; you can find here a hyperlinked graph whose nodes are the BNF productions of the C++ language grammar.
|
|
hex-quad: |
|
|
hexadecimal-digit
hexadecimal-digit
hexadecimal-digit
hexadecimal-digit
|
universal-character-name: |
|
|
\u
hex-quad
|
|
\U
hex-quad
hex-quad
|
|
|
preprocessing-token: |
|
|
header-name
|
|
identifier
|
|
pp-number
|
|
character-literal
|
|
user-defined-character-literal
C++0x
|
|
string-literal
|
|
user-defined-string-literal
C++0x
|
|
preprocessing-op-or-punc
|
|
each non-white-space character that cannot be one of the above
|
|
|
token: |
|
|
identifier
|
|
keyword
|
|
literal
|
|
operator-token
See C++ Standard Core Language Issue n. 189
|
|
punctuator
See C++ Standard Core Language Issue n. 189
|
|
|
header-name: |
|
|
<
h-char-sequence
>
|
|
"
q-char-sequence
"
|
h-char-sequence: |
|
|
h-char
|
|
h-char-sequence
h-char
|
h-char: |
|
|
any member of the source character set except new-line and >
|
q-char-sequence: |
|
|
q-char
|
|
q-char-sequence
q-char
|
q-char: |
|
|
any member of the source character set except new-line and "
|
|
|
pp-number: |
|
|
digit
|
|
.
digit
|
|
pp-number
digit
|
|
pp-number
identifier-nondigit
|
|
pp-number
e
sign
|
|
pp-number
E
sign
|
|
pp-number
.
|
|
|
identifier: |
|
|
identifier-nondigit
C++0x
|
|
identifier
identifier-nondigit
C++0x
|
|
identifier
digit
|
identifier-nondigit: |
|
|
nondigit
C++0x
|
|
universal-character-name
C++0x
|
|
other implementation-defined characters
C++0x
|
nondigit: |
|
|
universal-character-name
Removed in C++0x
|
|
a
|
|
b
|
|
c
|
|
d
|
|
e
|
|
f
|
|
g
|
|
h
|
|
i
|
|
j
|
|
k
|
|
l
|
|
m
|
|
n
|
|
o
|
|
p
|
|
q
|
|
r
|
|
s
|
|
t
|
|
u
|
|
v
|
|
w
|
|
x
|
|
y
|
|
z
|
|
A
|
|
B
|
|
C
|
|
D
|
|
E
|
|
F
|
|
G
|
|
H
|
|
I
|
|
J
|
|
K
|
|
L
|
|
M
|
|
N
|
|
O
|
|
P
|
|
Q
|
|
R
|
|
S
|
|
T
|
|
U
|
|
V
|
|
W
|
|
X
|
|
Y
|
|
Z
|
|
_
(underscore)
|
digit: |
|
|
0
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
|
keyword: |
|
|
alignas
C++0x
|
|
alignof
C++0x
|
|
asm
|
|
auto
|
|
bool
|
|
break
|
|
case
|
|
catch
|
|
char
|
|
char16_t
C++0x
|
|
char32_t
C++0x
|
|
class
|
|
const
|
|
constexpr
C++0x
|
|
const_cast
|
|
continue
|
|
decltype
C++0x
|
|
default
|
|
delete
|
|
do
|
|
double
|
|
dynamic_cast
|
|
else
|
|
enum
|
|
explicit
|
|
export
C++0x - Reserved for future use
|
|
extern
|
|
false
|
|
float
|
|
for
|
|
friend
|
|
goto
|
|
if
|
|
inline
|
|
int
|
|
long
|
|
mutable
|
|
namespace
|
|
new
|
|
noexcept
C++0x
|
|
nullptr
C++0x
|
|
operator
|
|
private
|
|
protected
|
|
public
|
|
register
|
|
reinterpret_cast
|
|
return
|
|
short
|
|
signed
|
|
sizeof
|
|
static
|
|
static_assert
C++0x
|
|
static_cast
|
|
struct
|
|
switch
|
|
template
|
|
this
|
|
thread_local
C++0x
|
|
throw
|
|
true
|
|
try
|
|
typedef
|
|
typeid
|
|
typename
|
|
union
|
|
unsigned
|
|
using
|
|
virtual
|
|
void
|
|
volatile
|
|
wchar_t
|
|
while
|
|
|
operator-token: |
|
|
Look at preprocessing-op-or-punc below
See C++ Standard Core Language Issue n. 189
|
punctuator: |
|
|
Look at preprocessing-op-or-punc below
See C++ Standard Core Language Issue n. 189
|
preprocessing-op-or-punc: |
|
|
{
|
|
}
|
|
[
|
|
]
|
|
#
|
|
##
|
|
(
|
|
)
|
|
<:
|
|
:>
|
|
<%
|
|
%>
|
|
%:
|
|
%:%:
|
|
;
|
|
:
|
|
...
|
|
new
|
|
delete
|
|
?
|
|
::
|
|
.
|
|
.*
|
|
+
|
|
-
|
|
*
|
|
/
|
|
%
|
|
^
|
|
&
|
|
|
|
|
~
|
|
!
|
|
=
|
|
<
|
|
>
|
|
+=
|
|
-=
|
|
*=
|
|
/=
|
|
%=
|
|
^=
|
|
&=
|
|
|=
|
|
<<
|
|
>>
|
|
<<=
|
|
>>=
|
|
==
|
|
!=
|
|
<=
|
|
>=
|
|
&&
|
|
||
|
|
++
|
|
--
|
|
,
|
|
->*
|
|
->
|
|
and
|
|
and_eq
|
|
bitand
|
|
bitor
|
|
compl
|
|
not
|
|
not_eq
|
|
or
|
|
or_eq
|
|
xor
|
|
xor_eq
|
|
|
literal: |
|
|
integer-literal
|
|
character-literal
|
|
floating-literal
|
|
string-literal
|
|
boolean-literal
|
|
pointer-literal
C++0x
|
|
user-defined-literal
C++0x
|
|
|
integer-literal: |
|
|
decimal-literal
integer-suffixopt
|
|
octal-literal
integer-suffixopt
|
|
hexadecimal-literal
integer-suffixopt
|
decimal-literal: |
|
|
nonzero-digit
|
|
decimal-literal
digit
|
octal-literal: |
|
|
0
|
|
octal-literal
octal-digit
|
hexadecimal-literal: |
|
|
0x
hexadecimal-digit
|
|
0X
hexadecimal-digit
|
|
hexadecimal-literal
hexadecimal-digit
|
nonzero-digit: |
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
octal-digit: |
|
|
0
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
hexadecimal-digit: |
|
|
0
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
a
|
|
b
|
|
c
|
|
d
|
|
e
|
|
f
|
|
A
|
|
B
|
|
C
|
|
D
|
|
E
|
|
F
|
integer-suffix: |
|
|
unsigned-suffix
long-suffixopt
|
|
unsigned-suffix
long-long-suffixopt
C++0x
|
|
long-suffix
unsigned-suffixopt
|
|
long-long-suffix
unsigned-suffixopt
C++0x
|
unsigned-suffix: |
|
|
u
|
|
U
|
long-suffix: |
|
|
l
|
|
L
|
long-long-suffix: |
|
|
ll
C++0x
|
|
LL
C++0x
|
|
|
character-literal: |
|
|
'
c-char-sequence
'
|
|
u
'
c-char-sequence
'
C++0x
|
|
U
'
c-char-sequence
'
C++0x
|
|
L
'
c-char-sequence
'
|
c-char-sequence: |
|
|
c-char
|
|
c-char-sequence
c-char
|
c-char: |
|
|
any member of the source character set except the single quote ', backslash \, or new-line character
|
|
escape-sequence
|
|
universal-character-name
|
escape-sequence: |
|
|
simple-escape-sequence
|
|
octal-escape-sequence
|
|
hexadecimal-escape-sequence
|
simple-escape-sequence: |
|
|
\'
|
|
\"
|
|
\?
|
|
\\
|
|
\a
|
|
\b
|
|
\f
|
|
\n
|
|
\r
|
|
\t
|
|
\v
|
octal-escape-sequence: |
|
|
\
octal-digit
|
|
\
octal-digit
octal-digit
|
|
\
octal-digit
octal-digit
octal-digit
|
hexadecimal-escape-sequence: |
|
|
\x
hexadecimal-digit
|
|
hexadecimal-escape-sequence
hexadecimal-digit
|
|
|
floating-literal: |
|
|
fractional-constant
exponent-partopt
floating-suffixopt
|
|
digit-sequence
exponent-part
floating-suffixopt
|
fractional-constant: |
|
|
digit-sequenceopt
.
digit-sequence
|
|
digit-sequence
.
|
exponent-part: |
|
|
e
signopt
digit-sequence
|
|
E
signopt
digit-sequence
|
sign: |
|
|
+
|
|
-
|
digit-sequence: |
|
|
digit
|
|
digit-sequence
digit
|
floating-suffix: |
|
|
f
|
|
l
|
|
F
|
|
L
|
|
|
string-literal: |
|
|
encoding-prefixopt
"
s-char-sequenceopt
"
C++0x
|
|
encoding-prefixopt
R
raw-string
C++0x
|
encoding-prefix: |
|
|
u8
C++0x
|
|
u
C++0x
|
|
U
C++0x
|
|
L
C++0x
|
s-char-sequence: |
|
|
s-char
|
|
s-char-sequence
s-char
|
s-char: |
|
|
any member of the source character set except the double-quote ", backslash \, or new-line character
|
|
escape-sequence
|
|
universal-character-name
|
raw-string: |
|
|
"
d-char-sequenceopt
(
r-char-sequenceopt
)
d-char-sequenceopt
"
C++0x
|
r-char-sequence: |
|
|
r-char
C++0x
|
|
r-char-sequence
r-char
C++0x
|
r-char: |
|
|
any member of the source character set, except a right parenthesis ) followed by the initial d-char-sequence (which may be empty) followed by a double quote ".
C++0x
|
d-char-sequence: |
|
|
d-char
C++0x
|
|
d-char-sequence
d-char
C++0x
|
d-char: |
|
|
any member of the basic source character set, except: space, the left parenthesis (, the right parenthesis ), the backslash \, and the control characters representing horizontal tab, vertical tab, form feed, and newline.
C++0x
|
|
|
boolean-literal: |
|
|
false
|
|
true
|
|
|
pointer-literal: |
|
|
nullptr
C++0x
|
|
|
user-defined-literal: |
|
|
user-defined-integer-literal
C++0x
|
|
user-defined-floating-literal
C++0x
|
|
user-defined-string-literal
C++0x
|
|
user-defined-character-literal
C++0x
|
user-defined-integer-literal: |
|
|
decimal-literal
ud-suffix
C++0x
|
|
octal-literal
ud-suffix
C++0x
|
|
hexadecimal-literal
ud-suffix
C++0x
|
user-defined-floating-literal: |
|
|
fractional-constant
exponent-partopt
ud-suffix
C++0x
|
|
digit-sequence
exponent-part
ud-suffix
C++0x
|
user-defined-string-literal: |
|
|
string-literal
ud-suffix
C++0x
|
user-defined-character-literal: |
|
|
character-literal
ud-suffix
C++0x
|
ud-suffix: |
|
|
identifier
C++0x
|
|
|
translation-unit: |
|
|
declaration-seqopt
|
|
|
primary-expression: |
|
|
literal
|
|
this
|
|
(
expression
)
|
|
id-expression
|
|
lambda-expression
C++0x
|
id-expression: |
|
|
unqualified-id
|
|
qualified-id
|
unqualified-id: |
|
|
identifier
|
|
operator-function-id
|
|
conversion-function-id
|
|
literal-operator-id
C++0x
|
|
~
class-name
|
|
~
decltype-specifier
C++0x
|
|
template-id
|
qualified-id: |
|
|
::opt
nested-name-specifier
templateopt
unqualified-id
|
|
::
identifier
|
|
::
operator-function-id
|
|
::
literal-operator-id
C++0x
|
|
::
template-id
|
nested-name-specifier: |
|
|
type-name
::
|
|
namespace-name
::
|
|
decltype-specifier
::
C++0x
|
|
nested-name-specifier
identifier
::
|
|
nested-name-specifier
templateopt
simple-template-id
::
|
|
|
lambda-expression: |
|
|
lambda-introducer
lambda-declaratoropt
compound-statement
C++0x
|
lambda-introducer: |
|
|
[
lambda-captureopt
]
C++0x
|
lambda-capture: |
|
|
capture-default
C++0x
|
|
capture-list
C++0x
|
|
capture-default
,
capture-list
C++0x
|
capture-default: |
|
|
&
C++0x
|
|
=
C++0x
|
capture-list: |
|
|
capture
...opt
C++0x
|
|
capture-list
,
capture
...opt
C++0x
|
capture: |
|
|
identifier
C++0x
|
|
&
identifier
C++0x
|
|
this
C++0x
|
lambda-declarator: |
|
|
(
parameter-declaration-clause
)
mutableopt
exception-specificationopt
attribute-specifier-seqopt
trailing-return-typeopt
C++0x
|
|
|
postfix-expression: |
|
|
primary-expression
|
|
postfix-expression
[
expression
]
|
|
postfix-expression
[
braced-init-listopt
]
C++0x
|
|
postfix-expression
(
expression-listopt
)
|
|
simple-type-specifier
(
expression-listopt
)
|
|
typename-specifier
(
expression-listopt
)
|
|
simple-type-specifier
braced-init-list
C++0x
|
|
typename-specifier
braced-init-list
C++0x
|
|
postfix-expression
.
templateopt
id-expression
|
|
postfix-expression
->
templateopt
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
)
|
expression-list: |
|
|
initializer-list
|
pseudo-destructor-name: |
|
|
::opt
nested-name-specifieropt
type-name
::
~
type-name
|
|
::opt
nested-name-specifier
template
simple-template-id
::
~
type-name
C++0x
|
|
::opt
nested-name-specifieropt
~
type-name
|
|
~
decltype-specifier
C++0x
|
|
|
unary-expression: |
|
|
postfix-expression
|
|
++
cast-expression
|
|
--
cast-expression
|
|
unary-operator
cast-expression
|
|
sizeof
unary-expression
|
|
sizeof
(
type-id
)
|
|
sizeof
...
(
identifier
)
C++0x
|
|
alignof
(
type-id
)
C++0x
|
|
noexcept-expression
C++0x
|
|
new-expression
|
|
delete-expression
|
unary-operator: |
|
|
*
|
|
&
|
|
+
|
|
-
|
|
!
|
|
~
|
|
|
new-expression: |
|
|
::opt
new
new-placementopt
new-type-id
new-initializeropt
|
|
::opt
new
new-placementopt
(
type-id
)
new-initializeropt
|
new-placement: |
|
|
(
expression-list
)
|
new-type-id: |
|
|
type-specifier-seq
new-declaratoropt
|
new-declarator: |
|
|
ptr-operator
new-declaratoropt
|
|
noptr-new-declarator
C++0x
|
noptr-new-declarator: |
|
|
[
expression
]
attribute-specifier-seqopt
C++0x
|
|
noptr-new-declarator
[
constant-expression
]
attribute-specifier-seqopt
C++0x
|
new-initializer: |
|
|
(
expression-listopt
)
|
|
braced-init-list
C++0x
|
|
|
delete-expression: |
|
|
::opt
delete
cast-expression
|
|
::opt
delete
[
]
cast-expression
|
|
|
noexcept-expression: |
|
|
noexcept
(
expression
)
C++0x
|
|
|
cast-expression: |
|
|
unary-expression
|
|
(
type-id
)
cast-expression
|
|
|
pm-expression: |
|
|
cast-expression
|
|
pm-expression
.*
cast-expression
|
|
pm-expression
->*
cast-expression
|
|
|
multiplicative-expression: |
|
|
pm-expression
|
|
multiplicative-expression
*
pm-expression
|
|
multiplicative-expression
/
pm-expression
|
|
multiplicative-expression
%
pm-expression
|
|
|
additive-expression: |
|
|
multiplicative-expression
|
|
additive-expression
+
multiplicative-expression
|
|
additive-expression
-
multiplicative-expression
|
|
|
shift-expression: |
|
|
additive-expression
|
|
shift-expression
<<
additive-expression
|
|
shift-expression
>>
additive-expression
|
|
|
relational-expression: |
|
|
shift-expression
|
|
relational-expression
<
shift-expression
|
|
relational-expression
>
shift-expression
|
|
relational-expression
<=
shift-expression
|
|
relational-expression
>=
shift-expression
|
|
|
equality-expression: |
|
|
relational-expression
|
|
equality-expression
==
relational-expression
|
|
equality-expression
!=
relational-expression
|
|
|
and-expression: |
|
|
equality-expression
|
|
and-expression
&
equality-expression
|
|
|
exclusive-or-expression: |
|
|
and-expression
|
|
exclusive-or-expression
^
and-expression
|
|
|
inclusive-or-expression: |
|
|
exclusive-or-expression
|
|
inclusive-or-expression
|
exclusive-or-expression
|
|
|
logical-and-expression: |
|
|
inclusive-or-expression
|
|
logical-and-expression
&&
inclusive-or-expression
|
|
|
logical-or-expression: |
|
|
logical-and-expression
|
|
logical-or-expression
||
logical-and-expression
|
|
|
conditional-expression: |
|
|
logical-or-expression
|
|
logical-or-expression
?
expression
:
assignment-expression
|
|
|
assignment-expression: |
|
|
conditional-expression
|
|
logical-or-expression
assignment-operator
initializer-clause
C++0x
|
|
throw-expression
|
assignment-operator: |
|
|
=
|
|
*=
|
|
/=
|
|
%=
|
|
+=
|
|
-=
|
|
>>=
|
|
<<=
|
|
&=
|
|
^=
|
|
|=
|
|
|
expression: |
|
|
assignment-expression
|
|
expression
,
assignment-expression
|
|
|
constant-expression: |
|
|
conditional-expression
|
|
|
statement: |
|
|
labeled-statement
|
|
attribute-specifier-seqopt
expression-statement
C++0x
|
|
attribute-specifier-seqopt
compound-statement
C++0x
|
|
attribute-specifier-seqopt
selection-statement
C++0x
|
|
attribute-specifier-seqopt
iteration-statement
C++0x
|
|
attribute-specifier-seqopt
jump-statement
C++0x
|
|
declaration-statement
|
|
attribute-specifier-seqopt
try-block
|
|
|
labeled-statement: |
|
|
attribute-specifier-seqopt
identifier
:
statement
|
|
attribute-specifier-seqopt
case
constant-expression
:
statement
|
|
attribute-specifier-seqopt
default
:
statement
|
|
|
expression-statement: |
|
|
expressionopt
;
|
|
|
compound-statement: |
|
|
{
statement-seqopt
}
|
statement-seq: |
|
|
statement
|
|
statement-seq
statement
|
|
|
selection-statement: |
|
|
if
(
condition
)
statement
|
|
if
(
condition
)
statement
else
statement
|
|
switch
(
condition
)
statement
|
condition: |
|
|
expression
|
|
attribute-specifier-seqopt
decl-specifier-seq
declarator
=
initializer-clause
C++0x
|
|
attribute-specifier-seqopt
decl-specifier-seq
declarator
braced-init-list
C++0x
|
|
|
iteration-statement: |
|
|
while
(
condition
)
statement
|
|
do
statement
while
(
expression
)
;
|
|
for
(
for-init-statement
conditionopt
;
expressionopt
)
statement
|
|
for
(
for-range-declaration
:
for-range-initializer
)
statement
C++0x
|
for-init-statement: |
|
|
expression-statement
|
|
simple-declaration
|
for-range-declaration: |
|
|
attribute-specifier-seqopt
type-specifier-seq
declarator
C++0x
|
for-range-initializer: |
|
|
expression
|
|
braced-init-list
|
|
|
jump-statement: |
|
|
break
;
|
|
continue
;
|
|
return
expressionopt
;
|
|
return
braced-init-listopt
;
C++0x
|
|
goto
identifier
;
|
|
|
declaration-statement: |
|
|
block-declaration
|
|
|
declaration-seq: |
|
|
declaration
|
|
declaration-seq
declaration
|
declaration: |
|
|
block-declaration
|
|
function-definition
|
|
template-declaration
|
|
explicit-instantiation
|
|
explicit-specialization
|
|
linkage-specification
|
|
namespace-definition
|
|
empty-declaration
C++0x
|
|
attribute-declaration
C++0x
|
block-declaration: |
|
|
simple-declaration
|
|
asm-definition
|
|
namespace-alias-definition
|
|
using-declaration
|
|
using-directive
|
|
static_assert-declaration
C++0x
|
|
alias-declaration
C++0x
|
|
opaque-enum-declaration
C++0x
|
alias-declaration: |
|
|
using
identifier
=
type-id
;
C++0x
|
simple-declaration: |
|
|
attribute-specifier-seqopt
decl-specifier-seqopt
init-declarator-listopt
;
C++0x
|
static_assert-declaration: |
|
|
static_assert
(
constant-expression
,
string-literal
)
;
C++0x
|
empty-declaration: |
|
|
;
C++0x
|
attribute-declaration: |
|
|
attribute-specifier-seq
;
C++0x
|
|
|
decl-specifier: |
|
|
storage-class-specifier
|
|
type-specifier
|
|
function-specifier
|
|
friend
|
|
typedef
|
|
constexpr
C++0x
|
decl-specifier-seq: |
|
|
decl-specifier
attribute-specifier-seqopt
C++0x
|
|
decl-specifier
decl-specifier-seq
C++0x
|
|
|
storage-class-specifier: |
|
|
auto
Removed in C++0x
|
|
register
|
|
static
|
|
thread_local
C++0x
|
|
extern
|
|
mutable
|
|
|
function-specifier: |
|
|
inline
|
|
virtual
|
|
explicit
|
|
|
typedef-name: |
|
|
identifier
|
|
|
type-specifier: |
|
|
trailing-type-specifier
|
|
class-specifier
|
|
enum-specifier
|
trailing-type-specifier: |
|
|
simple-type-specifier
|
|
elaborated-type-specifier
|
|
typename-specifier
|
|
cv-qualifier
|
type-specifier-seq: |
|
|
type-specifier
attribute-specifier-seqopt
C++0x
|
|
type-specifier
type-specifier-seq
|
trailing-type-specifier-seq: |
|
|
trailing-type-specifier
attribute-specifier-seqopt
C++0x
|
|
trailing-type-specifier
trailing-type-specifier-seq
C++0x
|
|
|
simple-type-specifier: |
|
|
::opt
nested-name-specifieropt
type-name
|
|
::opt
nested-name-specifier
template
simple-template-id
|
|
char
|
|
char16_t
C++0x
|
|
char32_t
C++0x
|
|
wchar_t
|
|
bool
|
|
short
|
|
int
|
|
long
|
|
signed
|
|
unsigned
|
|
float
|
|
double
|
|
void
|
|
auto
C++0x
|
|
decltype-specifier
C++0x
|
type-name: |
|
|
class-name
|
|
enum-name
|
|
typedef-name
|
|
simple-template-id
C++0x
|
decltype-specifier: |
|
|
decltype
(
expression
)
C++0x
|
|
|
elaborated-type-specifier: |
|
|
class-key
attribute-specifier-seqopt
::opt
nested-name-specifieropt
identifier
|
|
class-key
::opt
nested-name-specifieropt
templateopt
simple-template-id
|
|
enum
::opt
nested-name-specifieropt
identifier
|
|
|
enum-name: |
|
|
identifier
|
enum-specifier: |
|
|
enum-head
{
enumerator-listopt
}
C++0x
|
|
enum-head
{
enumerator-list
,
}
C++0x
|
enum-head: |
|
|
enum-key
attribute-specifier-seqopt
identifieropt
enum-baseopt
C++0x
|
|
enum-key
attribute-specifier-seqopt
nested-name-specifier
identifier
enum-baseopt
C++0x
|
opaque-enum-declaration: |
|
|
enum-key
attribute-specifier-seqopt
identifier
enum-baseopt
;
C++0x
|
enum-key: |
|
|
enum
C++0x
|
|
enum
class
C++0x
|
|
enum
struct
C++0x
|
enum-base: |
|
|
:
type-specifier-seq
C++0x
|
enumerator-list: |
|
|
enumerator-definition
C++0x
|
|
enumerator-list
,
enumerator-definition
C++0x
|
enumerator-definition: |
|
|
enumerator
|
|
enumerator
=
constant-expression
|
enumerator: |
|
|
identifier
|
|
|
namespace-name: |
|
|
original-namespace-name
|
|
namespace-alias
|
original-namespace-name: |
|
|
identifier
|
namespace-definition: |
|
|
named-namespace-definition
|
|
unnamed-namespace-definition
|
named-namespace-definition: |
|
|
original-namespace-definition
|
|
extension-namespace-definition
|
original-namespace-definition: |
|
|
inlineopt
namespace
identifier
{
namespace-body
}
C++0x
|
extension-namespace-definition: |
|
|
inlineopt
namespace
original-namespace-name
{
namespace-body
}
C++0x
|
unnamed-namespace-definition: |
|
|
inlineopt
namespace
{
namespace-body
}
|
namespace-body: |
|
|
declaration-seqopt
|
|
|
namespace-alias: |
|
|
identifier
|
namespace-alias-definition: |
|
|
namespace
identifier
=
qualified-namespace-specifier
;
|
qualified-namespace-specifier: |
|
|
::opt
nested-name-specifieropt
namespace-name
|
|
|
using-declaration: |
|
|
using
typenameopt
::opt
nested-name-specifier
unqualified-id
;
|
|
using
::
unqualified-id
;
|
|
|
using-directive: |
|
|
attribute-specifier-seqopt
using
namespace
::opt
nested-name-specifieropt
namespace-name
;
|
|
|
asm-definition: |
|
|
asm
(
string-literal
)
;
|
|
|
linkage-specification: |
|
|
extern
string-literal
{
declaration-seqopt
}
|
|
extern
string-literal
declaration
|
|
|
attribute-specifier-seq: |
|
|
attribute-specifier
C++0x
|
|
attribute-specifier-seq
attribute-specifier
C++0x
|
attribute-specifier: |
|
|
[
[
attribute-list
]
]
C++0x
|
|
alignment-specifier
C++0x
|
alignment-specifier: |
|
|
alignas
(
type-id
...opt
)
C++0x
|
|
alignas
(
assignment-expression
...opt
)
C++0x
|
attribute-list: |
|
|
attributeopt
C++0x
|
|
attribute-list
,
attributeopt
C++0x
|
|
attribute
...
C++0x
|
|
attribute-list
,
attribute
...
C++0x
|
attribute: |
|
|
attribute-token
attribute-argument-clauseopt
C++0x
|
attribute-token: |
|
|
identifier
C++0x
|
|
attribute-scoped-token
C++0x
|
attribute-scoped-token: |
|
|
attribute-namespace
::
identifier
C++0x
|
attribute-namespace: |
|
|
identifier
C++0x
|
attribute-argument-clause: |
|
|
(
balanced-token-seq
)
C++0x
|
balanced-token-seq: |
|
|
balanced-token
C++0x
|
|
balanced-token-seq
balanced-token
C++0x
|
balanced-token: |
|
|
(
balanced-token-seq
)
C++0x
|
|
[
balanced-token-seq
]
C++0x
|
|
{
balanced-token-seq
}
C++0x
|
|
token
C++0x - except a parenthesis, a bracket, or a brace
|
|
|
init-declarator-list: |
|
|
init-declarator
|
|
init-declarator-list
,
init-declarator
|
init-declarator: |
|
|
declarator
initializeropt
|
declarator: |
|
|
ptr-declarator
C++0x
|
|
noptr-declarator
parameters-and-qualifiers
trailing-return-type
C++0x
|
ptr-declarator: |
|
|
noptr-declarator
C++0x
|
|
ptr-operator
ptr-declarator
C++0x
|
noptr-declarator: |
|
|
declarator-id
attribute-specifier-seqopt
C++0x
|
|
noptr-declarator
parameters-and-qualifiers
C++0x
|
|
noptr-declarator
[
constant-expressionopt
]
attribute-specifier-seqopt
C++0x
|
|
(
ptr-declarator
)
C++0x
|
parameters-and-qualifiers: |
|
|
(
parameter-declaration-clause
)
attribute-specifier-seqopt
cv-qualifier-seqopt
ref-qualifieropt
exception-specificationopt
C++0x
|
trailing-return-type: |
|
|
->
trailing-type-specifier-seq
abstract-declaratoropt
C++0x
|
ptr-operator: |
|
|
*
attribute-specifier-seqopt
cv-qualifier-seqopt
C++0x
|
|
&
attribute-specifier-seqopt
C++0x
|
|
&&
attribute-specifier-seqopt
C++0x
|
|
::opt
nested-name-specifier
*
attribute-specifier-seqopt
cv-qualifier-seqopt
C++0x
|
cv-qualifier-seq: |
|
|
cv-qualifier
|
|
cv-qualifier
cv-qualifier-seq
|
cv-qualifier: |
|
|
const
|
|
volatile
|
ref-qualifier: |
|
|
&
C++0x
|
|
&&
C++0x
|
declarator-id: |
|
|
...opt
id-expression
C++0x
|
|
::opt
nested-name-specifieropt
class-name
C++0x
|
|
|
type-id: |
|
|
type-specifier-seq
abstract-declaratoropt
|
abstract-declarator: |
|
|
ptr-abstract-declarator
C++0x
|
|
noptr-abstract-declaratoropt
parameters-and-qualifiers
trailing-return-type
C++0x
|
|
...
C++0x
|
ptr-abstract-declarator: |
|
|
noptr-abstract-declarator
C++0x
|
|
ptr-operator
ptr-abstract-declaratoropt
C++0x
|
noptr-abstract-declarator: |
|
|
noptr-abstract-declaratoropt
parameters-and-qualifiers
C++0x
|
|
noptr-abstract-declaratoropt
[
constant-expression
]
attribute-specifier-seqopt
C++0x
|
|
(
ptr-abstract-declarator
)
C++0x
|
|
|
parameter-declaration-clause: |
|
|
parameter-declaration-listopt
...opt
|
|
parameter-declaration-list
,
...
|
parameter-declaration-list: |
|
|
parameter-declaration
|
|
parameter-declaration-list
,
parameter-declaration
|
parameter-declaration: |
|
|
attribute-specifier-seqopt
decl-specifier-seq
declarator
C++0x
|
|
attribute-specifier-seqopt
decl-specifier-seq
declarator
=
initializer-clause
C++0x
|
|
attribute-specifier-seqopt
decl-specifier-seq
abstract-declaratoropt
C++0x
|
|
attribute-specifier-seqopt
decl-specifier-seq
abstract-declaratoropt
=
initializer-clause
C++0x
|
|
|
function-definition: |
|
|
attribute-specifier-seqopt
decl-specifier-seqopt
declarator
function-body
C++0x
|
|
attribute-specifier-seqopt
decl-specifier-seqopt
declarator
=
default
;
C++0x
|
|
attribute-specifier-seqopt
decl-specifier-seqopt
declarator
=
delete
;
C++0x
|
function-body: |
|
|
ctor-initializeropt
compound-statement
C++0x
|
|
function-try-block
C++0x
|
|
|
initializer: |
|
|
brace-or-equal-initializer
C++0x
|
|
(
expression-list
)
C++0x
|
brace-or-equal-initializer: |
|
|
=
initializer-clause
C++0x
|
|
braced-init-list
C++0x
|
initializer-clause: |
|
|
assignment-expression
C++0x
|
|
braced-init-list
C++0x
|
initializer-list: |
|
|
initializer-clause
...opt
C++0x
|
|
initializer-list
,
initializer-clause
...opt
C++0x
|
braced-init-list: |
|
|
{
initializer-list
,opt
}
C++0x
|
|
{
}
C++0x
|
|
|
class-name: |
|
|
identifier
|
|
simple-template-id
C++0x
|
class-specifier: |
|
|
class-head
{
member-specificationopt
}
|
class-head: |
|
|
class-key
attribute-specifier-seqopt
class-head-name
class-virt-specifier-seqopt
base-clauseopt
C++0x
|
|
class-key
attribute-specifier-seqopt
base-clauseopt
C++0x
|
class-head-name: |
|
|
nested-name-specifieropt
class-name
C++0x
|
class-virt-specifier-seq: |
|
|
class-virt-specifier
C++0x
|
|
class-virt-specifier-seq
class-virt-specifier
C++0x
|
class-virt-specifier: |
|
|
final
C++0x
|
class-key: |
|
|
class
|
|
struct
|
|
union
|
|
|
member-specification: |
|
|
member-declaration
member-specificationopt
|
|
access-specifier
:
member-specificationopt
|
member-declaration: |
|
|
attribute-specifier-seqopt
decl-specifier-seqopt
member-declarator-listopt
;
C++0x
|
|
function-definition
;opt
|
|
using-declaration
|
|
static_assert-declaration
C++0x
|
|
template-declaration
|
|
alias-declaration
C++0x
|
member-declarator-list: |
|
|
member-declarator
|
|
member-declarator-list
,
member-declarator
|
member-declarator: |
|
|
declarator
virt-specifier-seqopt
pure-specifieropt
|
|
declarator
virt-specifier-seqopt
brace-or-equal-initializeropt
C++0x
|
|
identifieropt
attribute-specifier-seqopt
virt-specifier-seqopt
:
constant-expression
|
virt-specifier-seq: |
|
|
virt-specifier
|
|
virt-specifier-seq
virt-specifier
|
virt-specifier: |
|
|
override
|
|
final
|
|
new
|
pure-specifier: |
|
|
=
0
|
|
|
base-clause: |
|
|
:
base-specifier-list
|
base-specifier-list: |
|
|
base-specifier
...opt
C++0x
|
|
base-specifier-list
,
base-specifier
...opt
C++0x
|
base-specifier: |
|
|
attribute-specifier-seqopt
base-type-specifier
C++0x
|
|
attribute-specifier-seqopt
virtual
access-specifieropt
base-type-specifier
C++0x
|
|
attribute-specifier-seqopt
access-specifier
virtualopt
base-type-specifier
C++0x
|
class-or-decltype: |
|
|
::opt
nested-name-specifieropt
class-name
C++0x
|
|
decltype-specifier
C++0x
|
base-type-specifier: |
|
|
class-or-decltype
C++0x
|
access-specifier: |
|
|
private
|
|
protected
|
|
public
|
|
|
conversion-function-id: |
|
|
operator
conversion-type-id
|
conversion-type-id: |
|
|
type-specifier-seq
conversion-declaratoropt
|
conversion-declarator: |
|
|
ptr-operator
conversion-declaratoropt
|
|
|
ctor-initializer: |
|
|
:
mem-initializer-list
|
mem-initializer-list: |
|
|
mem-initializer
...opt
C++0x
|
|
mem-initializer
,
mem-initializer-list
...opt
C++0x
|
mem-initializer: |
|
|
mem-initializer-id
(
expression-listopt
)
|
|
mem-initializer-id
braced-init-list
C++0x
|
mem-initializer-id: |
|
|
class-or-decltype
|
|
identifier
|
|
|
operator-function-id: |
See C++ Standard Core Language Issue n. 189 |
|
operator
overloadable-operator
|
|
operator
overloadable-operator
<
template-argument-listopt
>
|
overloadable-operator: |
See C++ Standard Core Language Issue n. 189 |
|
new
|
|
delete
|
|
new
[
]
|
|
delete
[
]
|
|
+
|
|
-
|
|
*
|
|
/
|
|
%
|
|
^
|
|
&
|
|
|
|
|
~
|
|
!
|
|
=
|
|
<
|
|
>
|
|
+=
|
|
-=
|
|
*=
|
|
/=
|
|
%=
|
|
^=
|
|
&=
|
|
|=
|
|
<<
|
|
>>
|
|
>>=
|
|
<<=
|
|
==
|
|
!=
|
|
<=
|
|
>=
|
|
&&
|
|
||
|
|
++
|
|
--
|
|
,
|
|
->*
|
|
->
|
|
()
|
|
[]
|
|
|
literal-operator-id: |
|
|
operator
""
identifier
C++0x
|
|
|
template-declaration: |
|
|
template
<
template-parameter-list
>
declaration
C++0x - The export keyword is reserved for future use
|
template-parameter-list: |
|
|
template-parameter
|
|
template-parameter-list
,
template-parameter
|
|
|
template-parameter: |
|
|
type-parameter
|
|
parameter-declaration
|
type-parameter: |
|
|
class
...opt
identifieropt
C++0x
|
|
class
identifieropt
=
type-id
|
|
typename
...opt
identifieropt
C++0x
|
|
typename
identifieropt
=
type-id
|
|
template
<
template-parameter-list
>
class
...opt
identifieropt
C++0x
|
|
template
<
template-parameter-list
>
class
identifieropt
=
id-expression
|
|
|
simple-template-id: |
|
|
template-name
<
template-argument-listopt
>
C++0x
|
template-id: |
|
|
simple-template-id
C++0x
|
|
operator-function-id
<
template-argument-listopt
>
C++0x
|
|
literal-operator-id
<
template-argument-listopt
>
C++0x
|
template-name: |
|
|
identifier
|
template-argument-list: |
|
|
template-argument
...opt
C++0x
|
|
template-argument-list
,
template-argument
...opt
C++0x
|
template-argument: |
|
|
constant-expression
C++0x
|
|
type-id
C++0x
|
|
id-expression
C++0x
|
|
|
typename-specifier: |
|
|
typename
::opt
nested-name-specifier
identifier
C++0x
|
|
typename
::opt
nested-name-specifier
templateopt
simple-template-id
C++0x
|
|
|
explicit-instantiation: |
|
|
externopt
template
declaration
C++0x
|
|
|
explicit-specialization: |
|
|
template
<
>
declaration
|
|
|
try-block: |
|
|
try
compound-statement
handler-seq
|
function-try-block: |
|
|
try
ctor-initializeropt
compound-statement
handler-seq
C++0x
|
handler-seq: |
|
|
handler
|
|
handler
handler-seq
|
handler: |
|
|
catch
(
exception-declaration
)
compound-statement
|
exception-declaration: |
|
|
attribute-specifier-seqopt
type-specifier-seq
declarator
C++0x
|
|
attribute-specifier-seqopt
type-specifier-seq
abstract-declaratoropt
C++0x
|
|
...
C++0x
|
throw-expression: |
|
|
throw
assignment-expressionopt
|
|
|
exception-specification: |
|
|
dynamic-exception-specification
C++0x
|
|
noexcept-specification
C++0x
|
dynamic-exception-specification: |
|
|
throw
(
type-id-listopt
)
C++0x
|
type-id-list: |
|
|
type-id
...opt
C++0x
|
|
type-id-list
,
type-id
...opt
C++0x
|
noexcept-specification: |
|
|
noexcept
(
constant-expression
)
C++0x
|
|
noexcept
C++0x
|
|
|
preprocessing-file: |
|
|
groupopt
|
group: |
|
|
group-part
|
|
group
group-part
|
group-part: |
|
|
if-section
|
|
control-line
|
|
text-line
C++0x
|
|
#
non-directive
C++0x
|
if-section: |
|
|
if-group
elif-groupsopt
else-groupopt
endif-line
|
if-group: |
|
|
#
if
constant-expression
new-line
groupopt
|
|
#
ifdef
identifier
new-line
groupopt
|
|
#
ifndef
identifier
new-line
groupopt
|
elif-groups: |
|
|
elif-group
|
|
elif-groups
elif-group
|
elif-group: |
|
|
#
elif
constant-expression
new-line
groupopt
|
else-group: |
|
|
#
else
new-line
groupopt
|
endif-line: |
|
|
#
endif
new-line
|
control-line: |
|
|
#
include
pp-tokens
new-line
|
|
#
define
identifier
replacement-list
new-line
|
|
#
define
identifier
lparen
identifier-listopt
)
replacement-list
new-line
C++0x
|
|
#
define
identifier
lparen
identifier-list
,
...
)
replacement-list
new-line
C++0x
|
|
#
undef
identifier
new-line
|
|
#
line
pp-tokens
new-line
|
|
#
error
pp-tokensopt
new-line
|
|
#
pragma
pp-tokensopt
new-line
|
|
#
new-line
|
text-line: |
|
|
pp-tokensopt
new-line
C++0x
|
non-directive: |
|
|
pp-tokens
new-line
C++0x
|
lparen: |
|
|
a ( character not immediately preceded by white-space
|
identifier-list: |
|
|
identifier
|
|
identifier-list
,
identifier
|
replacement-list: |
|
|
pp-tokensopt
|
pp-tokens: |
|
|
preprocessing-token
|
|
pp-tokens
preprocessing-token
|
new-line: |
|
|
the new-line character
|