You are on page 1of 45

Anlise Lxica

Anlise Lxica
Papel do analisador lxico: ler o arquivo fonte em busca de unidades significativas (os tokens) instanciadas por lexemas ou tomos.

Tambm denominado de scanner, porque varre o arquivo de entrada eliminando comentrios e caracteres indesejveis ao agrupar caracteres com um papel bem definido.

Anlise Lxica
A separao da anlise lxica da anlise sinttica facilita o projeto e torna o compilador mais eficiente e portvel. Um anlisador lxico executa tarefas como: 1. contar as linhas de um programa 2. eliminar comentrios 3. contar a quantidade de caracteres de um arquivo 4. tratar espaos

Anlise Lxica
Tokens so padres de caracteres com um significado especfico em um cdigo fonte. Definida por um alfabeto e um conjunto de definies regulares Lexemas so ocorrncias de um token em um cdigo fonte, tambm so chamados de tomos por alguns autores

Anlise Lxica
q

Um mesmo token pode ser produzido por vrias cadeias de entradas. Tal conjunto de cadeias descrito por uma regra denominada padro, associada a tais tokens. O padro reconhece as cadeias de tal conjunto, ou seja, reconhece os lexemas que so padro de um token.

Anlise Lxica
q

Usualmente os padres so convenes determinadas pela linguagem para formao de classes de tokens. lidentificadores: letra seguida por letras ou dgitos. lliteral: cadeias de caracteres delimitadas por aspas. lnum: qualquer constante numrica.

Anlise Lxica
Os tokens usualmente so conhecidos pelo seu lexema(seqncia de caracteres que compe um nico token) e atributos adicionais. q Os tokens podem ser entregues ao parser como tuplas na forma <a, b, ..., n> assim a entrada: a=b+3 q poderia gerar as tuplas: <id,a> <=, > <id, b> <num, 3> q note que alguns tokens no necessitam atributos adicionais.
q

Anlise Lxica
Reconhece e classifica as palavras (tokens) n Texto de entrada
n
if (x >= y) then y = 42;

Cadeia de Tokens reconhecida:


IF LPAREN THEN ID(x) GEQ ID(y) INT(42) SCOLON

RPAREN

ID(y) ASSIGN

Elimina Tabulaes, comentrios, etc.

Anlise Lxica
A declarao C seguinte; int k = 123; q Possui vrias subcadeias: q int o lexema para um token tipo palavrareservada. q = o lexema para um token tipo operador. q k o lexema para um token tipo identificador. q 123 o lexema para um token tipo nmero literal cujo atributo valor 123. q ; o lexema para um token tipo pontuao.
q

Anlise Lxica
Quais os tokens que podem ser reconhecidos em uma linguagem de programao como C ? palavras reservadas identificadores operadores relacionais operadores aritmticos operadores lgicos operador de atribuio delimitadores caracteres especiais if else while do < > <= >= == != + * / && || & | ! = ;, ()[]{}

Anlise Lxica
Quais os tokens que podem ser reconhecidos em uma linguagem de marcao como HTML ? Tags Comentrios Contedos Especiais <html> <body> <table>... <!-- ... --> Pgina de teste &eaccute;

Anlise Lxica

Lexemas podem ter atributos como nmero da linha em que se encontra no cdigo fonte e o valor de uma constante numrica ou um literal. Normalmente utiliza-se um nico atributo que um apontador para a Tabela de Smbolos que armazena essas informaes em registros.

Anlise Lxica
O analisador lxico simplesmente varre a entrada (arquivo fonte) em busca de padres pertencentes a uma linguagem. A nica possibilidade de ocorrer erro aparecer um caracter que no pertence ao alfabeto da linguagem. Na ocorrncia de um erro existem duas possibilidades, ou o projetista realmente esqueceu de incluir o caracter no alfabeto ou realmente o usurio utilizou algum caracter que no pertence ao alfabeto da linguagem.

Anlise Lxica
Na ocorrncia de erros o analisador lxico pode parar ou entrar em lao infinito. A modalidade de pnico pode ser usada para recuperar erros lxicos ignorando os caracteres invlidos at encontrar algum que pertena ao alfabeto ou o fim do arquivo. Outras formas de recuperar erros: 1. remover caracteres estranhos 2. inserir caracteres que faltam 3. substituir caracteres incorretos por corretos 4. trocar dois caracteres adjacentes

Bufferizao
Trata de tcnicas para percorrer arquivos de entrada quando estes forem muito grandes e no houver memria suficiente. Quando a memria for suficiente o arquivo pode ser aberto e percorrido diretamente. Normalmente utiliza-se um esquema de pares de buffers.

Bufferizao
Em alguns momentos pode ser necessrio que o analisador lxico precise examinar alguns caracteres a frente de um token antes de o reconhecer. O movimento para frente e para trs no arquivo fonte pode consumir um certo tempo. Para tornar o analisador lxico mais rpido podem ser utilizados buffers em memria principal.

Bufferizao
q

muito conveniente que a entrada seja buferizada, i.e., que a leitura da entrada seja fisicamente efetuada em blocos enquanto que logicamente o analisador lxico consome apenas um caractere por vez. A buferizao facilita os procedimentos de devoluo de caracteres.

Erros lxicos
Poucos erros podem ser detectados durante a anlise lxica dada a viso restrita desta fase, como mostra o exemplo: fi(a== f(x)) outro_and; q fi a palavra chave if grafada incorretamente? q fi um identificador de funo que no foi declarada faltando assim um separador (;) entre a chamada da funo fi e o comando seguinte (outro_and)?
q

Erros lxicos
Ainda assim o analisador lxico pode no conseguir prosseguir dado que a cadeia encontrada no se enquadra em nenhum dos padres conhecidos. q Para permitir que o trabalho desta fase prossiga mesmo com a ocorrncia de erros deve ser implementada uma estratgia de recuperao de erros.
q

Recuperao de erros lxicos


q

Aes possveis:
(1) remoo de sucessivos caracteres at o reconhecimento de um token vlido (modalidade pnico). (2) insero de um caractere ausente. (3) substituio de um caractere incorreto por outro correto. (4) transposio de caracteres adjacentes.

Recuperao de erros lxicos


q

Tais estratgias poderiam ser aplicadas dentro de um escopo limitado(denominado erros de distncia mnima).
While (a<100) {fi(a==b) break else a++;} ...

Estas transformaes seriam computadas na tentativa de obteno de um programa sintaticamente correto (o que no significa um programa correto, da o limitado nmero de compiladores experimentais que usam tais tcnicas).

Especificao de Tokens
Tokens so padres que podem ser especificados atravs de expresses regulares. Um alfabeto determina o conjunto de caracteres vlidos para a formao de cadeias, sentenas ou palavras. Cadeias so seqncias finitas de caracteres. Algumas operaes podem ser aplicadas a alfabetos para ajudar na definio de cadeias: concatenao, unio e fechamento.

Especificao de Tokens
Concatenao L.M = {st | s pertence a L e t pertence a M} Unio L U M= {s | s pertence a L ou a M} Fecho L*= U Li, i= 0... Fecho Positivo L+= U Li, i= 1...

Especificao de Tokens
As regras para definir expresses regulares sobre um alfabeto so: 1. a expresso regular para a cadeia vazia 2. a a expresso regular para um smbolo do alfabeto {a} 3. se a e b so expresses regulares, tambm so expresses regulares: a) a|b b) a.b c) a* d) a+

Especificao de Tokens
Expresses regulares podem receber um nome (definio regular), formando o token de um analisador lxico. Algumas convenes podem facilitar a formao de definies regulares 1. Uma ou mais ocorrncia (+) 2. Zero ou mais ocorrncias (*) 3. Zero ou uma ocorrncia (?) 4. Classe de caracteres [a-z]= a|b|...|z

Especificao de Tokens
So definies regulares letra [A-Z]|[a-z] dgito [09] dgitos dgito dgito* identificador letra[letra|dgito]* frao_opc .dgitos| exp_opc E[+|-|]dgitos| num dgitos frao_opc exp_opc delim branco|tabulao|avano de linha

Reconhecimento de Tokens
Tokens podem ser reconhecidos atravs de autmatos finitos onde o estado final dispara o reconhecimento de um token especfico e/ou um procedimento especfico (inserir na tabela de smbolo, por exemplo). Normalmente cria-se um diagrama de transio para representar o reconhecimento de tokens.

Reconhecimento de Tokens
Como so reconhecidos os identificadores e as palavras reservadas ? Como um compilador sabe o que uma palavra reservada ? H linguagens que permitem usar palavras reservadas como identificadores. Normalmente isto no acontece, mas o reconhecimento de identificadores e palavras reservadas idntico. a tabela de smbolos que trata de identificar as palavras reservadas.

Reconhecimento de Tokens
Em geral a tabela de smbolos inicializada com o registro as palavras reservadas da linguagem. O compilador sempre insere identificadores na tabela de smbolos ? Isto necessrio ? No, os identificadores so armazenados apenas uma vez, mas seus atributos podem ser alterados ao longo da anlise de um programa. int a; a= 10;

Projeto de Analisador Lxico


1. Definir o alfabeto 2. Listar os tokens necessrios 3. Especificar os tokens por meio de definies regulares 4. Montar os autmatos para reconhecer os tokens 5. Implementar o analisador lxico

Projeto de Analisador Lxico

EXERCCIO Projetar um analisador lxico para uma calculadora simples com nmeros naturais e reais e operaes bsicas (soma, subtrao, multiplicao e diviso)

Enfoques de Implementao
q

Existem 3 enfoques bsicos para construo de um analisador lxico:


Utilizar um gerador automtico de analisadores lxicos (tal como o compilador LEX, que gera um analisador a partir de uma especificao). lEscrever um analisador lxico usando uma linguagem de programao convencional que disponha de certas facilidades de E/S. lEscrever um analisador lxico usando linguagem de montagem.
l

Enfoques de Implementao
As alternativas de enfoque esto listadas em ordem crescente de complexidade e (infelizmente). q A construo via geradores praticamente adequada quando o problema no esbarra em questes de eficincia e flexibilidade, q A construo manual uma alternativa atraente quando a linguagem a ser tratada no for por demais complexa.
q

Projeto de Analisador Lxico


Exemplo - seja a cadeia 3.2 + (2 * 12.01), o analisador lxico teria como sada: 3.2 => nmero real + => operador de soma ( => abre parnteses 2 => nmero natural * => operador de multiplicao 12.01 => nmero real

Projeto de Analisador Lxico


Que smbolo usar como separador de casas decimais? A calculadora usa representao monetria? A calculadora aceita espaos entre os operandos e operadores? O projetista quem decide sobre as caractersticas desejveis do compilador ou interpretador. Para a maioria das linguagens de programao existem algumas convenes que devem ser respeitadas.

1. Definio do Alfabeto = {0,1,2,3,4,5,6,7,8,9,.,(,),+,-,*,/,\b} OBS.: projetista deve considerar TODOS os smbolos que so necessrios para formar os padres

2. Listagem dos tokens OPSOMA: operador de soma OPSUB: operador de subtrao OPMUL: operador de multiplicao OPDIV: operador de diviso AP: abre parnteses FP: fecha parnteses NUM: nmero natural/real OBS.: projetista deve considerar tokens especiais e cuidar para que cada token seja uma unidade significativa para o problema

3. Especificao dos tokens com definies regulares OPSOMA + OPSUB OPMUL * OPDIV / AP ( FP ) NUM [0-9]+.?[0-9]* OBS.: cuidar para que as definies regulares reconheam padres claros, bem formados e definidos

4. Montar os autmatos para reconhecer cada token

OBS.: os autmatos reconhecem tokens individuais, mas o conjunto dos autmatos em um nico autmato no-deterministico que determina o analisador lxico de um compilador, por isto, deve ser utilizada uma numerao crescente para os estados.

5. Implementar o analisador lxico Existem duas formas bsicas para implementar os autmatos: usando a tabela de transio de estados ou diretamente em cdigo Qual a mais eficiente? Por que ?

ESTILO DE IMPLEMENTAO DO LXICO


"

"

"

Cada token listado codificado em um nmero natural Deve haver uma varivel para controlar o estado corrente do autmato e outro para indicar o estado de partida do autmato em uso Uma funo falhar usada para desviar o estado corrente para um outro autmato no caso de um estado no reconhecer uma letra

ESTILO DE IMPLEMENTAO DO LXICO Cada estado analisado individualmente em uma estrutura do tipo switchcase
letra 0 1 - letra - digito 2 Reconhece ID letra dgito

ESTILO DE IMPLEMENTAO DO LXICO Cada estado analisado individualmente em uma estrutura do tipo switchcase
int lexico() { while (1) { switch (estado) { case 0: c= proximo_caracter(); if (isalpha(c)) { estado= 1; adiante++; } else { falhar(); } break; } }

letra 0

ESTILO DE IMPLEMENTAO DO LXICO Estado 1: iterao sobre letras ou dgitos


- letra - digito
1 case 1: c= proximo_caracter(); if (isalpha(c) || isdigit(c)) { estado= 1; adiante++; } letra else { dgito if ((c == \n) || (c == \t) || (c == \b)) estado= 2; else falhar(); } break; } }

ESTILO DE IMPLEMENTAO DO LXICO Estado de aceitao: reconhecimento de um identificador

case 2: estado= 0; partida= 0; return ID; break; } }

2 Reconhece ID

You might also like