/**
  * @param name the name of the current node
  * @param elem the name of the node until which we want to skip
  * @throws javax.xml.stream.XMLStreamException
  */
 private void skipUntil(String name, String elem) throws XMLStreamException {
   skipBlanks();
   name = reader.getLocalName();
   if (name.equals(elem)) {
     return;
   }
   XMLPrint.printNEvent(reader, 3);
   throw new RuntimeException(
       "Error ("
           + reader.getLocation().getLineNumber()
           + ", "
           + reader.getLocation().getColumnNumber()
           + "): Parse error.");
 }
  /**
   * Parse the <e> elements
   *
   * @throws javax.xml.stream.XMLStreamException
   */
  private void procEntry() throws XMLStreamException {
    String attribute = attrib(COMPILER_RESTRICTION_ATTR);
    String ignore = attrib(COMPILER_IGNORE_ATTR);
    String name = "";
    if (ignore.equals(COMPILER_IGNORE_YES_VAL)
        || (!(attribute.equals("")) && !(attribute.equals(direction)))) {
      while (!(name.equals(COMPILER_ENTRY_ELEM))) {
        reader.next();
        if (reader.getEventType() == XMLStreamConstants.END_ELEMENT) {
          name = reader.getLocalName();
        }
      }
      return;
    }

    ArrayList<EntryToken> elements = new ArrayList<EntryToken>();

    while (true) {
      if (!reader.hasNext()) {
        throw new RuntimeException(
            "Error (" + reader.getLocation().getLineNumber() + "): Parse error.");
      }
      if (reader.getEventType() == XMLStreamConstants.START_ELEMENT) {
        name = reader.getLocalName();
      }
      skipBlanks();
      name = reader.getLocalName();
      int type = reader.getEventType();

      if (name.equals(COMPILER_PAIR_ELEM)) {
        elements.add(procTransduction());
      } else if (name.equals(COMPILER_IDENTITY_ELEM)) {
        elements.add(procIdentity());
      } else if (name.equals(COMPILER_FLAG_ELEM)) {
        elements.add(procFlag());
      } else if (name.equals(COMPILER_REGEXP_ELEM)) {
        elements.add(procRegexp());
      } else if (name.equals(COMPILER_PAR_ELEM)) {
        EntryToken par = procPar();
        elements.add(par);

        // detection of the use of undefined paradigms
        String p = par.paradigmName;
        TransducerComp t = paradigms.get(p);
        if (t == null) {
          throw new RuntimeException("Error: Undefined paradigm '" + p + "'.");
        }
        // descartar entradas con paradigms vac�os (por las direciones,
        // normalmente
        if (t.isEmpty()) {
          while (!name.equals(COMPILER_ENTRY_ELEM) || type != XMLStreamConstants.END_ELEMENT) {
            reader.next();
            if (reader.hasName()) {
              name = reader.getLocalName();
            }
            type = reader.getEventType();
          }
          return;
        }
        reader.next();
      } else if (name.equals(COMPILER_ENTRY_ELEM) && type == XMLStreamConstants.END_ELEMENT) {
        // insertar elements into letter transducer
        insertEntryTokens(elements);
        reader.next();
        return;
      } else if (reader.isWhiteSpace()) {
      } else if (allBlanks()) {
        if (!reader.hasText()) {}
      } else {
        throw new RuntimeException(
            "Error ("
                + reader.getLocation().getLineNumber()
                + "): Invalid inclusion of '<"
                + name
                + ">' into '<"
                + COMPILER_ENTRY_ELEM
                + ">'.");
      }
    }
  }