Package org.maltparserx.core.syntaxgraph.node

Source Code of org.maltparserx.core.syntaxgraph.node.Token

package org.maltparserx.core.syntaxgraph.node;

import java.util.NoSuchElementException;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import org.maltparserx.core.exception.MaltChainedException;
import org.maltparserx.core.helper.SystemLogger;
import org.maltparserx.core.symbol.SymbolTable;
import org.maltparserx.core.syntaxgraph.LabelSet;
import org.maltparserx.core.syntaxgraph.SyntaxGraphException;
import org.maltparserx.core.syntaxgraph.edge.Edge;


public class Token extends GraphNode implements TokenNode, DependencyNode, PhraseStructureNode {
  /**
   * the previous terminal node in the linear precedence
   */
  protected TokenNode predecessor = null;
  /**
   * the next terminal node in the linear precedence
   */
  protected TokenNode successor = null;

  /**
   * a reference to a node where the node is part of a component. If the node is unconnected it will reference to it self.
   */
  protected DependencyNode component;
  protected int rank;
 
  protected int index;
 
  protected PhraseStructureNode parent;
  protected final SortedSet<DependencyNode> heads;
  protected final SortedSet<DependencyNode> leftDependents;
  protected final SortedSet<DependencyNode> rightDependents;
 
 
  public Token() throws MaltChainedException {
    parent = null;
    heads = new TreeSet<DependencyNode>();
    leftDependents = new TreeSet<DependencyNode>();
    rightDependents = new TreeSet<DependencyNode>();
    clear();
  }
 
  /**
   * Sets the predecessor terminal node in the linear order of the terminal nodes.
   *
   * @param predecessor the predecessor terminal node
   */
  public void setPredecessor(TokenNode predecessor) {
    this.predecessor = predecessor;
  }
 
  /**
   * Sets the predecessor terminal node in the linear order of the terminal nodes.
   *
   * @param successor the successor terminal node
   */
  public void setSuccessor(TokenNode successor) {
    this.successor = successor;
  }
 
  /**
   * Returns the predecessor terminal node in the linear order of the terminal nodes.
   *
   * @return the predecessor terminal node in the linear order of the terminal nodes.
   */
  public TokenNode getPredecessor() {
    return predecessor;
  }

  /**
   * Returns the successor terminal node in the linear order of the terminal nodes.
   *
   * @return the successor terminal node in the linear order of the terminal nodes.
   */
  public TokenNode getSuccessor() {
    return successor;
  }
 
  public int getRank() {
    return rank;
  }
 
  public void setRank(int r) {
    this.rank = r;
  }
 
  public DependencyNode findComponent() {
    return findComponent(this);
  }
 
  private DependencyNode findComponent(DependencyNode x) { 
    if (x != x.getComponent()) {
      x.setComponent(findComponent(x.getComponent()));
    }
    return x.getComponent();
  }
 
  public DependencyNode getComponent() {
    return component;
  }
 
  public void setComponent(DependencyNode x) {
    this.component = x;
  }
 
  public void addIncomingEdge(Edge in) throws MaltChainedException {
    super.addIncomingEdge(in);
    if (in.getSource() != null) {
      if (in.getType() == Edge.DEPENDENCY_EDGE && in.getSource() instanceof DependencyNode) {
        heads.add((DependencyNode)in.getSource());
      } else if (in.getType() == Edge.PHRASE_STRUCTURE_EDGE && in.getSource() instanceof PhraseStructureNode) {
        parent = (PhraseStructureNode)in.getSource();
      }
    }
  }
 
  public void removeIncomingEdge(Edge in) throws MaltChainedException {
    super.removeIncomingEdge(in);
    if (in.getSource() != null) {
      if (in.getType() == Edge.DEPENDENCY_EDGE && in.getSource() instanceof DependencyNode) {
        heads.remove((DependencyNode)in.getSource());
      } else if (in.getType() == Edge.PHRASE_STRUCTURE_EDGE && in.getSource() instanceof PhraseStructureNode) {
        if (in.getSource() == parent) {
          this.parent = null;
        }
      }
    }
  }
 
  public void addOutgoingEdge(Edge out) throws MaltChainedException {
    super.addOutgoingEdge(out);
    if (out.getType() == Edge.DEPENDENCY_EDGE && out.getTarget() instanceof DependencyNode) { 
      final DependencyNode dependent = (DependencyNode)out.getTarget();
      if (compareTo(dependent) > 0) {
        leftDependents.add((DependencyNode)dependent);
      } else if (compareTo(dependent) < 0) {
        rightDependents.add((DependencyNode)dependent);
      }
    }
  }
 
  public void removeOutgoingEdge(Edge out) throws MaltChainedException {
    super.removeOutgoingEdge(out);
    if (out.getType() == Edge.DEPENDENCY_EDGE && out.getTarget() instanceof DependencyNode) {
      final DependencyNode dependent = (DependencyNode)out.getTarget();
      if (compareTo(dependent) > 0) {
        leftDependents.remove((DependencyNode)dependent);
      } else if (compareTo(dependent) < 0) {
        rightDependents.remove((DependencyNode)dependent);
      }
    }
  }
 
  public void setIndex(int index) throws MaltChainedException {
    if (index > 0) {
      this.index = index;
    } else {
      throw new SyntaxGraphException("A terminal node must have a positive integer value and not index "+index+". ");
    }
  }
 
  public int getIndex() {
    return index;
  }
 
  public int getCompareToIndex() {
    return index;
  }
 
  public boolean isRoot() {
    return false;
  }
 
  public DependencyNode getAncestor() throws MaltChainedException {
    if (!this.hasHead()) {
      return this;
    }
   
    DependencyNode tmp = this;
    while (tmp.hasHead()) {
      tmp = tmp.getHead();
    }
    return tmp;
  }
 
  public DependencyNode getProperAncestor() throws MaltChainedException {
    if (!this.hasHead()) {
      return null;
    }
   
    DependencyNode tmp = this;
    while (tmp.hasHead()) {
      tmp = tmp.getHead();
    }
    return tmp;
  }
 
  public ComparableNode getLeftmostProperDescendant() throws MaltChainedException {
    ComparableNode candidate = null;
    ComparableNode tmp = null;
    for (DependencyNode ldep : leftDependents) {
      if (candidate == null) {
        candidate = ldep;
      } else if (ldep.getIndex() < candidate.getIndex() ) {
        candidate = ldep;
      }
      tmp = ((Token)ldep).getLeftmostProperDescendant();
      if (tmp == null) {
        continue;
      }
      if (candidate == null) {
        candidate = tmp;
      } else if (tmp.getIndex() < candidate.getIndex() ) {
        candidate = tmp;
      }
      if (candidate.getIndex() == 1) {
        return candidate;
      }
    }
    for (DependencyNode rdep : rightDependents) {
      if (candidate == null) {
        candidate = rdep;
      } else if (rdep.getIndex() < candidate.getIndex() ) {
        candidate = rdep;
      }
      tmp = ((Token)rdep).getLeftmostProperDescendant();
      if (tmp == null) {
        continue;
      }
      if (candidate == null) {
        candidate = tmp;
      } else if (tmp.getIndex() < candidate.getIndex() ) {
        candidate = tmp;
      }
      if (candidate.getIndex() == 1) {
        return candidate;
      }
    }
    return candidate;
  }
 
  public ComparableNode getRightmostProperDescendant() throws MaltChainedException {
    ComparableNode candidate = null;
    ComparableNode tmp = null;
    for (DependencyNode ldep : leftDependents) {
      if (candidate == null) {
        candidate = ldep;
      } else if (ldep.getIndex() > candidate.getIndex() ) {
        candidate = ldep;
      }
      tmp = ((Token)ldep).getRightmostProperDescendant();
      if (tmp == null) {
        continue;
      }
      if (candidate == null) {
        candidate = tmp;
      } else if (tmp.getIndex() > candidate.getIndex() ) {
        candidate = tmp;
      }
    }
    for (DependencyNode rdep : rightDependents) {
      if (candidate == null) {
        candidate = rdep;
      } else if (rdep.getIndex() > candidate.getIndex() ) {
        candidate = rdep;
      }
      tmp = ((Token)rdep).getRightmostProperDescendant();
      if (tmp == null) {
        continue;
      }
      if (candidate == null) {
        candidate = tmp;
      } else if (tmp.getIndex() > candidate.getIndex() ) {
        candidate = tmp;
      }
    }
    return candidate;
  }
 
  public ComparableNode getLeftmostDescendant() throws MaltChainedException {
    ComparableNode candidate = this;
    ComparableNode tmp = null;
    for (DependencyNode ldep : leftDependents) {
      if (candidate == null) {
        candidate = ldep;
      } else if (ldep.getIndex() < candidate.getIndex() ) {
        candidate = ldep;
      }
      tmp = ((Token)ldep).getLeftmostDescendant();
      if (tmp == null) {
        continue;
      }
      if (candidate == null) {
        candidate = tmp;
      } else if (tmp.getIndex() < candidate.getIndex() ) {
        candidate = tmp;
      }
      if (candidate.getIndex() == 1) {
        return candidate;
      }
    }
    for (DependencyNode rdep : rightDependents) {
      if (candidate == null) {
        candidate = rdep;
      } else if (rdep.getIndex() < candidate.getIndex() ) {
        candidate = rdep;
      }
      tmp = ((Token)rdep).getLeftmostDescendant();
      if (tmp == null) {
        continue;
      }
      if (candidate == null) {
        candidate = tmp;
      } else if (tmp.getIndex() < candidate.getIndex() ) {
        candidate = tmp;
      }
      if (candidate.getIndex() == 1) {
        return candidate;
      }
    }
    return candidate;
  }
 
  public ComparableNode getRightmostDescendant() throws MaltChainedException {
    ComparableNode candidate = this;
    ComparableNode tmp = null;
    for (DependencyNode ldep : leftDependents) {
      if (candidate == null) {
        candidate = ldep;
      } else if (ldep.getIndex() > candidate.getIndex() ) {
        candidate = ldep;
      }
      tmp = ((Token)ldep).getRightmostDescendant();
      if (tmp == null) {
        continue;
      }
      if (candidate == null) {
        candidate = tmp;
      } else if (tmp.getIndex() > candidate.getIndex() ) {
        candidate = tmp;
      }
    }
    for (DependencyNode rdep : rightDependents) {
      if (candidate == null) {
        candidate = rdep;
      } else if (rdep.getIndex() > candidate.getIndex() ) {
        candidate = rdep;
      }
      tmp = ((Token)rdep).getRightmostDescendant();
      if (tmp == null) {
        continue;
      }
      if (candidate == null) {
        candidate = tmp;
      } else if (tmp.getIndex() > candidate.getIndex() ) {
        candidate = tmp;
      }
    }
    return candidate;
  }
 
  public PhraseStructureNode getParent() {
    return parent;
  }

  public Edge getParentEdge() throws MaltChainedException {
    for (Edge e : incomingEdges) {
      if (e.getSource() == parent && e.getType() == Edge.PHRASE_STRUCTURE_EDGE) {
        return e;
      }
    }
    return null;
  }
 
  public String getParentEdgeLabelSymbol(SymbolTable table) throws MaltChainedException {
    for (Edge e : incomingEdges) {
      if (e.getSource() == parent && e.getType() == Edge.PHRASE_STRUCTURE_EDGE) {
        return e.getLabelSymbol(table);
      }
    }
    return null;
  }

  public int getParentEdgeLabelCode(SymbolTable table) throws MaltChainedException {
    for (Edge e : incomingEdges) {
      if (e.getSource() == parent && e.getType() == Edge.PHRASE_STRUCTURE_EDGE) {
        return e.getLabelCode(table);
      }
    }
    return -1;
  }
 
  public boolean hasParentEdgeLabel(SymbolTable table) throws MaltChainedException {
    for (Edge e : incomingEdges) {
      if (e.getSource() == parent && e.getType() == Edge.PHRASE_STRUCTURE_EDGE) {
        return e.hasLabel(table);
      }
    }
    return false;
  }
 
  public boolean hasAtMostOneHead() {
    return heads.size() <= 1;
  }
 
  public boolean hasAncestorInside(int left, int right) throws MaltChainedException {
    DependencyNode tmp = this;
    if (tmp.getHead() != null) {
      tmp = tmp.getHead();
      if (tmp.getIndex() >= left && tmp.getIndex() <= right) {
        return true;
      }
    }
    return false;
  }
 
  public Set<Edge> getHeadEdges() throws MaltChainedException {
    return incomingEdges;
  }

  public Set<DependencyNode> getHeads() throws MaltChainedException {
    return heads;
  }

  public boolean hasHead() {
    return heads.size() != 0;
  }
 
  public DependencyNode getHead() throws MaltChainedException {
    if (heads.size() == 0) {
      return null;
    }
    if (heads.size() == 1) {
      for (DependencyNode head : heads) {
        return head;
      }
    }

    if (heads.size() > 1) {
      throw new SyntaxGraphException("The dependency node is multi-headed and it is ambigious to return a single-head dependency node. ");
    }
    // heads.first();

    return null;
  }
 
  public Edge getHeadEdge() throws MaltChainedException {
    if (heads.size() == 0) {
      return null;
    }
    if (incomingEdges.size() == 1 && incomingEdges.first() instanceof DependencyNode) {
      return incomingEdges.first();
    }
    if (heads.size() == 1) {
      for (Edge e : incomingEdges) {
        if (e.getSource() == heads.first()) {
          return e;
        }
      }
    }
    return null;
  }
 
  public void addHeadEdgeLabel(SymbolTable table, String symbol) throws MaltChainedException {
    if (hasHead()) {
      getHeadEdge().addLabel(table, symbol);
    }
  }
 
  public void addHeadEdgeLabel(SymbolTable table, int code) throws MaltChainedException {
    if (hasHead()) {
      getHeadEdge().addLabel(table, code);
    }
  }
 
  public void addHeadEdgeLabel(LabelSet labelSet) throws MaltChainedException {
    if (hasHead()) {
      getHeadEdge().addLabel(labelSet);
    }
  }
 
  public boolean hasHeadEdgeLabel(SymbolTable table) throws MaltChainedException {
    if (!hasHead()) {
      return false;
    }
    return getHeadEdge().hasLabel(table);
  }
 
  public String getHeadEdgeLabelSymbol(SymbolTable table) throws MaltChainedException {
    return getHeadEdge().getLabelSymbol(table);
  }
 
  public int getHeadEdgeLabelCode(SymbolTable table) throws MaltChainedException {
    if (!hasHead()) {
      return 0;
    }
    return getHeadEdge().getLabelCode(table);
  }
 
  public boolean isHeadEdgeLabeled() throws MaltChainedException {
    if (!hasHead()) {
      return false;
    }
    return getHeadEdge().isLabeled();
  }
 
  public int nHeadEdgeLabels() throws MaltChainedException {
    if (!hasHead()) {
      return 0;
    }
    return getHeadEdge().nLabels();
  }
 
  public Set<SymbolTable> getHeadEdgeLabelTypes() throws MaltChainedException {
    return getHeadEdge().getLabelTypes();
  }
 
  public LabelSet getHeadEdgeLabelSet() throws MaltChainedException {
    return getHeadEdge().getLabelSet();
  }
 
  public boolean hasDependent() {
    return hasLeftDependent() || hasRightDependent();
  }
 
  /**
   * Returns <code>true</code> if the node has one or more left dependents, otherwise <code>false</code>.
   *
   * @return <code>true</code> if the node has one or more left dependents, otherwise <code>false</code>.
   */
  public boolean hasLeftDependent() {
    return !leftDependents.isEmpty();
  }
 
  /**
   * Returns the left dependent at the position <code>index</code>, where <code>index==0</code> equals the left most dependent.
   *
   * @param index the index
   * @return the left dependent at the position <code>index</code>, where <code>index==0</code> equals the left most dependent
   */
  public DependencyNode getLeftDependent(int index) {
    if (0 <= index && index < leftDependents.size()) {
      int i = 0;
//      DependencyNode candidate = null;
     
      for (DependencyNode node : leftDependents) {
//        candidate = node;
        if (i == index) {
          return node;
        }
        i++;
      }
    }
    return null;
  }
 
  /**
   * Return the number of left dependents
   *
   * @return the number of left dependents
   */
  public int getLeftDependentCount() {
    return leftDependents.size();
  }
 
  public SortedSet<DependencyNode> getLeftDependents() {
    return leftDependents;
  }
 
  /**
   * Returns the left sibling if it exists, otherwise <code>null</code>
   *
   * @return the left sibling if it exists, otherwise <code>null</code>
   */
  public DependencyNode getLeftSibling() throws MaltChainedException {
    if (getHead() == null) {
      return null;
    }

    DependencyNode candidate = null;
    for (DependencyNode node : getHead().getLeftDependents()) {
      if (node == this) {
        return candidate;
      }
      candidate = node;
    }
    for (DependencyNode node : getHead().getRightDependents()) {
      if (node == this) {
        return candidate;
      }
      candidate = node;
    }
    return null;
  }
 
  /**
   * Returns the left sibling at the same side of head as the node it self. If not found <code>null</code is returned
   *
   * @return the left sibling at the same side of head as the node it self. If not found <code>null</code is returned
   */
  public DependencyNode getSameSideLeftSibling() throws MaltChainedException {
    if (getHead() == null) {
      return null;
    } else if (this.getIndex() < getHead().getIndex()) {
      try {
        return getHead().getLeftDependents().headSet(this).last();
      } catch (NoSuchElementException e) {
        return null;
      }
    } else if (this.getIndex() > getHead().getIndex()) {
      try {
        return getHead().getRightDependents().headSet(this).last();
      } catch (NoSuchElementException e) {
        return null;
      }
    }
    return null;
  }
 
  /**
   * Returns the closest left dependent to the node it self, if not found <code>null</code> is returned.
   *
   * @return the closest left dependent to the node it self, if not found <code>null</code> is returned.
   */
  public DependencyNode getClosestLeftDependent() {
    try {
      return leftDependents.last();
    } catch (NoSuchElementException e) {
      return null;
    }
  }
 
  public DependencyNode getLeftmostDependent() {
    for (DependencyNode dep : leftDependents) {
      return dep;
    }
    return null;
//    try {
//      return leftDependents.first();
//    } catch (NoSuchElementException e) {
//      return null;
//    }
  }
 
  public DependencyNode getRightDependent(int index) {
    int size = rightDependents.size();
    if (index < size) {
      return rightDependents.toArray(new DependencyNode[size])[size - 1 - index];
    }
    return null;
//    if (0 <= index && index < rightDependents.size()) {
//      int i = 0;
//      DependencyNode candidate = null;
//     
//      for (DependencyNode node : rightDependents) {
//        candidate = node;
//        if (i == index) {
//          return candidate;
//        }
//        i++;
//      }
//    }
//    return null;
  }
 
  /**
   * Return the number of right dependents
   *
   * @return the number of right dependents
   */
  public int getRightDependentCount() {
    return rightDependents.size();
  }
 
  /**
   * Returns a sorted set of right dependents.
   *
   * @return a sorted set of right dependents.
   */
  public SortedSet<DependencyNode> getRightDependents() {
    return rightDependents;
  }
 
  /**
   * Returns the right sibling if it exists, otherwise <code>null</code>
   *
   * @return the right sibling if it exists, otherwise <code>null</code>
   */
  public DependencyNode getRightSibling() throws MaltChainedException {
    if (getHead() == null) {
      return null;
    }

    for (DependencyNode node : getHead().getLeftDependents()) {
      if (node.getIndex() > this.getIndex()) {
        return node;
      }
    }
    for (DependencyNode node : getHead().getRightDependents()) {
      if (node.getIndex() > this.getIndex()) {
        return node;
      }
    }
    return null;
  }
 
  /**
   * Returns the right sibling at the same side of head as the node it self. If not found <code>null</code is returned
   *
   * @return the right sibling at the same side of head as the node it self. If not found <code>null</code is returned
   */
  public DependencyNode getSameSideRightSibling() throws MaltChainedException {
    if (getHead() == null) {
      return null;
    } else if (this.getIndex() < getHead().getIndex()) {
      final SortedSet<DependencyNode> tailSet = getHead().getLeftDependents().tailSet(this);
      if (tailSet.size() <= 1)  {
        return null;
      }
      return tailSet.toArray(new DependencyNode[tailSet.size()])[1];
    } else if (this.getIndex() > getHead().getIndex()) {
      final SortedSet<DependencyNode> tailSet = getHead().getRightDependents().tailSet(this);
      if (tailSet.size() <= 1)  {
        return null;
      }
      return tailSet.toArray(new DependencyNode[tailSet.size()])[1];
    }
    return null;
  }
 
  /**
   * Returns the closest right dependent to the node it self, if not found <code>null</code> is returned.
   *
   * @return the closest right dependent to the node it self, if not found <code>null</code> is returned.
   */
  public DependencyNode getClosestRightDependent() {
    for (DependencyNode dep : rightDependents) {
      return dep;
    }
    return null;
//    try {
//      return rightDependents.first();
//    } catch (NoSuchElementException e) {
//      return null;
//    }
  }
 
  public DependencyNode getRightmostDependent() {
    int n = rightDependents.size();
    int i = 1;
    for (DependencyNode node : rightDependents) {
      if (i == n) {
        return node;
      }
      i++;
    }
    return null;
//    try {
//      return rightDependents.last();
//    } catch (NoSuchElementException e) {
//      return null;
//    }
  }
 
  protected void getDependencyDominationSet(SortedSet<DependencyNode> dominationSet) {
    if (leftDependents.size() > 0 || rightDependents.size() > 0) {
      dominationSet.addAll(leftDependents);
      dominationSet.addAll(rightDependents);
     
      for (DependencyNode node : leftDependents) {
        ((Token)node).getDependencyDominationSet(dominationSet);
      }
      for (DependencyNode node : rightDependents) {
        ((Token)node).getDependencyDominationSet(dominationSet);
      }
    }
  }
 
//  private SortedSet<DependencyNode> getDependencyDominationSet() {
//    SortedSet<DependencyNode> dominationSet = new TreeSet<DependencyNode>();
//    getDependencyDominationSet(dominationSet);
//    return dominationSet;
//  }
 
 
  /**
   * Returns <code>true</code> if the node has one or more right dependents, otherwise <code>false</code>.
   *
   * @return <code>true</code> if the node has one or more right dependents, otherwise <code>false</code>.
   */
  public boolean hasRightDependent() {
    return !rightDependents.isEmpty();
  }

  public boolean isProjective() throws MaltChainedException {
    if (hasHead() && !getHead().isRoot()) {
      final DependencyNode head = getHead();
      if (getHead().getIndex() < this.getIndex()) {
        TokenNode terminals = ((TokenNode)head);
        DependencyNode tmp = null;
        while (true) {
          if (terminals == null || terminals.getSuccessor() == null) {
            return false;
          }
          if (terminals.getSuccessor() == this) {
            break;
          }
          tmp = terminals = terminals.getSuccessor();
          while (tmp != this && tmp != head) {
            if (!tmp.hasHead()) {
              return false;
            }
            tmp = tmp.getHead();
          }
        }
      } else {
        TokenNode terminals = ((TokenNode)this);
        DependencyNode tmp = null;
        while (true) {
          if (terminals == null || terminals.getSuccessor() == null) {
            return false;
          }
          if (terminals.getSuccessor() == head) {
            break;
          }
          tmp = terminals = terminals.getSuccessor();
          while (tmp != this && tmp != head) {
            if (!tmp.hasHead()) {
              return false;
            }
            tmp = tmp.getHead();
          }
        }
      }
    }
    return true;
  }

  public int getDependencyNodeDepth() throws MaltChainedException {
    DependencyNode tmp = this;
    int depth = 0;
    while (tmp.hasHead()) {
      depth++;
      tmp = tmp.getHead();
    }
    return depth;
  }
 
  public void clear() throws MaltChainedException {
    super.clear();
    predecessor = null;
    successor = null;
    component = this;
    rank = 0;
    parent = null;
    heads.clear();
    leftDependents.clear();
    rightDependents.clear();
  }
 
  @Override
  public int compareTo(ComparableNode that) {
    final int BEFORE = -1;
      final int EQUAL = 0;
      final int AFTER = 1;
      if (this == that) return EQUAL;

      if (that instanceof TokenNode) {
        if (this.index < that.getCompareToIndex()) return BEFORE;
        if (this.index > that.getCompareToIndex()) return AFTER;
        return super.compareTo(that);
      }
      if (that instanceof NonTerminalNode) {
        try {
          final int thisLCorner = this.index;
          final int thatLCorner = that.getLeftmostProperDescendantIndex();
          final int thisRCorner = this.index;
          final int thatRCorner = that.getRightmostProperDescendantIndex();

//          if (thisLCorner == -1 || thatLCorner == -1) {
//            if (thisRCorner < thatRCorner) return BEFORE;
//            if (thisRCorner > thatRCorner) return AFTER;
//          }
//          if (thisRCorner == -1 || thatRCorner == -1) {
//            if (thisLCorner < thatLCorner) return BEFORE;
//            if (thisLCorner > thatLCorner) return AFTER;
//          }
         
          if (thisLCorner != -1 && thatLCorner != -1 && thisRCorner != -1 && thatRCorner != -1) {
            if (thisLCorner < thatLCorner && thisRCorner < thatRCorner) return BEFORE;
            if (thisLCorner > thatLCorner && thisRCorner > thatRCorner) return AFTER;
            if (thisLCorner > thatLCorner && thisRCorner < thatRCorner) return BEFORE;
            if (thisLCorner < thatLCorner && thisRCorner > thatRCorner) return AFTER;
          } else {
            if (thisLCorner != -1 && thatLCorner != -1) {
              if (thisLCorner < thatLCorner) return BEFORE;
              if (thisLCorner > thatLCorner) return AFTER;
            }
            if (thisRCorner != -1 && thatRCorner != -1) {
              if (thisRCorner < thatRCorner) return BEFORE;
              if (thisRCorner > thatRCorner) return AFTER;
            }
          }
         
         
         
//          final int thisLCorner = this.index;
//          final int thatLCorner = that.getLeftmostDescendantIndex();
//          final int thisRCorner = this.index;
//          final int thatRCorner = that.getRightmostDescendantIndex();
//
//          if (thisLCorner == -1 || thatLCorner == -1) {
//            if (thisRCorner < thatRCorner) return BEFORE;
//            if (thisRCorner > thatRCorner) return AFTER;
//          }
//          if (thisRCorner == -1 || thatRCorner == -1) {
//            if (thisLCorner < thatLCorner) return BEFORE;
//            if (thisLCorner > thatLCorner) return AFTER;
//          }
//          if (thisLCorner < thatLCorner && thisRCorner < thatRCorner) return BEFORE;
//          if (thisLCorner > thatLCorner && thisRCorner > thatRCorner) return AFTER;
//          if (thisLCorner > thatLCorner && thisRCorner < thatRCorner) return BEFORE;
//          if (thisLCorner < thatLCorner && thisRCorner > thatRCorner) return AFTER;
         
         
         
//          int corner = that.getLeftmostDescendantIndex();
//          if (corner != -1) {
//            if (this.index < corner) return BEFORE;
//            if (this.index > corner) return AFTER;
//          }
//          corner = that.getRightmostDescendantIndex();
//          if (corner != -1) {
//            if (this.index < corner) return BEFORE;
//            if (this.index > corner) return AFTER;
//          }
        } catch (MaltChainedException e) {
        if (SystemLogger.logger().isDebugEnabled()) {
          SystemLogger.logger().debug("",e);
        } else {
          SystemLogger.logger().error(e.getMessageChain());
        }
        System.exit(1);
        }
      }
      if (this.index < that.getCompareToIndex()) return BEFORE;
      if (this.index > that.getCompareToIndex()) return AFTER;
    return super.compareTo(that);
  }

  public boolean equals(Object obj) {
    Token v = (Token)obj;
    if (!(this.predecessor == v.predecessor && this.successor == v.successor)) return false;
    return super.equals(obj);
  }
 
  public int hashCode() {
    int hash = 7;
    hash = 31 * hash + (null == predecessor ? 0 : predecessor.hashCode());
    hash = 31 * hash + (null == successor ? 0 : successor.hashCode());
    return 31 * hash + super.hashCode();
  }
 

  public String toString() {
    final StringBuilder sb = new StringBuilder();
    sb.append(super.toString());
    return sb.toString();
  }
}
TOP

Related Classes of org.maltparserx.core.syntaxgraph.node.Token

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.