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.
True if the term has a separator expressed on it.
True if the term has a separator expressed on it.
Do not confuse with the concept of the delimiter being able to match or not match zero-length data. Whether the representation of a term in the data stream "has a separator", as in a specific separator occupies a non-zero number of bits, is an entirely different question.
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