/** Realiza os passos do parser LL(1) */
  private int proximoPasso() {
    System.gc();
    /** Limpando epsilons */
    for (int i = 0; i < _FS._FormaSentencial.size(); i++) {
      if (_FS._FormaSentencial.elementAt(i) instanceof Terminal
          && _FS._FormaSentencial.elementAt(i)._caractere == Terminal.epsilon) {
        _FS._FormaSentencial.removeElementAt(i--);
      }
    }

    /** Verificar se já casou com todos os i elementos da string de entrada */
    if (_FS.pCharACasar >= tamStringEntrada) {

      // Caso existam ainda mais símbolos na forma sentencial
      if (_FS._FormaSentencial.size() > tamStringEntrada) {

        // Todos deverão ser variáveis com epsilon em FIRST a partir de pCharACasar
        if (isAllEpsilonVariaveis(_FS._FormaSentencial, _FS.pCharACasar)) {
          return ENCONTROU_CAMINHO; // Conseguiu encontrar uma derivação
        } else {
          return ABORTAR_CAMINHO; // Abortar caminho de derivação
        }

        // Caso não existam mais símbolos
      } else {
        return ENCONTROU_CAMINHO; // Conseguiu encontrar uma derivação
      }

      /** Caso a SENTENÇA gerada seja menor do que a string de entrada */
    } else if (_FS.pCharACasar
        >= _FS._FormaSentencial
            .size()) { // Se for sentença, ocorrerá um estouro no índice pCharCasar
      return ABORTAR_CAMINHO; // Abortar caminho de derivação
    }

    DebugFormaSentencial(_FS._FormaSentencial);

    /** Verificar se podem ser podadas as derivações seguintes */
    if (podarDerivacao()) {
      System.out.println("Podado");
      return ABORTAR_CAMINHO;
    }

    // Adquirindo símbolo mais a esquerda à casar
    Simbolo sEsq = _FS._FormaSentencial.elementAt(_FS.pCharACasar);

    /** Caso o símbolo da forma sentencial for um terminal */
    if (sEsq.isTerminal()) {
      // Se o símbolo da forma sentencial for correto
      if (itMatch((Terminal) sEsq, _FS.pCharACasar)) {
        _FS.pCharACasar++;
        return PROXIMO_PASSO; // Casar próximo caractere

        // Se o símbolo da forma sentencial for errado
      } else {
        return ABORTAR_CAMINHO; // Abortar caminho de derivação
      }

      /** Caso o símbolo da forma sentencial for uma variável */
    } else {
      ColunasLL1 derivacoes = getDerivacoesLL1((Variavel) sEsq, _FS.pCharACasar);

      // Caso não exista derivação para esta variável e terminal
      if (derivacoes == null) {
        return ABORTAR_CAMINHO; // Abortar caminho atual

        // Caso exista, considerando ambiguidade, gerar todos os caminhos possiveis
      } else {
        Vector<Nodo> caminhos =
            derivacoes.getCaminhos(_FS); // Indica o nodo pai para os caminhos filhos

        _BT.add(0); // Adicionar primeiro endereço da bifurcação para Backtracking
        _FS.setCaminhos(caminhos); // Adicionando caminhos do nodo

        _FS = _FS.getCaminho(0); // Pesquisando pelo primeiro caminho
        return PROXIMO_PASSO;
      }
    }
  }