Recursividade com String

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”

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