private void anadeProduccionesTerminales(
      String origen,
      String cima,
      ArrayList<String> estados,
      ArrayList<String> simbolos,
      String destino) {

    String est = new String(/*itEst.next()*/ destino);
    Iterator<String> itSimbolos = simbolos.iterator();
    while (itSimbolos.hasNext()) {
      String sim = new String(itSimbolos.next());
      Produccion p = new Produccion();
      p.anadeCadena(sim);
      String nVar = "[" + origen + cima + est + "]";
      gic.anadeVariable(nVar);
      gic.anadeProdConTerminales(nVar);
      gic.anadeProduccion(nVar, p);
    }
  }
  private void anadeProduccionConUnaLista(
      String origen,
      String destino,
      String cima,
      ArrayList<String> lista,
      ArrayList<String> simbolos,
      ArrayList<String> salidaPila) {

    int tamLista = lista.size();
    int tamListaConcreta = salidaPila.size();
    int tamSimbolos = simbolos.size();
    int nuevoTam = tamLista - 1;
    String rk = lista.get(nuevoTam) + "";
    String nVar = "[" + origen + cima + rk + "]";
    gic.anadeVariable(new String(nVar));
    Produccion p = new Produccion();

    for (int j = 0; j < tamSimbolos; j++) {
      String sim = simbolos.get(j);
      p.anadeCadena(sim);
      for (int i = 0; i < tamListaConcreta; i++) {
        String cadProd = "[";
        if (i == 0) cadProd += destino;
        else cadProd += lista.get(i - 1);
        String sigEstado = null;
        if (i + 1 == tamListaConcreta) {
          sigEstado = rk;
        } else {
          sigEstado = lista.get(i);
        }

        cadProd += salidaPila.get(i) + sigEstado + "]";
        p.anadeCadena(new String(cadProd));
      }
      gic.anadeProduccion(nVar, p);
    }
  }
  /**
   * @return Gramatica resultado de aplicar el algoritmo para hallar una gramatica indepenediente de
   *     contexto a partir de un automata de pila dado.
   */
  @SuppressWarnings("unchecked")
  private void AP_Gramatica() {

    gic = new GramaticaIC();
    gic.setSimbolos((ArrayList<String>) automataEntrada.getAlfabeto().getListaLetras().clone());

    gic.setVariableInicial("S");

    ArrayList<String> estados = (ArrayList<String>) this.automataEntrada.getEstados().clone();
    Iterator<String> it = estados.iterator();

    gic.anadeVariable("S");
    while (it.hasNext()) {

      Produccion p = new Produccion();
      String ini = this.automataEntrada.getEstadoInicial();
      String cadena = "[" + ini + fondoPila + it.next() + "]";
      p.anadeCadena(cadena);
      gic.anadeProduccion("S", p);
      gic.anadeVariable(cadena);
    }

    ArrayList<AristaAP> arista = this.automataEntrada.getAutomataPila();
    Iterator<AristaAP> itArista = arista.iterator();

    while (itArista.hasNext()) {

      AristaAP aristaActual = itArista.next();
      ArrayList<String> salidaPila = (ArrayList<String>) aristaActual.getSalidaPila().clone();
      String destino = new String(aristaActual.getDestino());
      String origen = new String(aristaActual.getOrigen());
      ArrayList<String> simbolos = (ArrayList<String>) aristaActual.getEntradaSimbolos().clone();
      String cima = new String(aristaActual.getCimaPila());

      if (desapila(salidaPila)) {
        anadeProduccionesTerminales(origen, cima, estados, simbolos, destino);
      } else {
        int tamLista = salidaPila.size();
        ArrayList<ArrayList<String>> listaParesEstados =
            construyeListasEstados((ArrayList<String>) estados.clone(), tamLista);
        anadeProduccionesConLista(origen, destino, cima, listaParesEstados, simbolos, salidaPila);
      }
    }

    html = "";
    html +=
        "<br><h2>"
            + mensajero.devuelveMensaje("simplificacionGICs.resulap", 2)
            + "</h2><center><table>"
            + gic.toHTML()
            + "</table></center><br>";
    xml +=
        "<paso><titulo>"
            + mensajero.devuelveMensaje("simplificacionGICs.resulap", 2)
            + "</titulo>"
            + gic.toXML()
            + "</paso>\n";
    xmllatex +=
        "<ocultar>\n<oculto><titulo>"
            + mensajero.devuelveMensaje("simplificacionGICs.resulaplatex", 2)
            + "</titulo>"
            + gic.toLat()
            + "</oculto>\n";

    traduceVariables();
  }