terça-feira, 8 de junho de 2010

Implementação

Olá Pessoal,

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) para cada produção, para ficar melhor a implementação vocês poderiam:
1 - Adicionar public Vector _FirstFollow na classe Producao.
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