Informações Principais
     Resumo
     Abstract
     Introdução
     Conclusão
     Download
  
  
  
 
Introdução
 
 
Acadêmico(a): Michel Nogueira Rebelo
Título: Desenvolvimento de um Protótipo de um GErador de Analisador Léxico
 
Introdução:
Partindo do princípio de que uma linguagem de programação serve como o meio de comunicação entre o indivíduo que deseja resolver um determinado problema e o computador escolhido para ajudá-lo na solução, pode-se dizer que a linguagem de programação deve fazer a ligação entre o pensamento humano e a precisão requerida para o processamento da máquina. O desenvolvimento de um programa, segundo Price (2001), torna-se mais fácil se a linguagem de programação em uso estiver mais próxima do problema a ser resolvido, ou seja, se a linguagem inclui construções, através de abstrações, que refletem a terminologia e/ou os elementos usados na descrição do problema. Tais linguagens são denominadas linguagens de alto nível. Já os computadores aceitam e interpretam somente sua própria linguagem de máquina, denominada de baixo nível, a qual consiste tipicamente de seqüências de zeros e uns. As de alto nível são consideradas mais próximas às linguagens naturais ou ao domínio da aplicação em questão. Para que um computador “entenda” os comandos de uma linguagem de alto nível, escritos pelo programador, estes comandos têm que ser traduzidos para uma linguagem de baixo nível, ou seja, linguagem de máquina. Segundo Martins (2002), essa tradução é feita por programas denominados processadores de linguagem, sendo que os principais tipos de processadores são os interpretadores e os tradutores. Conforme Martins (2002), um interpretador é um programa que aceita como entrada um programa escrito em uma linguagem denominada linguagem fonte, executando-o sem gerar um programa em linguagem de máquina. Já um tradutor é um programa que aceita como entrada um programa escrito em uma linguagem fonte de alto ou de baixo nível, e transforma em um programa escrito em uma outra linguagem, denominada linguagem objeto, que também pode ser uma linguagem de alto ou de baixo nível. Os tradutores podem ser classificados em: montadores, que traduzem linguagens de baixo nível; compiladores, que traduzem linguagens de alto nível; pré-processadores, que traduzem uma linguagem de alto nível em uma outra linguagem de alto nível; cross-compilers, que geram código para outra máquina diferente da utilizada na compilação. É importante salientar que para traduzir um programa fonte em um programa objeto pode ser necessário o uso de vários processadores de linguagens. Conforme Aho (1995), à primeira vista, a variedade de tradutores e, mais especificamente, de compiladores pode parecer assustadora, pois existem milhares de linguagens fontes, que vão das linguagens de programação tradicionais às linguagens especializadas das várias áreas de aplicação de computadores. Por sua vez, as linguagens objetos também são igualmente variadas, podendo ser uma outra linguagem de programação ou uma linguagem de máquina, para qualquer hardware entre um microprocessador e um supercomputador. Apesar de complexas, as tarefas básicas que qualquer compilador precisa realizar são essencialmente as mesmas, de forma que é possível construir compiladores para uma ampla variedade de linguagens fontes e máquinas objetos, usando as mesmas técnicas básicas. Logo após a escrita dos primeiros compiladores, segundo Aho (1995), surgiram ferramentas para auxiliar esse processo, as quais são freqüentemente referidas como compiladores de compiladores, geradores de compiladores e sistemas de escrita de tradutores. Este trabalho apresenta o desenvolvimento de outro compilador de compilador, mais especificamente, um protótipo de um gerador de analisador léxico, uma ferramenta de auxílio, que a partir de uma especificação baseada em expressões regulares e em uma lista de palavras reservadas e símbolos especiais, gera automaticamente uma classe que implementa toda a análise léxica de um compilador, na linguagem Object Pascal. A classe gerada reconhece em uma seqüência de cadeias de caracteres, os símbolos léxicos que formam as unidades básicas de um código fonte, também conhecidos por tokens. Para que a classe gerada reconheça os tokens, será utilizado um algoritmo descrito por Silva (2000) e implementado por Glatz (2000), que transforma expressões regulares em autômatos finitos. Segundo Glatz (2000), o algoritmo proposto apresenta-se como uma nova solução para minimizar problemas de desempenho e alto consumo de recursos computacionais na transformação de expressões regulares em autômatos finitos. Pode-se citar como relevância deste trabalho que nenhuma das ferramentas geradoras de compiladores mencionadas utilizam o algoritmo descrito por Silva (2000). O protótipo desenvolvido poderá ser usado pelos acadêmicos da disciplina de Compiladores do curso de Ciências da Computação da FURB, na construção do analisador léxico do compilador para uma linguagem de programação especificada como trabalho da referida disciplina, o que vem acontecendo normalmente. Objetiva-se abstrair a complexidade dos algoritmos usados, produzindo um analisador léxico que possa facilmente ser integrado às partes restantes do compilador.