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
|
|
string-literal
|
|
preprocessing-op-or-punc
|
|
each non-white-space character that cannot be one of the above
|
|
|
token: |
|
|
identifier
|
|
keyword
|
|
literal
|
| Note: please refer to the C++ Standard Core Language Issue n. 189: Definition of operator and punctuator
operator-token
|
|
punctuator
|
|
|
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
nondigit
|
|
pp-number
e
sign
|
|
pp-number
E
sign
|
|
pp-number
.
|
|
|
identifier: |
|
|
nondigit
|
|
identifier
nondigit
|
|
identifier
digit
|
nondigit: |
|
|
universal-character-name
|
| Note: The following symbol is an underscore
_
|
|
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
|
digit: |
|
|
0
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
|
keyword: |
|
|
asm
|
|
auto
|
|
bool
|
|
break
|
|
case
|
|
catch
|
|
char
|
|
class
|
|
const
|
|
const_cast
|
|
continue
|
|
default
|
|
delete
|
|
do
|
|
double
|
|
dynamic_cast
|
|
else
|
|
enum
|
|
explicit
|
|
export
|
|
extern
|
|
false
|
|
float
|
|
for
|
|
friend
|
|
goto
|
|
if
|
|
inline
|
|
int
|
|
long
|
|
mutable
|
|
namespace
|
|
new
|
|
operator
|
|
private
|
|
protected
|
|
public
|
|
register
|
|
reinterpret_cast
|
|
return
|
|
short
|
|
signed
|
|
sizeof
|
|
static
|
|
static_cast
|
|
struct
|
|
switch
|
|
template
|
|
this
|
|
throw
|
|
true
|
|
try
|
|
typedef
|
|
typeid
|
|
typename
|
|
union
|
|
unsigned
|
|
using
|
|
virtual
|
|
void
|
|
volatile
|
|
wchar_t
|
|
while
|
|
|
operator-token: |
|
| Note: please refer to the C++ Standard Core Language Issue n. 189: Definition of operator and punctuator
See below: preprocessing-op-or-punc
|
punctuator: |
|
| Note: please refer to the C++ Standard Core Language Issue n. 189: Definition of operator and punctuator
See below: preprocessing-op-or-punc
|
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
|
|
|
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-literal
|
|
0X
hexadecimal-literal
|
|
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
|
|
long-suffix
unsigned-suffixopt
|
unsigned-suffix: |
|
|
u
|
|
U
|
long-suffix: |
|
|
l
|
|
L
|
|
|
character-literal: |
|
|
'
c-char-sequence
'
|
|
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: |
|
|
"
s-char-sequenceopt
"
|
|
L
"
s-char-sequenceopt
"
|
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
|
|
|
boolean-literal: |
|
|
false
|
|
true
|
|
|
translation-unit: |
|
|
declaration-seqopt
|
|
|
primary-expression: |
|
|
literal
|
|
this
|
|
(
expression
)
|
|
id-expression
|
id-expression: |
|
|
unqualified-id
|
|
qualified-id
|
unqualified-id: |
|
|
identifier
|
|
operator-function-id
|
|
conversion-function-id
|
|
~
class-name
|
|
template-id
|
qualified-id: |
|
|
::opt
nested-name-specifier
templateopt
unqualified-id
|
|
::
identifier
|
|
::
operator-function-id
|
|
::
template-id
|
nested-name-specifier: |
|
|
class-or-namespace-name
::
nested-name-specifieropt
|
|
class-or-namespace-name
::
template
nested-name-specifier
|
class-or-namespace-name: |
|
|
class-name
|
|
namespace-name
|
|
|
postfix-expression: |
|
|
primary-expression
|
|
postfix-expression
[
expression
]
|
|
postfix-expression
(
expression-listopt
)
|
|
simple-type-specifier
(
expression-listopt
)
|
|
typename
::opt
nested-name-specifier
identifier
(
expression-listopt
)
|
|
typename
::opt
nested-name-specifier
templateopt
template-id
(
expression-listopt
)
|
|
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: |
|
|
assignment-expression
|
|
expression-list
,
assignment-expression
|
pseudo-destructor-name: |
|
|
::opt
nested-name-specifieropt
type-name
::
~
type-name
|
|
::opt
nested-name-specifier
template
template-id
::
~
type-name
|
|
::opt
nested-name-specifieropt
~
type-name
|
|
|
unary-expression: |
|
|
postfix-expression
|
|
++
cast-expression
|
|
--
cast-expression
|
|
unary-operator
cast-expression
|
|
sizeof
unary-expression
|
|
sizeof
(
type-id
)
|
|
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
|
|
direct-new-declarator
|
direct-new-declarator: |
|
|
[
expression
]
|
|
direct-new-declarator
[
constant-expression
]
|
new-initializer: |
|
|
(
expression-listopt
)
|
|
|
delete-expression: |
|
|
::opt
delete
cast-expression
|
|
::opt
delete
[
]
cast-expression
|
|
|
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
assignment-expression
|
|
throw-expression
|
assignment-operator: |
|
|
=
|
|
*=
|
|
/=
|
|
%/
|
|
+=
|
|
-=
|
|
>>=
|
|
<<=
|
|
&=
|
|
^=
|
|
|=
|
|
|
expression: |
|
|
assignment-expression
|
|
expression
,
assignment-expression
|
|
|
constant-expression: |
|
|
conditional-expression
|
|
|
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: |
|
|
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
|
|
type-specifier-seq
declarator
=
assignment-expression
|
|
|
iteration-statement: |
|
|
while
(
condition
)
statement
|
|
do
statement
while
(
expression
)
;
|
|
for
(
for-init-statement
conditionopt
;
expressionopt
)
statement
|
for-init-statement: |
|
|
expression-statement
|
|
simple-declaration
|
|
|
jump-statement: |
|
|
break
;
|
|
continue
;
|
|
return
expressionopt
;
|
|
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
|
block-declaration: |
|
|
simple-declaration
|
|
asm-definition
|
|
namespace-alias-definition
|
|
using-declaration
|
|
using-directive
|
simple-declaration: |
|
|
decl-specifier-seqopt
init-declarator-listopt
;
|
|
|
decl-specifier: |
|
|
storage-class-specifier
|
|
type-specifier
|
|
function-specifier
|
|
friend
|
|
typedef
|
decl-specifier-seq: |
|
|
decl-specifier-seqopt
decl-specifier
|
|
|
storage-class-specifier: |
|
|
auto
|
|
register
|
|
static
|
|
extern
|
|
mutable
|
|
|
function-specifier: |
|
|
inline
|
|
virtual
|
|
explicit
|
|
|
typedef-name: |
|
|
identifier
|
|
|
type-specifier: |
|
|
simple-type-specifier
|
|
class-specifier
|
|
enum-specifier
|
|
elaborated-type-specifier
|
|
cv-qualifier
|
|
|
simple-type-specifier: |
|
|
::opt
nested-name-specifieropt
type-name
|
|
::opt
nested-name-specifier
template
template-id
|
|
char
|
|
wchar_t
|
|
bool
|
|
short
|
|
int
|
|
long
|
|
signed
|
|
unsigned
|
|
float
|
|
double
|
|
void
|
type-name: |
|
|
class-name
|
|
enum-name
|
|
typedef-name
|
|
|
elaborated-type-specifier: |
|
|
class-key
::opt
nested-name-specifieropt
identifier
|
|
class-key
::opt
nested-name-specifieropt
templateopt
template-id
|
|
enum
::opt
nested-name-specifieropt
identifier
|
|
typename
::opt
nested-name-specifier
identifier
|
|
typename
::opt
nested-name-specifier
templateopt
template-id
|
|
|
enum-name: |
|
|
identifier
|
enum-specifier: |
|
|
enum
identifieropt
{
enumerator-listopt
}
|
enumerator-list: |
|
|
enumerator-definition
|
|
enumerator-list
,
enumerator-definition
|
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: |
|
|
namespace
identifier
{
namespace-body
}
|
extension-namespace-definition: |
|
|
namespace
original-namespace-name
{
namespace-body
}
|
unnamed-namespace-definition: |
|
|
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: |
|
|
using
namespace
::opt
nested-name-specifieropt
namespace-name
;
|
|
|
asm-definition: |
|
|
asm
(
string-literal
)
;
|
|
|
linkage-specification: |
|
|
extern
string-literal
{
declaration-seqopt
}
|
|
extern
string-literal
declaration
|
|
|
init-declarator-list: |
|
|
init-declarator
|
|
init-declarator-list
,
init-declarator
|
init-declarator: |
|
|
declarator
initializeropt
|
declarator: |
|
|
direct-declarator
|
|
ptr-operator
declarator
|
direct-declarator: |
|
|
declarator-id
|
|
direct-declarator
(
parameter-declaration-clause
)
cv-qualifier-seqopt
exception-specificationopt
|
|
direct-declarator
[
constant-expressionopt
]
|
|
(
declarator
)
|
ptr-operator: |
|
|
*
cv-qualifier-seqopt
|
|
&
|
|
::opt
nested-name-specifier
*
cv-qualifier-seqopt
|
cv-qualifier-seq: |
|
|
cv-qualifier
cv-qualifier-seqopt
|
cv-qualifier: |
|
|
const
|
|
volatile
|
declarator-id: |
|
|
id-expression
|
|
::opt
nested-name-specifieropt
type-name
|
|
|
type-id: |
|
|
type-specifier-seq
abstract-declaratoropt
|
type-specifier-seq: |
|
|
type-specifier
type-specifier-seqopt
|
abstract-declarator: |
|
|
ptr-operator
abstract-declaratoropt
|
|
direct-abstract-declarator
|
direct-abstract-declarator: |
|
|
direct-abstract-declaratoropt
(
parameter-declaration-clause
)
cv-qualifier-seqopt
exception-specificationopt
|
|
direct-abstract-declaratoropt
[
constant-expressionopt
]
|
|
(
abstract-declarator
)
|
|
|
parameter-declaration-clause: |
|
|
parameter-declaration-listopt
...opt
|
|
parameter-declaration-list
,
...
|
parameter-declaration-list: |
|
|
parameter-declaration
|
|
parameter-declaration-list
,
parameter-declaration
|
parameter-declaration: |
|
|
decl-specifier-seq
declarator
|
|
decl-specifier-seq
declarator
=
assignment-expression
|
|
decl-specifier-seq
abstract-declaratoropt
|
|
decl-specifier-seq
abstract-declaratoropt
=
assignment-expression
|
|
|
function-definition: |
|
|
decl-specifier-seqopt
declarator
ctor-initializeropt
function-body
|
|
decl-specifier-seqopt
declarator
function-try-block
|
function-body: |
|
|
compound-statement
|
|
|
initializer: |
|
|
=
initializer-clause
|
|
(
expression-list
)
|
initializer-clause: |
|
|
assignment-expression
|
|
{
initializer-list
,opt
}
|
|
{
}
|
initializer-list: |
|
|
initializer-clause
|
|
initializer-list
,
initializer-clause
|
|
|
class-name: |
|
|
identifier
|
|
template-id
|
class-specifier: |
|
|
class-head
{
member-specificationopt
}
|
class-head: |
|
|
class-key
identifieropt
base-clauseopt
|
|
class-key
nested-name-specifier
identifier
base-clauseopt
|
|
class-key
nested-name-specifieropt
template-id
base-clauseopt
|
class-key: |
|
|
class
|
|
struct
|
|
union
|
|
|
member-specification: |
|
|
member-declaration
member-specificationopt
|
|
access-specifier
:
member-specificationopt
|
member-declaration: |
|
|
decl-specifier-seqopt
member-declarator-listopt
;
|
|
function-definition
;opt
|
|
::opt
nested-name-specifier
templateopt
unqualified-id
;
|
|
using-declaration
|
|
template-declaration
|
member-declarator-list: |
|
|
member-declarator
|
|
member-declarator-list
,
member-declarator
|
member-declarator: |
|
|
declarator
pure-specifieropt
|
|
declarator
constant-initializeropt
|
|
identifieropt
:
constant-expression
|
pure-specifier: |
|
|
= 0
|
constant-initializer: |
|
|
=
constant-expression
|
|
|
base-clause: |
|
|
:
base-specifier-list
|
base-specifier-list: |
|
|
base-specifier
|
|
base-specifier-list
,
base-specifier
|
base-specifier: |
|
|
::opt
nested-name-specifieropt
class-name
|
|
virtual
access-specifieropt
::opt
nested-name-specifieropt
class-name
|
|
access-specifier
virtualopt
::opt
nested-name-specifieropt
class-name
|
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
|
|
mem-initializer
,
mem-initializer-list
|
mem-initializer: |
|
|
mem-initializer-id
(
expression-listopt
)
|
mem-initializer-id: |
|
|
::opt
nested-name-specifieropt
class-name
|
|
identifier
|
|
|
operator-function-id: | Note: please refer to the C++ Standard Core Language Issue n. 189: Definition of operator and punctuator |
|
operator
overloadable-operator
|
|
operator
overloadable-operator
<
template-argument-listopt
>
|
overloadable-operator: | Note: please refer to the C++ Standard Core Language Issue n. 189: Definition of operator and punctuator |
|
new
|
|
delete
|
|
new[]
|
|
delete[]
|
|
+
|
|
-
|
|
*
|
|
/
|
|
%
|
|
^
|
|
&
|
|
|
|
|
~
|
|
!
|
|
=
|
|
<
|
|
>
|
|
+=
|
|
-=
|
|
*=
|
|
/=
|
|
%=
|
|
^=
|
|
&=
|
|
|=
|
|
<<
|
|
>>
|
|
>>=
|
|
<<=
|
|
==
|
|
!=
|
|
<=
|
|
>=
|
|
&&
|
|
||
|
|
++
|
|
--
|
|
,
|
|
->*
|
|
->
|
|
()
|
|
[]
|
|
|
template-declaration: |
|
|
exportopt
template
<
template-parameter-list
>
declaration
|
template-parameter-list: |
|
|
template-parameter
|
|
template-parameter-list
,
template-parameter
|
|
|
template-parameter: |
|
|
type-parameter
|
|
parameter-declaration
|
type-parameter: |
|
|
class
identifieropt
|
|
class
identifieropt
=
type-id
|
|
typename
identifieropt
|
|
typename
identifieropt
=
type-id
|
|
template
<
template-parameter-list
>
class
identifieropt
|
|
template
<
template-parameter-list
>
class
identifieropt
=
id-expression
|
|
|
template-id: |
|
|
template-name
<
template-argument-listopt
>
|
template-name: |
|
|
identifier
|
template-argument-list: |
|
|
template-argument
|
|
template-argument-list
,
template-argument
|
template-argument: |
|
|
assignment-expression
|
|
type-id
|
|
id-expression
|
|
|
explicit-instantiation: |
|
|
template
declaration
|
|
|
explicit-specialization: |
|
|
template
<
>
declaration
|
|
|
try-block: |
|
|
try
compound-statement
handler-seq
|
function-try-block: |
|
|
try
ctor-initializeropt
function-body
handler-seq
|
handler-seq: |
|
|
handler
handler-seqopt
|
handler: |
|
|
catch
(
exception-declaration
)
compound-statement
|
exception-declaration: |
|
|
type-specifier-seq
declarator
|
|
type-specifier-seq
abstract-declarator
|
|
type-specifier-seq
|
|
...
|
throw-expression: |
|
|
throw
assignment-expressionopt
|
|
|
exception-specification: |
|
|
throw
(
type-id-listopt
)
|
type-id-list: |
|
|
type-id
|
|
type-id-list
,
type-id
|
|
|
preprocessing-file: |
|
|
groupopt
|
group: |
|
|
group-part
|
|
group
group-part
|
group-part: |
|
|
pp-tokensopt
new-line
|
|
if-section
|
|
control-line
|
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
|
| Note: please refer to the C++ Standard Core Language Issue n. 394: identifier-list is never defined
#
define
identifier
lparen
identifier-listopt
)
replacement-list
new-line
|
|
#
undef
identifier
new-line
|
|
#
line
pp-tokens
new-line
|
|
#
error
pp-tokensopt
new-line
|
|
#
pragma
pp-tokensopt
new-line
|
|
#
new-line
|
lparen: |
|
|
the left-parenthesis character without preceding white-space
|
identifier-list: | Note: please refer to the C++ Standard Core Language Issue n. 394: identifier-list is never defined |
|
identifier
|
|
identifier-list
,
identifier
|
replacement-list: |
|
|
pp-tokensopt
|
pp-tokens: |
|
|
preprocessing-token
|
|
pp-tokens
preprocessing-token
|
new-line: |
|
|
the new-line character
|