Some grammar terms (productions specifically) have an indirection to the grammar term that is their definition.
Parser - a Gram can provide a parser, which...
This || operator means one of the operands ONLY.
This || operator means one of the operands ONLY. I.e., statically they are supposed to be mutually exclusive, so only one (or none) of them should ever survive.
Sequential composition operator in the grammar.
Sequential composition operator in the grammar.
Note: This should not evaluate the argument unless it has to.
Prod or Grammar Production
Note the call by name on the GramArg. We don't evaluate the GramArg at all unless the guard is true.
Guards are used so we can have grammars that include all possibilities, but where examining the format properties specifically would indicate that some of those possibilities are precluded. The guard causes that term to just splice itself out of the grammar.
Note that it is crucial that the guardArg is passed by value, and the gramArg is passed by name.
Prod objects are not required. They essentially provide some useful debug capability because a grammar term object will display as it's name, not as some anonymous object.