private BitSet[] CalculateTotalFollowposForRangeNodes(BitSet firstpos, BitSet[] followpos, out BitSet posWithRangeTerminals) { int positionsCount = positions.Count; //terminals posWithRangeTerminals = new BitSet(positionsCount); //Compute followpos for each range node //For any range node that is surrounded by an outer range node, its follow positions will include those of the outer range node BitSet[] minmaxFollowPos = new BitSet[minMaxNodesCount]; int localMinMaxNodesCount = 0; for (int i = positionsCount - 1; i >= 0; i--) { Position p = positions[i]; if (p.symbol == -2) { //P is a LeafRangeNode LeafRangeNode lrNode = p.particle as LeafRangeNode; Debug.Assert(lrNode != null); BitSet tempFollowPos = new BitSet(positionsCount); tempFollowPos.Clear(); tempFollowPos.Or(followpos[i]); //Add the followpos of the range node if (lrNode.Min != lrNode.Max) { //If they are the same, then followpos cannot include the firstpos tempFollowPos.Or(lrNode.NextIteration); //Add the nextIteration of the range node (this is the firstpos of its parent's leftChild) } //For each position in the bitset, if it is a outer range node (pos > i), then add its followpos as well to the current node's followpos for (int pos = tempFollowPos.NextSet(-1); pos != -1; pos = tempFollowPos.NextSet(pos)) { if (pos > i) { Position p1 = positions[pos]; if (p1.symbol == -2) { LeafRangeNode lrNode1 = p1.particle as LeafRangeNode; Debug.Assert(lrNode1 != null); tempFollowPos.Or(minmaxFollowPos[lrNode1.Pos]); } } } //set the followpos built to the index in the BitSet[] minmaxFollowPos[localMinMaxNodesCount] = tempFollowPos; lrNode.Pos = localMinMaxNodesCount++; posWithRangeTerminals.Set(i); } } return minmaxFollowPos; }
private BitSet[] CalculateTotalFollowposForRangeNodes(BitSet firstpos, BitSet[] followpos, out BitSet posWithRangeTerminals) { int count = this.positions.Count; posWithRangeTerminals = new BitSet(count); BitSet[] setArray = new BitSet[this.minMaxNodesCount]; int index = 0; for (int i = count - 1; i >= 0; i--) { Position position = this.positions[i]; if (position.symbol == -2) { LeafRangeNode particle = position.particle as LeafRangeNode; BitSet set = new BitSet(count); set.Clear(); set.Or(followpos[i]); if (particle.Min != particle.Max) { set.Or(particle.NextIteration); } for (int j = set.NextSet(-1); j != -1; j = set.NextSet(j)) { if (j > i) { Position position2 = this.positions[j]; if (position2.symbol == -2) { LeafRangeNode node2 = position2.particle as LeafRangeNode; set.Or(setArray[node2.Pos]); } } } setArray[index] = set; particle.Pos = index++; posWithRangeTerminals.Set(i); } } return setArray; }