Example #1
0
  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);
    }
  }