Closed mfelipek closed 8 years ago
Estou fazendo tambemS
Alguem consegue testar?
vou fazer o clone agora e testar
to com problema de recursividade nessa, tentando resolver aqui, tipo: A -> tB|Bt B -> tA|At O follow de A chama o follow de B e o follow de B chama o follow de A e ficam infinitamente assim
Na aula deu uma questão com um caso parecido. Acho que resolvemos tipo ignorando a recursão FIRST A = t FIRST B = t Quando ver dava pra identificar a recursão, e se encontrar, retornar uma lista vazia para o não terminal de origem.
to vendo a video aula do Coursera, quando acontece isso, quer dizer que os dois são iguais, então independente de qualquer coisa, eles são iguais. Aí tipo, acho que tem que pegar tudo que for possível de um e passar pro outro.
Exemplo: A -> tB|Bt B -> tA|At
A chamou B B chamou A ao inves de A chamar B de novo, retorna {t} B retorna {t} A utiliza o {t}
Acho que funcionaria assim, só achar um jeito de identificar pra nao chamar duas vezes o mesmo NT a partir de um NT.
acho que resolvi o problema de recursividade, criei um vetor global que guarda as chamadas de cada um, caso ele for chamar o mesmo novamente, ele ignora e continua o resto do método.
tem só mais um detalhe que estou vendo: E->TX Caso o Y produza uma sentença vazia, o follow de E também pertence ao Follow de T. Hoje, o sistema faz isso apenas com o X.
Fiz uma lógica para isto. Coloquei algumas gramaticas teste no começo do arquivo. A gramatica que está ativa é a utilizada no curso do Coursera. Faz um teste ai Mateus e fecha a tarefa se estiver OK.
Vou testar
Comentei ali na issue do FIRST, a gramatica e produções que botei ali são boas pra encontrar erros.
Agora o programa acusa um erro para esta gramática para esta gramática, dizendo que não é LL(1).
Criar uma funcao que, a partir de um NT, retorna a lista de producoes FOLLOW.