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 ;