public void Merge() { Queue<SemiTagNode> openlist = new LinkedList<SemiTagNode>(); for (SemiTagNode n : allnodes) { if (n.IsLowerIncomplete()) { openlist.add(n); } } while (!openlist.isEmpty()) { SemiTagNode head = openlist.poll(); // merge to successors for (SemiTagEdge oe : head.outegdes) { SemiTagNode t = oe.target; // if(t.IsComplete() || t.IsLowerIncomplete()) // throw new Error("the tag is // illegal"+head.Value.getFiniteStrings()+"+++"+t.Value.getFiniteStrings()); SemiTagNode nn = new SemiTagNode(); nn.sigs.addAll(head.sigs); nn.sigs.addAll(t.sigs); nn.Value = head.Value.concatenate(t.Value); nn.setStatus(); // set the relationship to predecessors; for (SemiTagEdge ie : head.inegdes) { SemiTagEdge nie = new SemiTagEdge(ie.source, nn, ie.methodsig); ie.source.outegdes.remove(ie); ie.source.outegdes.add(nie); nn.inegdes.add(nie); nn.inegdes.remove(ie); } // set the relationship to successors; for (SemiTagEdge toe : t.outegdes) { SemiTagEdge noe = new SemiTagEdge(nn, toe.target, toe.methodsig); toe.target.inegdes.remove(toe); toe.target.inegdes.add(noe); nn.outegdes.add(noe); nn.outegdes.remove(toe); } allnodes.add(nn); if (heads.contains(head)) heads.add(nn); if (tails.contains(t)) tails.add(nn); if (!nn.IsComplete()) openlist.add(nn); allnodes.remove(t); heads.remove(t); tails.remove(t); // if(!nn.IsComplete()) // openlist.add(nn); } allnodes.remove(head); heads.remove(head); tails.remove(head); } }