Ainda não acabei mas acho que já dá para conseguirmos dividir as tarefas um pouco sem causar problemas.
No arquivo expressaoRegular.java existem as seguintes linhas no construtor da classe:
_ER = expressaoRegular;
_G = ConversaoER_Gramatica.criarGramaticaDeExpressaoRegular(this);
ou seja, depois de ler a expressao regular e guardar na classe, na segunda linha é interpretada a expressao regular e convertida para uma gramatica através de um parser ambiguo e analise do parser com o algoritmo de conversao proposto no paper. Como eu teria que fazer um parser ambiguo pois a gramatica de expressao regular é uma gramatica ambigua, ja aproveitei e estou implementado o nosso parser ao mesmo tempo.
Algumas etapas que não iriam atrapalhar a estrutura do programa eu pulei, como a implementação da criação do grupo FIRST and FOLLOW e o algoritmo para retirar ambiguidade a esquerda.
Sobre a recursao a esquerda, creio que não precisamos implementar, pois nosso algoritmo de conversão nunca gera recursao a esquerda. É até um ponto para podermos falar para o Rodrigo retirar do paper já que não tem coerência.
Sobre a pergunta do Rodrigo de onde acho melhor adicionar a secção do parser para gramática, creio que seja na seção B "Conversão de Expressão Regular para Gramática", indicar a gramática que estamos utilizando para interpretar a ER. OBS.: A gramática é ambigua e precisa de um parser ambíguo.
Nesta mesma secção está a explicação de como retirar recursão à esquerda, ao invés disto, mostrar que as regras nunca geram recursão a esquerda, pois sempre a esquerda existem símbolos terminais.
Mais uma coisa, mudei a sintaxe da cadeia de substituição:
/n casa com o caractere n
/nnn.../ onde n é somente digitos, casa com o índice nnn...
Desta forma, é possível criar expressoes regulares mais complexas com mais de 10 grupos.
Para o pessoal que vai me ajudar a implementar o código, dêem uma estudada na classe Gramatica e criem o algoritmo para criacao dos grupos First and Follow. Pode ser uma classe que implementa um método estático mesmo. O resultado desta classe vai ser utilizado para preencher a TabelaLL1, caso queiram dar uma estuda la também seria legal.
OBS.: Só lembrando, para gerar a tabela LL(1) é utilizado o seguinte procedimento:
Para uma producao A->alfa e para a TabelaLL1 onde cada célula da pode ser identificada como (A,a) sendo A uma variável e a um terminal. Preenchemos as células (A,a) da tabela TabelaLL1 adicionando alfa de A->alfa, para todo "a" em (A,a) em que "a" estiver em FIRST(alfa FOLLOW(A)).
Ou seja, seria interessante se o resultado do algoritmo fosse um vetor de terminais (Vector
1 - Adicionar public Vector
2 - Criar o algoritmo FIRST e o FOLLOW para cada producao e depois realizar o casamento preenchendo para cada producao o vetor _FirstFollow criado.
Falow
Nenhum comentário:
Postar um comentário