Exemplo n.º 1
0
  /**
   * Ejecutamos un AFND para una cadena dada hasta el caracter cuyo numero es indicado por
   * parametros y devolvemos el vector de configuraciones instantaneas al momento
   *
   * @param cadena
   * @param hasta
   * @return vector de configuraciones instantaneas
   */
  public ArrayList<ConfigInstantanea> ejecutar(String entrada, int hasta) throws NoDefinido {
    // definimos el conjunto de estados de la configuracion instantanea
    ArrayList<Estado> estados = new ArrayList<Estado>();

    // Agregamos el estado inicial
    estados.add(this.getEstadoInicial());

    // modificamos la cadena para considerar lambda al principio, final, e intercalado
    System.out.println("Leemos: " + entrada);
    entrada += "&";

    // recorremos la cadena modificada para determinar el conjunto de estados
    for (int i = 0; i <= hasta; i++) {

      System.out.println("Pila: " + pila.toString());

      // definimos el conjunto de estados proximos
      ArrayList<Estado> estadosProximos = new ArrayList<Estado>();

      // recorremos todos los estados del conjunto de estados de la config instantanea
      for (int b = 0; b < estados.size(); b++) {
        Estado q = estados.get(b);
        System.out.println("Estamos en el estado: " + q.getNombre());
        ArrayList<Estado> qs = new ArrayList<Estado>();

        try {
          System.out.println("Analizamos: " + entrada.charAt(i) + ", " + pila.leer());
          qs = q.valuar(entrada.charAt(i), this.pila);
        } catch (ExcepcionPilaVacia e) {
          System.out.println("Pila Vacia...");
        }

        // si corresponde agregar un estado
        if (qs.size() > 0) {
          estadosProximos.addAll(qs);
          System.out.println("...y pasamos al estado: " + qs.get(0).getNombre());
        } else {
          // si no hay transiciones pero el caracter es lambda nos quedamos en el estado actual
          if (entrada.charAt(i) == '&') {
            estadosProximos.add(q);
          }
        }
      }

      // Comprobamos que haya al menos 1 estado en el conjunto de los siguientes
      if (estadosProximos.size() <= 0) throw new NoDefinido();

      // definimos estados como los estados siguientes para usarlos en la proxima iteracion
      estados = estadosProximos;
    }

    // si todo va bien salimos con el vector de configuraciones instantaneas
    if (estados.size() > 0) {
      // cadena restante por leer
      String cadenaRestante = entrada.substring(hasta);
      // creamos un vector para las configuraciones instantaneas
      ArrayList<ConfigInstantanea> cfgs = new ArrayList<ConfigInstantanea>();

      // recorremos los estados al momento
      for (int j = 0; j < estados.size(); j++)
        cfgs.add(new ConfigInstantanea(estados.get(j), cadenaRestante));

      return cfgs;
    }

    // si llegamos aca paso algo!! salimos con excepcion!
    throw new NoDefinido();
  }