Annex A (informative) Grammar summary [gram]

A.4 Expressions [gram.expr]

primary-expression:
	literal
	this
	( expression )
	id-expression
	lambda-expression
	fold-expression
	requires-expression
id-expression:
	unqualified-id
	qualified-id
unqualified-id:
	identifier
	operator-function-id
	conversion-function-id
	literal-operator-id
	~ class-name
	~ decltype-specifier
	template-id
qualified-id:
	nested-name-specifier template unqualified-id
nested-name-specifier:
	::
	type-name ::
	namespace-name ::
	decltype-specifier ::
	nested-name-specifier identifier ::
	nested-name-specifier template simple-template-id ::
lambda-expression:
	lambda-introducer lambda-declarator compound-statement
	lambda-introducer < template-parameter-list > lambda-declarator compound-statement
lambda-introducer:
	[ lambda-capture ]
lambda-declarator:
	( parameter-declaration-clause ) decl-specifier-seq
	noexcept-specifier attribute-specifier-seq trailing-return-type
lambda-capture:
	capture-default
	capture-list
	capture-default , capture-list
capture-default:
	&
	=
capture-list:
	capture ...
	capture-list , capture ...
capture:
	simple-capture
	init-capture
simple-capture:
	identifier
	& identifier
	this
	* this
init-capture:
	identifier initializer
	& identifier initializer
fold-expression:
	( cast-expression fold-operator ... )
	( ... fold-operator cast-expression )
	( cast-expression fold-operator ... fold-operator cast-expression )
fold-operator: one of
	+   -   *   /   %   ^   &   |   <<   >> 
	+=  -=  *=  /=  %=  ^=  &=  |=  <<=  >>=  =
	==  !=  <   >   <=  >=  &&  ||  ,    .*   ->*
requires-expression:
	requires requirement-parameter-list requirement-body
requirement-parameter-list:
	( parameter-declaration-clause )
requirement-body:
	{ requirement-seq }
requirement-seq:
	requirement
	requirement-seq requirement
requirement:
	simple-requirement
	type-requirement
	compound-requirement
	nested-requirement
simple-requirement:
	expression ;
type-requirement:
	typename nested-name-specifier type-name ;
compound-requirement:
	{ expression } noexcept return-type-requirement ;
return-type-requirement:
	trailing-return-type
	-> cv-qualifier-seq constrained-parameter cv-qualifier-seq abstract-declarator
nested-requirement:
	requires constraint-expression ;
postfix-expression:
	primary-expression
	postfix-expression [ expr-or-braced-init-list ]
	postfix-expression ( expression-list )
	simple-type-specifier ( expression-list )
	typename-specifier ( expression-list )
	simple-type-specifier braced-init-list
	typename-specifier braced-init-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 )
expression-list:
	initializer-list
pseudo-destructor-name:
	nested-name-specifier type-name ::~ type-name
	nested-name-specifier template simple-template-id ::~ type-name
	~ type-name
	~ decltype-specifier
unary-expression:
	postfix-expression
	++ cast-expression
	-- cast-expression
	unary-operator cast-expression
	sizeof unary-expression
	sizeof ( type-id )
	sizeof ... ( identifier )
	alignof ( type-id )
	noexcept-expression
	new-expression
	delete-expression
unary-operator: one of
	*  &  +  -  !  ~
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-declarator
new-declarator:
	ptr-operator new-declarator 
	noptr-new-declarator
noptr-new-declarator:
	[ expression ] attribute-specifier-seq
	noptr-new-declarator [ constant-expression ] attribute-specifier-seq
new-initializer:
	( expression-list )
	braced-init-list
delete-expression:
	:: delete cast-expression
	:: delete [ ] cast-expression
noexcept-expression:
	noexcept ( 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
throw-expression:
	throw  assignment-expression
assignment-expression:
	conditional-expression
	logical-or-expression assignment-operator initializer-clause
	throw-expression
assignment-operator: one of
	=  *=  /=  %=   +=  -=  >>=  <<=  &=  ^=  |=
expression:
	assignment-expression
	expression , assignment-expression
constant-expression:
	conditional-expression