This is a brief idea for a style of BNF syntax that I have found to be very efficient and easy to understand in a few contexts.
There are just two sorts of expression built from simpler expressions:
Where one might conventionally write:
Z ::= X | Z Y XOne writes Z ::= {X/Y}. The main advantage is that the syntactic category need not be named.
The {X|Y} notation is conventional BNF.
These two meta constructs efficiently supplant several conventional BNF extensions.
The conventional [X] may be rendered {X|}.
A sequence of statements terminated by semicolons can be rendered: {<statement> ";"/}.
A C function invocation can be rendered: <fun> "(" { {<exp> / ","} |} ")" .
A sequence of zero or more zots may be rendered {/<zot>}.