For unit testing, we want to create GrammarMixin objects that are not schema components.
For unit testing, we want to create GrammarMixin objects that are not schema components. So we can't use a self-type here. Instead we define this abstract grammarContext.
These are static properties even though the delimiters can have runtime-computed values.
These are static properties even though the delimiters can have runtime-computed values. The existence of an expression to compute a delimiter is assumed to imply a non-zero-length, aka a real delimiter.
Use when production has no guard, but you want to name the production anyway (for debug visibility perhaps).
Use when production has no guard, but you want to name the production anyway (for debug visibility perhaps).
Use when production has a guard predicate
Use when production has a guard predicate