I'd suggest we follow the model of `zeroOrMore` and `oneOrMore` and have two completely separate blocks for `opIsRule1 == true` and `opIsRule1 == false`. This way we can each case as optimized as possible. For example, you are currently allocating a `VectorBuilder` even if it is not used in the result because `opIsRule1 == false`.