Você está na página 1de 6

Projeto Anlise Lxica

Marcus Vinicius Araujo Martins Universidade Estadual de Feira de Santana (UEFS) Feira de Santana BA Brasil
{viniciusfsa@gmail.com}

Resumo: Este relatrio descreve o projeto de implementao de um analisador lxico para um compilador. A fundamentao terica que envolve gramtica, gramticas regulares e autmatos finitos apresentada aqui, bem como uma sntese da implementao do projeto.

1. Fundamentao terica
1.1. O Compilador Um compilador pode ser compreendido como um programa que l outro programa escrito numa linguagem a linguagem fonte e o traduz num programa equivalente numa outra linguagem a linguagem alvo[1]. Alm da traduo, a compilao tem o papel de relatar a seu usurio a presena de erros no cdigo do programa fonte. A linguagem alvo no algo fixo. Esta pode ser outra linguagem de programao ou certa linguagem de mquina. Uma linguagem de programao serve como meio de comunicao entre o indivduo que deseja resolver um problema e o computador escolhido para ajud-lo na soluo [2]. A diferena entre linguagens de programao e de mquinas esto principalmente relacionadas a sua proximidade s necessidades do problema a ser resolvido, caracterstica mais presente nas linguagens de programao, ditas de auto nvel, que nas linguagens de mquina, ditas de baixo nvel. Todavia, para que se tornem funcionais, os programas escritos em linguagens de alto nvel precisam ser transcritos para linguagem de mquina[2]. Essa converso realizada por sistemas especficos, compiladores ou interpretadores, que a partir de uma entrada, um cdigo fonte, geram uma representao do mesmo algoritmo numa outra linguagem, dita linguagem objeto. Um compilador um tipo de tradutor, dentre interpretadores, montadores, macroassemblers, pr-compiladores[2]. Nesse relatrio, apenas o conceito de compilador abordado, visando a resoluo do problema proposto de desenvolvimento de um analisador lxico de um compilador. A anlise lxica compreende a primeira etapa do processo de compilao, melhor descrita no tpico 1.2. 1.2 Etapas de compilao O processo de compilao definido em duas etapas: anlise e sntese. Este processo compreendido na decomposio do programa em suas partes bsicas. A primeira parte, dita anlise, engloba as anlises lxica, sinttica e semntica. A segunda parte, dita sntese,

responsvel por usar a decomposio feita no processo de anlise para gerar o programaobjeto, engloba as etapas de gerao e otimizao do cdigo. Esse relatrio abordar a descrio de uma implementao de um analisador lxico desenvolvido usando a linguagem de programao JAVA. A anlise lxica melhor descrita no tpico 1.3. As outras etapas no sero detalhadas neste relatrio, visto que sero trabalhadas em etapas posteriores. 1.3 Anlise Lxica A anlise lxica recebe como entrada o programa fonte, composto de uma seqncia de caracteres que so lidos de forma linear[1]. Cabe ao analisador lxico apontar e identificar os elementos do programa, no reconhecimento de variveis, operadores, delimitadores, etc. Alm disso, deve retirar contedo irrelevante, como espaos e comentrios, bem como gerar um conjunto de tokens ou, em outras palavras, uma tabela de descrio de cada elemento encontrado com sua respectiva identificao. Alm do reconhecimento e armazenamento de smbolos em tabelas internas, o analisador lxico tem tambm o papel de indicar a ocorrncia de erros lxicos. O conjunto de tokens armazenados serve como entrada para aproxima etapa, o analisador sinttico. Os analisadores lxico e sinttico de certa forma recebem como entrada o mesmo cdigo, porm sobre linguagens diferentes. No caso tratado aqui, a de um analisador lxico, a linguagem considerada dita como linguagem regular, uma vez que vista sobre um conjunto de palavras formadas de smbolos de um determinado alfabeto(conjunto de smbolos da gramtica) [2]. Essa a perspectiva do conjunto de tokens de uma linguagem de programao: um conjunto de tokens de uma linguagem de programao , ento, uma linguagem regular. 1.4 Gramtica Uma gramtica G um mecanismo para gerar as sentenas (ou palavras) de uma linguagem e definida pela qudrupla(N,R,P,S) [2], onde : - N um conjunto de smbolos no-terminais - T um conjunto de smbolos terminais (constantes) - P um conjunto de regras de produo - S o smbolo inicial da gramtica Um smbolo no-terminal , como o prprio nome diz, um smbolo no finalizado. So as regras de produo definidas em P que so responsveis pela gerao das sentenas da linguagem, formando cadeias com apenas smbolos terminais, finalizados. A aplicao sucessiva de regras de produo, a partir do smbolo inicial da gramtica e se estendendo enquanto houverem smbolos no terminais na cadeia, permite derivar as sentenas vlidas da linguagem representada pela gramtica. 1.5 Gramticas regulares e autmatos Quando a gramtica possui regras de produo exclusivamente na forma A wB ou A w, onde A e B pertencem a N e w pertence a T*(onde T* corresponde as cadeias possveis formadas sobre T), ela classificada como gramtica regular [2]. Linguagens regulares podem ser reconhecidas por mquinas de transio denominadas autmatos finitos. No geral, gramticas regulares especificam os tokens, enquanto que os autmatos finitos

reconhecem os tokens[3]. Um autmato que recebe uma sentena de entrada capaz de responder se a mesma pertence ou no a linguagem representada por ele. Um autmato finito M sobre um alfabeto uma 5-upla (K, ,, eo,F), onde [3]: - K um conjunto finito de estados - o alfabeto dos smbolos da linguagem - : K x K a funo de transio de estados - eo o estado inicial - F o conjunto de estados finais Dessa forma, cada reconhecimento feito por um autmato especfico, que confere a uma determinada cadeia de smbolos o ttulo de vlida ou invlida.

2. Autmatos desenvolvidos
Para implementao do analisador lxico, os autmatos de reconhecimento foram implementados utilizando a linguagem de programao JAVA. As cadeias reconhecidas se baseiam no seguinte alfabeto: - Letra: a...z|A...Z - Digito: 0...9 - Caracteres: +,-,*,/,=,!,>,<,&,|,,,/,. separao dos caracteres). ( a virgula no includa. Usada aqui apenas para

A partir desse alfabeto, foram obtidos os autmatos de reconhecimento de: Identificadores, Nmero, Operadores, Delimitadores, Comentrios e Strings. No foi implementado autmato de palavra reservada pois, por deciso de projeto, optou-se por utilizar o autmato identificador e, depois da sentena formada, apenas verificar se ela reservada ou no.

2.1 Autmato de Identificadores O autmato para identificadores possui dos estados apenas. O estado sai do inicial quando encontra uma letra. A partir disso, qualquer letra, digito ou _ consumido para formao do identificador. A figura 1 ilustra o autmato de identificadores.

Figura 1- Autmato de identificador

2.2 Autmato de Nmeros O autmato de nmero desenvolvido na idia de que um nmero pode ser formado por apenas parte inteira ou inteira mais fracionria. Assim. O autmato possui dois estados

finais, um para antes da ocorrncia do caracter .(ponto), e outro depois. Casos como a ocorrncia do ponto e no ocorrer ao menos um dgito aps ele cai em estado no final, invalidando a sentena como nmero. O diagrama do autmato de nmeros visto na figura 2.

Figura 2- Autmato de nmero

2.3 Autmato de Operadores O autmato de operadores visto na figura 3. O autmato possui vrios estados finais devido ao nmero de operadores possveis, aritmticos e lgicos.

Figura 3- Autmato de operadores

2.4 Autmato de Comentrios O autmato da figura 4 reconhece comentrios de linha e de bloco.para ambas as sadas finais, o passo inicial sair do estado q0 com o encontro do caracter /. Para o comentrio de linha, o consumo de caracteres feito at se encontrado o smbolo de final de linha.

Figura 4- Autmato de comentrio

2.5 Autmato de String O autmato para String definido pela abertura das aspas duplas. Uma vez encontrado esse smbolo, todos os caracteres do alfabeto so consumidos, com exceo de um novo smbolo de aspas duplas, que o leva para o estado final. O autmato de String visto na figura 5.

Figura 5- Autmato de Strings

3. Projeto e padres
O projeto de anlise lxica iniciada na classe definida como Ecompiler. Nessa classe instanciada a classe AnalisadorLexico utilizando o padro de projeto Singleton. A idia de utilizar esse padro se fundamentou em no ser necessria vrias instncias do objeto responsvel pela anlise lxica, no caso, um objeto da classe AnalisadorLexico. Desta forma, cada vez que se queira usar umas instncia dessa classe, a mesma referncia ao objeto criado, quando criado, sempre retornada. A figura 6 ilustra sumariamente o diagrama de classes do projeto. A classe AnalisadorLexico utiliza uma instncia da classe DictionaryTable. Essa ltima responsvel por armazenar e dispor de mtodos de consultas para todo o alfabeto possvel nas sentenas formadas. Esse alfabeto inclui os delimitadores, palavras reservadas, operadores, dgitos e letras, minsculas e maisculas. Alm disso, tambm instanciada a classe Dictionary, que corresponde a uma classe de especificao de cada token, com sua classificao e subclassificao. Um exemplo para isso seria a palavra reservada main, que possui como classificao ser uma palavra reservada, mas como subclassificao corresponder a um comando, diferente da palavra reservada int que possui subclassificao ser um declarador. A classe AnalisadorLexico mantem uma instancia nica, tambm no padro Singleton, da classe LexicoException, que por sua vez filha da classe Exception da linguagem JAVA. Tal classe utilizada para lanamento dos erros lxicos encontrados no cdigo de entrada. Na anlise, a classe instancia objetos dos autmatos implementados, conforme a figura 6. Todos os autmatos mantm uma entrada de dois caracteres por vez, em via de analisar o atual e o prximo. Dessa forma possvel identificar m formao nas cadeias de forma mais dinmica. Outras classes tais como a de leitura de arquivo e de interface grfica no foram includas no diagrama por no serem essenciais ao entendimento do analisador lxico.

Figura 6 Diagrama de classes :Analisador Lxico

5. Referncias bibliogrficas
[1] AHO, Alfred V.; SETHI, Ravi; ULLMAN, Jeffrey D. Compiladores, principios, tecnicas e
ferramentas. Rio de Janeiro: Guanabara Koogan, c1995.

[2] PRICE, Ana Maria de Alencar; TOSCANI, Simao Sirineo. Implementacao de linguagens de programacao : compiladores. 3. ed. Porto Alegre: Sagra Luzatto, 2005. [3] TREMBLAY, J. P. ; SORENSON P. G. - The Theory And Practice Of Compiler Writing. McGraw-Hill, 1985