code: void calcFirstPos(RBBINode n) {
             if (n == null) {
                 return;
             }
             if (n.fType == RBBINode.leafChar  ||
                 n.fType == RBBINode.endMark   ||
                 n.fType == RBBINode.lookAhead ||
                 n.fType == RBBINode.tag) {
                 // These are non-empty leaf node types.
                 n.fFirstPosSet.add(n);
                 return;
             }
  
             // The node is not a leaf.
             //  Calculate firstPos on its children.
             calcFirstPos(n.fLeftChild);
             calcFirstPos(n.fRightChild);
  
             // Apply functions from table 3.40 in Aho
             if (n.fType == RBBINode.opOr) {
                 n.fFirstPosSet.addAll(n.fLeftChild.fFirstPosSet);
                 n.fFirstPosSet.addAll(n.fRightChild.fFirstPosSet);
             }
             else if (n.fType == RBBINode.opCat) {
                 n.fFirstPosSet.addAll(n.fLeftChild.fFirstPosSet);
                 if (n.fLeftChild.fNullable) {
                     n.fFirstPosSet.addAll(n.fRightChild.fFirstPosSet);
                 }
             }
             else if (n.fType == RBBINode.opStar ||
                      n.fType == RBBINode.opQuestion ||
                      n.fType == RBBINode.opPlus) {
                 n.fFirstPosSet.addAll(n.fLeftChild.fFirstPosSet);
             }
         }
docs: -----------------------------------------------------------------------------