예제 #1
0
        // -------------------------------------------------------------------------
        //
        // cloneTree Make a copy of the subtree rooted at this node.
        // Discard any variable references encountered along the way,
        // and replace with copies of the variable's definitions.
        // Used to replicate the expression underneath variable
        // references in preparation for generating the DFA tables.
        //
        // -------------------------------------------------------------------------
        internal RBBINode CloneTree()
        {
            RBBINode n;

            if (fType == RBBINode.varRef)
            {
                // If the current node is a variable reference, skip over it
                // and clone the definition of the variable instead.
                n = fLeftChild.CloneTree();
            }
            else if (fType == RBBINode.uset)
            {
                n = this;
            }
            else
            {
                n = new RBBINode(this);
                if (fLeftChild != null)
                {
                    n.fLeftChild         = fLeftChild.CloneTree();
                    n.fLeftChild.fParent = n;
                }
                if (fRightChild != null)
                {
                    n.fRightChild         = fRightChild.CloneTree();
                    n.fRightChild.fParent = n;
                }
            }
            return(n);
        }
예제 #2
0
        // -------------------------------------------------------------------------
        //
        // flattenSets Walk the parse tree, replacing any nodes of type setRef
        // with a copy of the expression tree for the set. A set's
        // equivalent expression tree is precomputed and saved as
        // the left child of the uset node.
        //
        // -------------------------------------------------------------------------
        internal void FlattenSets()
        {
            IBM.ICU.Impl.Assert.Assrt(fType != setRef);

            if (fLeftChild != null)
            {
                if (fLeftChild.fType == setRef)
                {
                    RBBINode setRefNode = fLeftChild;
                    RBBINode usetNode   = setRefNode.fLeftChild;
                    RBBINode replTree   = usetNode.fLeftChild;
                    fLeftChild         = replTree.CloneTree();
                    fLeftChild.fParent = this;
                }
                else
                {
                    fLeftChild.FlattenSets();
                }
            }

            if (fRightChild != null)
            {
                if (fRightChild.fType == setRef)
                {
                    RBBINode setRefNode_0 = fRightChild;
                    RBBINode usetNode_1   = setRefNode_0.fLeftChild;
                    RBBINode replTree_2   = usetNode_1.fLeftChild;
                    fRightChild         = replTree_2.CloneTree();
                    fRightChild.fParent = this;
                    // delete setRefNode;
                }
                else
                {
                    fRightChild.FlattenSets();
                }
            }
        }