translation_unit:
declaration
translation_unit
::=
declaration
*
no references
declaration:
access-specifier
identifier
...
unnamed-declaration
alias
declaration
::=
access-specifier
?
identifier
( '...'?
unnamed-declaration
|
alias
)
referenced by:
parameter-declaration
statement
translation_unit
access-specifier:
public
protected
private
access-specifier
::= 'public'
| 'protected'
| 'private'
referenced by:
declaration
alias:
:
template-parameter-declaration-list
type
requires-clause
==
type-id
type-id
requires-clause
==
expression
namespace
==
id-expression
;
alias
::= ':' (
template-parameter-declaration-list
? ( 'type'
requires-clause
? '=='
type-id
|
type-id
?
requires-clause
? '=='
expression
) | 'namespace' '=='
id-expression
) ';'
referenced by:
declaration
prefix-operator:
!
-
+
prefix-operator
::= '!'
| '-'
| '+'
referenced by:
is-as-expression
postfix-operator:
++
--
*
&
~
$
...
postfix-operator
::= '++'
| '--'
| '*'
| '&'
| '~'
| '$'
| '...'
referenced by:
is-as-expression
assignment-operator:
=
*=
/=
%=
+=
-=
>>=
<<=
&=
^=
|=
assignment-operator
::= '='
| '*='
| '/='
| '%='
| '+='
| '-='
| '>>='
| '<<='
| '&='
| '^='
| '|='
referenced by:
assignment-expression
primary-expression:
inspect-expression
id-expression
literal
(
expression-list
)
{
expression-list
}
unnamed-declaration
primary-expression
::=
inspect-expression
|
id-expression
|
literal
| '('
expression-list
')'
| '{'
expression-list
'}'
|
unnamed-declaration
referenced by:
is-as-expression
multiplicative-expression:
is-as-expression
*
/
%
multiplicative-expression
::=
is-as-expression
( ( '*' | '/' | '%' )
is-as-expression
)*
referenced by:
additive-expression
additive-expression:
multiplicative-expression
+
-
additive-expression
::=
multiplicative-expression
( ( '+' | '-' )
multiplicative-expression
)*
referenced by:
shift-expression
shift-expression:
additive-expression
<<
>>
shift-expression
::=
additive-expression
( ( '<<' | '>>' )
additive-expression
)*
referenced by:
compare-expression
compare-expression:
shift-expression
<=>
compare-expression
::=
shift-expression
( '<=>'
shift-expression
)*
referenced by:
relational-expression
relational-expression:
compare-expression
<
>
<=
>=
relational-expression
::=
compare-expression
( ( '<' | '>' | '<=' | '>=' )
compare-expression
)*
referenced by:
equality-expression
equality-expression:
relational-expression
==
!=
equality-expression
::=
relational-expression
( ( '==' | '!=' )
relational-expression
)*
referenced by:
bit-and-expression
bit-and-expression:
equality-expression
&
bit-and-expression
::=
equality-expression
( '&'
equality-expression
)*
referenced by:
bit-xor-expression
bit-xor-expression:
bit-and-expression
^
bit-xor-expression
::=
bit-and-expression
( '^'
bit-and-expression
)*
referenced by:
bit-or-expression
bit-or-expression:
bit-xor-expression
|
bit-or-expression
::=
bit-xor-expression
( '|'
bit-xor-expression
)*
referenced by:
logical-and-expression
logical-and-expression:
bit-or-expression
&&
logical-and-expression
::=
bit-or-expression
( '&&'
bit-or-expression
)*
referenced by:
logical-or-expression
logical-or-expression:
logical-and-expression
||
logical-or-expression
::=
logical-and-expression
( '||'
logical-and-expression
)*
referenced by:
assignment-expression
contract
iteration-statement
requires-clause
selection-statement
assignment-expression:
logical-or-expression
assignment-operator
assignment-expression
::=
logical-or-expression
(
assignment-operator
logical-or-expression
)*
referenced by:
expression
next-clause
expression:
assignment-expression
expression
::=
assignment-expression
referenced by:
alias
contract
expression-list
expression-statement
inspect-expression
is-value-constraint
iteration-statement
return-statement
template-argument
expression-list:
parameter-direction
expression
,
expression-list
::=
parameter-direction
?
expression
( ','
parameter-direction
?
expression
)*
referenced by:
is-as-expression
primary-expression
type-id:
type-qualifier
qualified-id
unqualified-id
type-id
::=
type-qualifier
* (
qualified-id
|
unqualified-id
)
referenced by:
alias
as-type-cast
inspect-expression
is-type-constraint
return-list
template-argument
unnamed-declaration
type-qualifier:
const
*
type-qualifier
::= 'const'
| '*'
referenced by:
type-id
is-as-expression:
prefix-operator
primary-expression
postfix-operator
[
expression-list
]
(
expression-list
)
.
id-expression
is-type-constraint
is-value-constraint
as-type-cast
is-as-expression
::=
prefix-operator
*
primary-expression
(
postfix-operator
| '['
expression-list
? ']' | '('
expression-list
? ')' | '.'
id-expression
)* (
is-type-constraint
|
is-value-constraint
|
as-type-cast
)*
referenced by:
multiplicative-expression
is-type-constraint:
is
type-id
is-type-constraint
::= 'is'
type-id
referenced by:
alternative
is-as-expression
is-value-constraint:
is
expression
is-value-constraint
::= 'is'
expression
referenced by:
alternative
is-as-expression
as-type-cast:
as
type-id
as-type-cast
::= 'as'
type-id
referenced by:
alternative
is-as-expression
unqualified-id:
identifier
keyword
template-id
unqualified-id
::=
identifier
|
keyword
|
template-id
referenced by:
id-expression
member-name-specifier
nested-name-specifier
qualified-id
type-id
template-id:
identifier
<
template-argument-list
>
template-id
::=
identifier
'<'
template-argument-list
? '>'
referenced by:
unqualified-id
template-argument-list:
template-argument-list
,
template-argument
template-argument-list
::=
template-argument-list
','
template-argument
referenced by:
template-argument-list
template-id
template-argument:
const
type-id
expression
template-argument
::= 'const'?
type-id
|
expression
referenced by:
template-argument-list
qualified-id:
nested-name-specifier
member-name-specifier
unqualified-id
qualified-id
::= (
nested-name-specifier
|
member-name-specifier
)
unqualified-id
referenced by:
id-expression
type-id
nested-name-specifier:
unqualified-id
::
nested-name-specifier
::=
unqualified-id
? '::'
referenced by:
qualified-id
member-name-specifier:
unqualified-id
.
member-name-specifier
::=
unqualified-id
'.'
referenced by:
qualified-id
id-expression:
qualified-id
unqualified-id
id-expression
::=
qualified-id
|
unqualified-id
referenced by:
alias
contract-group
is-as-expression
primary-expression
unnamed-declaration
using-statement
literal:
integer-literal
character-literal
floating-point-literal
string-literal
boolean-literal
pointer-literal
user-defined-literal
ud-suffix
literal
::= (
integer-literal
|
character-literal
|
floating-point-literal
|
string-literal
|
boolean-literal
|
pointer-literal
|
user-defined-literal
)
ud-suffix
?
referenced by:
primary-expression
expression-statement:
expression
;
expression-statement
::=
expression
';'?
referenced by:
return-list
statement
selection-statement:
if
constexpr
logical-or-expression
compound-statement
else
compound-statement
selection-statement
::= 'if' 'constexpr'?
logical-or-expression
compound-statement
( 'else'
compound-statement
)?
referenced by:
statement
return-statement:
return
expression
;
return-statement
::=
return
expression
? ';'
referenced by:
statement
iteration-statement:
label
while
logical-or-expression
next-clause
compound-statement
do
compound-statement
next-clause
while
logical-or-expression
;
for
expression
next-clause
do
unnamed-declaration
iteration-statement
::=
label
? ( 'while'
logical-or-expression
next-clause
?
compound-statement
| 'do'
compound-statement
next-clause
? 'while'
logical-or-expression
';' | 'for'
expression
next-clause
? 'do'
unnamed-declaration
)
referenced by:
statement
label:
identifier
:
label
::=
identifier
':'
referenced by:
iteration-statement
next-clause:
next
assignment-expression
next-clause
::= 'next'
assignment-expression
referenced by:
iteration-statement
alternative:
alt-name
is-type-constraint
is-value-constraint
as-type-cast
=
statement
alternative
::=
alt-name
? (
is-type-constraint
|
is-value-constraint
|
as-type-cast
) '='
statement
referenced by:
inspect-expression
inspect-expression:
inspect
constexpr
expression
->
type-id
{
alternative
}
inspect-expression
::= 'inspect' 'constexpr'?
expression
( '->'
type-id
)? '{'
alternative
* '}'
referenced by:
primary-expression
statement
jump-statement:
break
continue
identifier
;
jump-statement
::= ( 'break' | 'continue' )
identifier
? ';'
referenced by:
statement
using-statement:
using
namespace
id-expression
;
using-statement
::= 'using' 'namespace'?
id-expression
';'
referenced by:
statement
statement:
selection-statement
using-statement
inspect-expression
return-statement
jump-statement
iteration-statement
compound-statement
contract-statement
declaration
expression-statement
statement
::=
selection-statement
|
using-statement
|
inspect-expression
|
return-statement
|
jump-statement
|
iteration-statement
|
compound-statement
|
contract-statement
|
declaration
|
expression-statement
referenced by:
alternative
compound-statement
unnamed-declaration
contract-statement:
contract
;
contract-statement
::=
contract
';'
referenced by:
statement
compound-statement:
{
statement
}
compound-statement
::= '{'
statement
* '}'
referenced by:
iteration-statement
selection-statement
statement
parameter-declaration:
this-specifier
parameter-direction
declaration
parameter-declaration
::=
this-specifier
?
parameter-direction
?
declaration
referenced by:
parameter-declaration-seq
parameter-direction:
in
copy
inout
out
move
forward
parameter-direction
::= 'in'
| 'copy'
| 'inout'
| 'out'
| 'move'
| 'forward'
referenced by:
expression-list
parameter-declaration
return-list
this-specifier:
implicit
virtual
override
final
this-specifier
::= 'implicit'
| 'virtual'
| 'override'
| 'final'
referenced by:
parameter-declaration
parameter-declaration-list:
(
parameter-declaration-seq
)
parameter-declaration-list
::= '('
parameter-declaration-seq
? ')'
referenced by:
function-type
return-list
parameter-declaration-seq:
parameter-declaration
,
parameter-declaration-seq
::=
parameter-declaration
( ','
parameter-declaration
)*
referenced by:
parameter-declaration-list
template-parameter-declaration-list
contract:
contract-kind
contract-group
:
(
logical-or-expression
,
expression
)
contract
::=
contract-kind
contract-group
? ':' '('
logical-or-expression
( ','
expression
)? ')'
referenced by:
contract-statement
function-type
contract-group:
<
id-expression
,
>
contract-group
::= '<'
id-expression
( ','
id-expression
)* '>'
referenced by:
contract
contract-kind:
pre
post
assert
contract-kind
::= 'pre'
| 'post'
| 'assert'
referenced by:
contract
function-type:
parameter-declaration-list
throws
return-list
contract
function-type
::=
parameter-declaration-list
'throws'?
return-list
?
contract
*
referenced by:
unnamed-declaration
return-list:
expression-statement
->
parameter-direction
type-id
parameter-declaration-list
return-list
::=
expression-statement
| '->' (
parameter-direction
?
type-id
|
parameter-declaration-list
)
referenced by:
function-type
unnamed-declaration:
:
@
id-expression
template-parameter-declaration-list
function-type
requires-clause
=
type-id
final
type
requires-clause
=
statement
type-id
namespace
=
statement
unnamed-declaration
::= ':' ( ( '@'
id-expression
)*
template-parameter-declaration-list
? ( (
function-type
(
requires-clause
? '=' )? | (
type-id
| 'final'? 'type' )?
requires-clause
? '=' )
statement
|
type-id
) | 'namespace' '='
statement
)
referenced by:
declaration
iteration-statement
primary-expression
requires-clause:
requires
logical-or-expression
requires-clause
::= 'requires'
logical-or-expression
referenced by:
alias
unnamed-declaration
template-parameter-declaration-list:
<
parameter-declaration-seq
>
template-parameter-declaration-list
::= '<'
parameter-declaration-seq
'>'
referenced by:
alias
unnamed-declaration
... generated by
RR - Railroad Diagram Generator
R
R