public IMatchable findObject(MatchNode matchNode, int index) {

    int node_type = matchNode.getType();

    if (node_type == MatchNode.MATCHNODE_STATEMENT && !this.stats.isEmpty()) {
      String position = (String) matchNode.getRuleValue(MatchProperties.STATEMENT_POSITION);
      if (position != null) {
        if (position.matches("-?\\d+")) {
          return this.stats.get(
              (this.stats.size() + Integer.parseInt(position))
                  % this.stats.size()); // care for negative positions
        }
      } else if (index < this.stats.size()) { // use 'index' parameter
        return this.stats.get(index);
      }
    } else if (node_type == MatchNode.MATCHNODE_EXPRENT
        && this.exprents != null
        && !this.exprents.isEmpty()) {
      String position = (String) matchNode.getRuleValue(MatchProperties.EXPRENT_POSITION);
      if (position != null) {
        if (position.matches("-?\\d+")) {
          return this.exprents.get(
              (this.exprents.size() + Integer.parseInt(position))
                  % this.exprents.size()); // care for negative positions
        }
      } else if (index < this.exprents.size()) { // use 'index' parameter
        return this.exprents.get(index);
      }
    }

    return null;
  }
  public boolean match(MatchNode matchNode, MatchEngine engine) {

    if (!super.match(matchNode, engine)) {
      return false;
    }

    Integer type = (Integer) matchNode.getRuleValue(MatchProperties.EXPRENT_EXITTYPE);
    if (type != null) {
      if (this.exitType != type.intValue()) {
        return false;
      }
    }

    return true;
  }