public static void main(String[] args) {

    AutomataPila aut = new AutomataPila();
    aut.getEstados().add("s0");
    aut.getEstados().add("s1");
    aut.setEstadoInicial("s0");
    aut.setEstadoFinal("s1");

    AristaAP arist;

    arist = new AristaAP(0, 0, 0, 0, "s0", "s0");
    arist.anadirSimbolo("a");
    arist.setCimaPila("Z");
    arist.anadirPila("AZ");

    aut.anadeArista(arist);

    /** **** */
    arist = new AristaAP(0, 0, 0, 0, "s0", "s0");
    arist.anadirSimbolo("b");
    arist.setCimaPila("Z");
    arist.anadirPila("BZ");

    aut.anadeArista(arist);

    /** **** */
    arist = new AristaAP(0, 0, 0, 0, "s0", "s0");
    arist.anadirSimbolo("a");
    arist.setCimaPila("A");
    arist.anadirPila("AA");

    aut.anadeArista(arist);

    /** **** */
    arist = new AristaAP(0, 0, 0, 0, "s0", "s0");
    arist.anadirSimbolo("b");
    arist.setCimaPila("B");
    arist.anadirPila("BB");

    aut.anadeArista(arist);

    /** **** */
    arist = new AristaAP(0, 0, 0, 0, "s0", "s0");
    arist.anadirSimbolo("a");
    arist.setCimaPila("B");
    arist.anadirPila("\\");

    aut.anadeArista(arist);

    /** **** */
    arist = new AristaAP(0, 0, 0, 0, "s0", "s0");
    arist.anadirSimbolo("b");
    arist.setCimaPila("A");
    arist.anadirPila("\\");

    aut.anadeArista(arist);

    /** **** */
    arist = new AristaAP(0, 0, 0, 0, "s0", "s1");
    arist.anadirSimbolo("\\");
    arist.setCimaPila("Z");
    arist.anadirPila("Z");

    aut.anadeArista(arist);
    /** *** */
    AutomataP_to_GramaticaIC a = new AutomataP_to_GramaticaIC(aut);
    a.AP_Gramatica();
  }
  /**
   * @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();
  }