Concept Grammar
concept
→
specifiers
concept
identifier
<
(
identifier
%
,
)
>
refinement
?
where‑constraint
?
{
concept‑body
}
refinement
→
:
qualified‑id
<
(
identifier
%
,
)
>
concept‑body
→
(
concept‑body‑constraint
|
axiom
)
*
concept‑body‑constraint
→
type‑name‑constraint
|
signature‑constraint
|
embedded‑constraint
type‑name‑constraint
→
typename
type‑expr
;
signature‑constraint
→
constructor‑constraint
|
destructor‑constraint
|
member‑function‑constraint
|
function‑constraint
constructor‑constraint
→
explicit
?
identifier
parameter‑list
;
destructor‑constraint
→
~
identifier
(
)
;
member‑function‑constraint
→
type‑expr
identifier
.
function‑group‑id
parameter‑list
;
function‑constraint
→
type‑expr
function‑group‑id
parameter‑list
;
embedded‑constraint
→
where‑constraint
;
where‑constraint
→
where
constraint‑expr
constraint‑expr
→
disjunctive‑constraint‑expr
disjunctive‑constraint‑expr
→
conjunctive‑constraint‑expr
(
or
conjunctive‑constraint‑expr
)
*
conjunctive‑constraint‑expr
→
primary‑constraint‑expr
(
and
primary‑constraint‑expr
)
*
primary‑constraint‑expr
→
(
constraint‑expr
)
|
atomic‑constraint‑expr
atomic‑constraint‑expr
→
predicate‑constraint‑expr
|
is‑constraint
|
multiparam‑constraint
predicate‑constraint‑expr
→
invoke‑expr
is‑constraint
→
type‑expr
is
concept‑or‑type‑name
concept‑or‑type‑name
→
type‑expr
multiparam‑constraint
→
qualified‑id
<
(
type‑expr
%
,
)
>
axiom
→
axiom
identifier
?
parameter‑list
?
{
axiom‑body
}
axiom‑body
→
axiom‑statement
*
axiom‑statement
→
expression
;