Recursividade com String

1 resposta
J

Pessoal, estou com um probleminha que envolve recursividade em Java se alguém puder ajudar, desde já agradeço.
Produções: E -> .E
E -> .E + T
E -> .T
T -> .T * F
T -> .F
F -> .( E )
F -> .id

Preciso criar um método que tenha como entrada uma String no formato ?E´ → ?E? ? chamamos de produção de E? ? e que retorne uma String no formato E' -> .E mais produção de E ou seja ?E' -> .E E -> .E + T E -> .T? e neste mesmo método preciso que recursivamente ele faça o mesmo processo porém agora a entrada do método será ?E' -> .E E -> .E + T E -> .T? e a saída será E' -> .E E -> .E + T E -> .T mais produção de T ou seja ?E' -> .E E -> .E + T E -> .T T -> .T * F T -> .F? novamente chama o método passando como parâmetro ?E' -> .E E -> .E + T E -> .T T -> .T * F T -> .F? e a saída será E' -> .E E -> .E + T E -> .T T -> .T * F T -> .F mais produção de F ou seja ?E' -> .E E -> .E + T E -> .T T -> .T * F T -> .F F -> .( E ) F -> .id?;

Para apenas uma produção eu já conseguir fazer:

import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Set;


public class Closure{

   static String listaNaoTerminal = "E T F";
   static String gramatica = "E -> .E\nE -> .E + T\nE -> .T\nT -> .T * F\nT -> .F\nF -> .( E )\nF -> .id";
   static ArrayList<String> listaProducao = new ArrayList();
   static Map<String, String> mapaGramatica = new HashMap<String, String>();
   static Set<String> chaves;


  public static void main(String[] argumentos){

    mapaGramatica.put("E", "E -> .E + T E -> .T");
    mapaGramatica.put("T", "T -> .T * F T -> .F");
    mapaGramatica.put("F", "F -> .( E ) F -> .id");

    String [] arrayGramatica = gramatica.split("\n");

    for(String producao : arrayGramatica ){
         listaProducao.add(producao);
    }


   System.out.println(closureUmaProducao("E' -> .E"));

  }


  public static String closureUmaProducao (String producao){

    String cadeiaGerada = "";

    if(testaDepoisPontoNaoTerminal(producao)){
      cadeiaGerada =  producao + " " + mapaGramatica.get(getDepoisPonto(producao));
    }


    else
      cadeiaGerada =  "";

    return cadeiaGerada;

  }//fim do metodo closureUmaProducao


  //testa se depois do ponto é um não-terminal
  public static boolean testaDepoisPontoNaoTerminal (String producao) {
    boolean retorno = false;
    for(int indice = 0; indice < producao.length(); indice++){
      char buffer = producao.charAt(indice);

      if (buffer == '.'){
        String depoisPonto = producao.substring(indice + 1, indice + 2);
         retorno = listaNaoTerminal.contains(depoisPonto);

      }
    }
    return retorno;
  }// fim do metodo testaDepoisPontoNaoTerminal



  //retorna o que tiver depois do caractere '.'
  public static String getDepoisPonto (String s){
    String depoisPonto = "";
    for(int indice = 0; indice < s.length(); indice++){
      char buffer = s.charAt(indice);

      if(buffer == '.'){
        depoisPonto = depoisPonto + " " + s.substring(indice + 1, indice + 2);
      }
    }

    return depoisPonto.trim();

  }


}

A saída do meu código: "E' -> .E E -> .E + T E -> .T"
A saída que eu preciso: "E' -> .E E -> .E + T E -> .T T -> .T * F T -> .F F -> .( E ) F -> .id"

1 Resposta

J

Se caso eu não tenha conseguido explicar muito bem a problemática, segue abaixo mais detalhes.



Criado 19 de março de 2013
Ultima resposta 20 de mar. de 2013
Respostas 1
Participantes 1