code: void calcNullable(RBBINode n) {
             if (n == null) {
                 return;
             }
             if (n.fType == RBBINode.setRef ||
                 n.fType == RBBINode.endMark ) {
                 // These are non-empty leaf node types.
                 n.fNullable = false;
                 return;
             }
  
             if (n.fType == RBBINode.lookAhead || n.fType == RBBINode.tag) {
                 // Lookahead marker node.  It's a leaf, so no recursion on children.
                 // It's nullable because it does not match any literal text from the input stream.
                 n.fNullable = true;
                 return;
             }
  
  
             // The node is not a leaf.
             //  Calculate nullable on its children.
             calcNullable(n.fLeftChild);
             calcNullable(n.fRightChild);
  
             // Apply functions from table 3.40 in Aho
             if (n.fType == RBBINode.opOr) {
                 n.fNullable = n.fLeftChild.fNullable || n.fRightChild.fNullable;
             }
             else if (n.fType == RBBINode.opCat) {
                 n.fNullable = n.fLeftChild.fNullable && n.fRightChild.fNullable;
             }
             else if (n.fType == RBBINode.opStar || n.fType == RBBINode.opQuestion) {
                 n.fNullable = true;
             }
             else {
                 n.fNullable = false;
             }
         }
docs: -----------------------------------------------------------------------------