Implementação do Analisador Léxico

Documentos relacionados
Compiladores. Análise Léxica

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

Compiladores. Análise Léxica

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Estrutura geral de um compilador programa-fonte

Compiladores - Autômatos

Compiladores I Prof. Ricardo Santos (cap 1)

Compiladores. Conceitos Básicos

Como construir um compilador utilizando ferramentas Java

Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison

Linguagens Formais e Autômatos P. Blauth Menezes

IV.2 Aspectos Léxicos Convencionais

9. Software de Sistema - Montadores (capítulo 9 do livro texto)

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

Prof. Adriano Maranhão COMPILADORES

Identificadores Nome de variáveis, constantes, métodos, etc...

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

NEANDERWIN. Algumas características do processador Neander são:

INCLUSÃO DO ALGORITMO DE TRANSFORMAÇÃO DE UM AUTÔMATO FINITO EM EXPRESSÃO REGULAR NO AMBIENTE EDITOR DE AUTÔMATOS FINITOS

Tokens, Padroes e Lexemas

Construção de Compiladores Aula 2 - Analisador Léxico

Autômatos e Linguagens

Linguagem de Montagem do NeanderX

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

SSC510 Arquitetura de Computadores 1ª AULA

Projeto de Compiladores

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

INE5317 Linguagens Formais e Compiladores. Ricardo Azambuja Silveira INE-CTC-UFSC URL:

Conceitos de Linguagens de Programação

Análise Sintática. Fabiano Baldo

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

COMPILAÇÃO. Ricardo José Cabeça de Souza

Compiladores 02 Analise léxica

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Linguagens de Programação

Introdução à Computação

Compiladores Aula 3. Celso Olivete Júnior.

Introdução à Programação

Análise sintática. Análise sintática ascendente. Parte-se dos símbolos terminais em direção ao símbolo inicial da gramática. Derivação mais à direita

Computador Cleópatra

Introdução à Computação: Máquinas Multiníveis

Construção de Compiladores Aula 3 - Analisador Sintático

Compiladores. Introdução à Compiladores

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)

Linguagens Livres do Contexto. Adaptado de H. Brandão

Análise Sintática. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 18

Compiladores - JACC. Fabio Mascarenhas

COMPILADORES. Análise semântica. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Como construir um compilador utilizando ferramentas Java

Análise Sintática Introdução

Acadêmica: Giselle Mafra Schlosser Orientador: Everaldo Artur Grahl

PROGRAMAÇÃO I. Introdução

Noções de compilação

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Linguagens Formais e Autômatos. Apresentação do Plano de Ensino

Analisador Léxico parte II

Linguagens de Programação Aula 3

Introdução aos Compiladores

Compiladores. Introdução

Linguagem de Programação

INE5622 INTRODUÇÃO A COMPILADORES

Porque usar um montador? Formato de uma linha de código fonte:

Ferramenta de apoio a identificação de eventos utilizando Linguagem Natural. Aluno: Ricardo Tomelin Orientador: Everaldo Artur Grahl

Conceitos Básicos de Programação

Linguagens Formais. Aula 01 - Conceitos Básicos. Prof. Othon Batista Mestre em Informática

Informática I. Aula 9. Aula 9-17/05/2006 1

LINGUAGEM LIVRE DE CONTEXTO GRAMÁTICA LIVRE DE CONTEXTO

Construção de Compiladores Aula 16 - Análise Sintática

Reduce: reduz o que está imediatamente à esquerda do foco usando uma produção

Caixa Postal 3167 CEP Criciúma, SC, Brasil

RONALDO LIMA ROCHA CAMPOS GERADOR DE COMPILADORES

CAP. VI ANÁLISE SEMÂNTICA

Análise Léxica II. Eduardo Ferreira dos Santos. Setembro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 30

4) Defina o que vem a ser um algoritmo, e porque, o mesmo depende do processo.

Transcrição:

Implementação do Analisador Léxico Ricardo Mendes do Nascimento Universidade Regional Integrada do Alto Uruguai e das Missões (URI) Santo Ângelo RS Brasil rnascom@urisan.tche.br Resumo. Este artigo tem como objetivo apresentar a implementação do analisador léxico solicitado na disciplina de Linguagens Formais e Compiladores I. 1. O Problema Durante a disciplina de Linguagens Formais e Compiladores I, foi proposta a implementação de um software que analisasse lexicamente um código fonte supostamente criado para uma linguagem especificada no trabalho. Este programa deveria então, ler um determinado arquivo que contivesse o código fonte a ser analisado, e executar a análise léxica sobre ele. Ao final este deveria gerar uma lista de tokens que poderá ser utilizada futuramente pelo analisador sintático da linguagem em questão. 2. Solucionado o Problema O processo para a criação de um analisador léxico é muito simples, embora possa ser trabalhosa a criação das gramáticas e autômatos finitos conforme a especificação da linguagem. Primeiramente é necessária a especificação da linguagem a ser reconhecida pelo analisador léxico. Após são criadas as gramáticas e autômatos finitos para cada sentença, estes são agrupados em um único autômato finito que é determinizado. Feito isso é possível implementar um algoritmo que utilize este autômato para a validação de um código fonte escrito para a linguagem. Esta validação consiste em ler todo código e, cadeia a cadeia, verificar a existência de uma sentença. Para cada sentença reconhecida um token é adicionado a lista de tokens. Os erros encontrados durante a análize léxica, também serão adicionados a lista de tokens, simbolicamente através do token <ERROR>, além de serem estes contabilizados e informados ao usuário, de forma que o código só é valido se não existirem erros. Trabalho de Linguagens Formais e Compiladores I 28/06/2007 1/7

3. Criando o Autômato Para a criação do autômato finito determinizado da linguagem, é necessário primeiramente criar uma gramática para cada uma das sentenças desta. A partir da gramática regular de cada umas das sentenças, é gerado um autômato para cada uma destas, que será capaz de validar uma cadeia de símbolos como sentença da linguagem. No nosso caso as sentenças que serão validadas pelo autômato fazem parte de uma linguagem assembly formada pelas instruções HLT, LDA, STR, ADD, SUB, JZ, JP, JN, JMP, GET, PRT, e pelas pseudo-instruções: ORG, EQU e END. Todas estas reconhecidas apenas se escritas com todos caracteres maiúsculas. Abaixo serão apresentados as gramáticas e autômatos gerados para cada uma das instruções. Figura 1. Gramáticas e Autômatos Finitos das Instruções Além das instruções e pseudo-instruções a linguagem é formada por sentenças que são reconhecidas como um número inteiro, um operando ou um rótulo. Um número inteiro é formado por qualquer cadeia de caracteres formada somente com os caracteres 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9, independente da seqüência ou quantidade de cada um dos símbolos. Da mesma forma é reconhecido um operando quando uma cadeia formada pelos símbolos x, y, z, w e i, e um rótulo quando encontrada uma cadeia formada pelos símbolos a, b, c, d, e e. Na figura abaixo é possível visualizar cada uma das gramáticas e autômatos gerados para estes casos. Trabalho de Linguagens Formais e Compiladores I 28/06/2007 2/7

Figura 2. Números Inteiros, Operandos e Rótulos. Após a criação de todos autômatos para cada sentença, estes são agrupados em somente um que já será capaz de validar qualquer sentença da linguagem. Para isso deve ser cuidado para que nenhum autômato inicial tenha algum estado com o mesmo nome de algum estado de outro autômato, somente assim é possível agrupá-los com a garantia do reconhecimento de todas sentenças. Figura 3. Autômato Finito Não - Determinístico. Embora este autômato seja capaz de reconhecer qualquer sentença da linguagem, a validação através deste ainda não é eficiente e simples se comparado com um autômato finito determinístico. Logo, este deve ser determinizado para obtermos um autômato mais eficiente. Trabalho de Linguagens Formais e Compiladores I 28/06/2007 3/7

Figura 4. Autômato Finito Determinístico. Após a determinização foram substituídas as nomenclaturas dos estados novos que surgiram durante o processo.assim o autômato finito determinístico final ficou como apresentado abaixo. Figura 5. Autômato Finito Determinístico Final. Trabalho de Linguagens Formais e Compiladores I 28/06/2007 4/7

4. Implementação do analisador O software foi implementado utilizando orientação a objeto e foi estruturado com as seguintes classes apresentadas no diagrama abaixo. Figura 6. Diagrama de classes. 4.1. Classe Analyzer A principal classe deste sistema é a Analyzer. Esta possui como atributo um objeto da classe Automaton que representa o autômato finito determinístico criado. O vetor tokenlist armazena a lista de tokens que serão gerados pelo método buildtokenlist. Este método é quem faz a mágica da análise léxica, lendo através da classe utlitária Arquivo todo o código fonte especificado pelo usuário, e validando-o através do autômato determinístico. Em uma única passagem pelo código fonte é possível gerar a lista de tokens e concluir se a código é valido para a linguagem. Figura 7. Classe Analyzer. 4.2. Classe Automaton O autômato é representado por objeto Automaton utilizado como atributo pela classe Analyser. Neste existe um vetor bidimensional nextstate que guarda todas as o próximo estado de todas as combinações possíveis entre cada símbolo da linguagem e os estados existentes. Estes estados estão representados no vetor vstate. Para encontrar o próximo estado que o analisador irá obter, o autômato localiza o índice da coluna, dentro do vetor nextstate, referente ao símbolo que ele está analisando, através do método columnofsymbol. Da mesma forma localiza o e o índice referente ao estado atual através daométodo rowofstate. Com o resultado deste dois métodos possível identifica o próximo estado que será retornado para o objeto analyzer. Trabalho de Linguagens Formais e Compiladores I 28/06/2007 5/7

Figura 8. Classe Automaton. 4.3. Classe Token Para a manipulação de tokens, foi criada uma classe denominada Token que nos possibilita tratar cada token como um objeto. Estes objetos possuem dois atributos: o name, que nos permitiu nomear cada token, facilitando a identificação de cada objeto gerado, e o atributo id, que é o armazena o estado final que gera o token em questão. Figura 9. Classe Token. 4.4. Classe Editor Para a interação com o usuário foi criada uma classe chamada Editor. A partir da construção de um objeto editor no método main desta mesma classe, o usuário pode interagir com o objeto analyser, solicitando a criação do tokenlist de um arquivo editado na interface gráfica gerada pelo objeto, ou carregado através do método open. Figura 10. Classe Editor. Trabalho de Linguagens Formais e Compiladores I 28/06/2007 6/7

4.5. Classe Arquivo Para a manipulação de arquivos foi utilizada a classe Arquivo pertencente a uma biblioteca de uso genérico chamada ricna, criada justamente para reaproveitamento de código em diversas aplicações. Esta classe é utilizada somente para abrir, fechar, escrever e ler arquivos. 5. Considerações Finais Através da implementação foi possível verificar e validar as soluções estudadas teoricamente em sala de aula. Utilizando a técnica para gerar as gramáticas de cada sentença da linguagem, para gerar autômatos finitos a partir de cada gramática e a técnica de determinização sobre o agrupamento de todos autômatos, possibilitou a implementação de um algoritmo muito simples frente a um problema que aparentemente necessitaria de um código complexo quando não aplicadas as técnicas vistas em aula. Isso também é pode ser afirmado por quem já implementou, sem aplicar nenhuma destas técnicas, o famoso montador de linguagem assembly para linguagem de máquina. Neste é necessária a identificação das sentenças da linguagem em uma das passagens, porém, sem um mínimo conhecimento de linguagens formais e autômatos, a implementação torna-se um tanto complexa devido a imensa quantidade de verificações necessárias simplesmente para validar as cadeias encontradas no código fonte. Logo, o esforço despendido no estudo e construção da gramática e autômato finito determinizado de uma linguagem, além de essencialmente necessário para solucionar problemas desta ordem, é compensado com uma implementação tranqüila e eficientemente garantida. 5. Referências Menezes, Paulo Blauth. Linguagens formais e autômatos. Porto Alegre: Instituo de Informática da UFRGS: Editora Sagra Luzzatto, 2005. Notas de aulas de Linguagens Formais e Compiladores I Prof. Dr. Bráulio Adriano Mello Trabalho de Linguagens Formais e Compiladores I 28/06/2007 7/7