Expression Grammar

expression → equivalence
equivalence → implication (<=> implication)*
implication → disjunction (=> implication)?
disjunction → conjunction (|| conjunction)*
conjunction → bit‑or (&& bit‑or)*
bit‑or → bit‑xor (| bit‑xor)*
bit‑xor → bit‑and (^ bit‑and)*
bit‑and → equality (& equality)*
equality → relational ((== | !=) relational)*
relational → shift ((<= | >= | < | > | is type‑expr | as type‑expr) shift | <empty>)*
shift → additive ((<< | >>) additive)*
additive → multiplicative ((+ | -) multiplicative)*
multiplicative → prefix ((* | / | %) prefix)*
prefix → (++ | -- | + | - | ! | ~ | * | &) prefix | postfix
postfix → primary (++ | -- | . identifier | -> identifier | [ expression ] | ( argument‑list ))*
primary → ( expression ) | literal | basic‑type | template‑id | identifier | this | base | size‑of‑expr | type‑name‑expr | type‑id‑expr | cast‑expr | construct‑expr | new‑expr
size‑of‑expr → sizeof ( expression )
type‑name‑expr → typename ( expression )
type‑id‑expr → typeid ( expression )
cast‑expr → cast < type‑expr > ( expression )
construct‑expr → construct < type‑expr > ( expression‑list )
new‑expr → new type‑expr (( argument‑list ))?
argument‑list → expression‑list?
expression‑list → expression % ,
invoke‑expr → (template‑id | identifier) (. identifier)* ( argument‑list )