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:
[code]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 listaProducao = new ArrayList();
static Map<String, String> mapaGramatica = new HashMap<String, String>();
static Set 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();
}
}[/code]
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”