JFLAP JAVA Formal Language and Automata Package Autor: Ricardo Augusto Rabelo Oliveira Resumo Este relatório é um tutorial descrevendo o uso do JFLAP, uma ferramenta utilizada no estudo de teoria de linguagens. Introdução O JFLAP (Java Formal Language and Automata Package) é uma ferramenta visual usada para criar e simular diversos tipos de autômatos, e converter diferentes representações de linguagens. O seu principal objetivo é facilitar o aprendizado de teoria de linguagens, através de uma interface simples e intuitiva. Ele pode ser usado tanto como aparato de auxílio às aulas, como ferramenta de estudo e pesquisa, facilitando tanto a criação de autômatos, quanto a verificação se estão corretos. O passo inicial para a utilização do JFLAP é a criação de autômatos. O usuário utiliza a interface visual para criar um grafo representando os estados, o diagrama de transições e os seus labels. Em seguida, pode definir a palavra de entrada e então visualiza a execução de cada passo do autômato, verificando se o seu projeto é coerente. Isso pode ser feito com três escolhas de execução, um modo rápido, que indica a resposta imediata, um modo passo a passo, que mostra os estados percorridos, e o modo múltiplo, que mostra o teste de diversas palavras, da mesma maneira que o modo rápido. No modo de conversão do JFLAP, é possível converter a representação de uma linguagem em outro tipo de representação. Dentro das linguagens regulares é possível converter um AFN para um AFD, um AFD para um AFD mínimo, um AFD para uma expressão regular, um AFN para uma gramática regular e uma gramática regular para um AFN. As transformações suportadas para linguagens livres de contexto são a conversão de um autômato a pilha não deterministico para uma gramática livre de contexto, e três algoritmos para a conversão de uma gramática livre de contexto para um autômato a pilha não deterministico. A Figura 1 mostra as possibilidades de conversão para as estruturas nas linguagens regulares Figura 1. Modos de conversão para as representações das linguagens regulares. Dessa maneira, o JFLAP pode ser organizado em três maneiras de trabalho: - - - Experimentação das estruturas das linguagens: simular palavras de entrada em autômatos, construir parse tables e parse trees para gramáticas e desenhar sucessivas expansões de L-systems. Os autômatos principais são o autômato finito deterministico (AFD) e não deterministico (AFN), autômatos a pilha(PDA) e maquinas de Turing multi-tape. Os algoritmos de parsing que ele implementa são o brute-force parsing, LL(1) parsing e SLR(1)parsing. Conversão entre estruturas equivalentes: ele tem capacidade de converter expressões regulares para AFD, AFN para AFD, PDA para gramática, gramática para PDA, minimização de AFD, gramática livre de contexto para a forma normal de Chomsky. Ferramentas de análise: O JFLAP oferece algumas ferramentas para mostrar as características das estruturas de linguagens, como por exemplo, identificação de estados não deterministicos, identificação de transições lambda e equivalência entre dois autômatos finitos. Como instalar o JFLAP A ultima versão do JFLAP, a 4.0b10, requer a presença do Java 1.4 ou superior. O melhor local de download é a página de Java da Sun. Para a execução do JFLAP é necessária apenas a presença do arquivo JFLAP.jar. Para a sua execução, as instruções gerais em diversas plataformas: Mac OS X Unix/Linux Windows Duplo clique no arquivo JFLAP.jar No diretório com o arquivo JFLAP.jar, execute java -jar JFLAP.jar em qualquer Shell Duplo clique no arquivo JFLAP.jar Se não funcionou, 1) Tenha certeza que instalou o Java 1.4 2) Se por acaso o arquivo salvo tem o nome JFLAP.zip, mude seu nome para JFLAP.jar. Modos de Trabalho. O modo inicial de trabalho do JFLAP pode ser escolhido através do menu de entrada Figura 2 – Menu principal A escolha do modo de trabalho abre uma tela especifica para cada tipo de autômato ou estrutura de linguagem. Autômatos Finitos A tela para os autômatos finitos é vista abaixo. As ferramentas abaixo mostram as possibilidades de trabalho. A opção Input no menu mostra as opções para testar as palavras reconhecidas pelo autômato. A opção Test compara a equivalência do autômato finito com outro do mesmo tipo, e indica estados não deterministicos. A opção Convert permite converter o autômato para AFD, minimizar, converter para gramática, converter para RE e combinar o autômato com algum outro. Figura 3- Tela para autômatos finitos A primeira etapa é escolher a opção de criação de estados do autômato. À medida que são posicionados, a nomenclatura dos estados é gerada automaticamente. Figura 4 – Estados posicionados Usando a ferramenta indicada por uma seta, é possível criar as transições dos estados, indicando em seguida qual símbolo será reconhecido em cada transição. Figura 5- Autômato finalizado. A etapa seguinte consiste em identificar quais são os estados finais e o inicial. Sem essa definição, o JFLAP indicará a impossibilidade de verificar o funcionamento do autômato. A identificação é feita com um clique do botão direito do mouse em cima dos estados desejados. Figura 6- Definição dos estados inicial e final Após o desenho do autômato, é possível utilizar as técnicas de verificação. No menu, a opção Input mostra as maneiras de se testar uma palavra de entrada para o autômato. Pode se fazer um teste de resposta imediata, para uma única palavra, onde é mostrado passo a passo a derivação da palavra, para múltiplas palavras, onde é indicado quais são aceitas e o modo passo a passo. Este último será mostrado a seguir. O primeiro passo é a escolha da palavra de entrada. Figura 7- Palavra de entrada Figura 8- Interface de simulação e teste das palavras. Durante a simulação e teste, a interface de simulação mostrada na figura 8 é utilizada. Através dela é possível coordenar passo a passo o tratamento da palavra, onde os estados correntes são ressaltados com a cor mais escurecida. Numa máquina não deterministica, as diversas possibilidades de transição geradas pela máquina são mostradas. Figura 9- Simulação de um autômato não deterministico A cada passo, as transições são verificadas até o momento que não sejam possíveis de ocorrerem. Nesse instante, a transição em especifico é dada como invalida e as seguintes continuam. Quando a transição chega ao estado final, simulador indica que o automato reconhece a palavra. A rejeição é mostrada pela cor vermelha e o estado final de aceitação é mostrado pela cor verde. Figura 9- Indicação do reconhecimento da palavra Conversão para expressões regulares. Um outro ponto importante é a conversão do autômato finito para a respectiva expressão regular. O processo pode ser feito de maneira automática, com o resultado mostrado diretamente, ou interativamente, com o objetivo de se mostrar o algoritmo passo a passo. Resumidamente, a partir do AFD inicial, o JFLAP indica a necessidade de inclusão de transições lambda extras, para em seguida permitir que o usuário escolha quais estados devem ser colapsados e substituídos por trechos de expressões regulares até gerar a expressão regular final. Figura 10- Conversão de AFD para ER Figura 11 – Conversão de ER para AFN No passo contrário, o JFLAP efetua a conversão, de maneira automática ou interativa, da ER para um AFN. Em seguida este pode ser convertido para um AFD e ser minimizado. Gramáticas O modo de criação de uma gramática no JFLAP abrange todas as gramáticas previstas (regulares, livres de contexto...). A entrada dos dados consiste em colocar as variáveis na coluna da esquerda e na direita, as variáveis e os terminais. Figura 12 – Entrada de dados de uma gramática Figura 12- Parse table usada na gramática para remoção de ambigüidade Para efetuar a contrução do parser SLR, são selecionados os conjuntos nas colunas First e Follow, que são utilizados para a modelagem do AFD usado na definição da parse table. Após isso, é possível efetuar o parsing de uma palavra reconhecida pela gramática, como pode ser visto na figura 13. Figura 13- Parsing para verificar se a gramática aceita a palavra de entrada. A opção do parser para as gramáticas livres de contexto e as irrestritas é o brute force parser. Na figura 14 é mostrado seu uso para efetuar a verificação de uma palavra da linguagem anbncn Figura 14 - Uso do brute parser para a gramática irrestrita Bibliografia [1] JFLAP www.jflap.org