Você está na página 1de 11

Anlise Lxica

A funo da anlise lxica fazer a leitura do programa fonte, ignorando os espaos e as tabulaes, esta leitura feita caractere por caractere e traduz o fluxo de carcateres para uma sequncia de elementos lxicos chamados de tokens. Os tokens so classificados conforme categorias de interesse para a linguagem e, finalmente, o Analisador Lxico deve gerar, tambm, a lista de smbolos.
Categorias mais comumente utilizadas para classificar os Tokens: 1. Identificadores a. Variveis letra, letra nmero saldo, qtd, x21 b. Funes e Procedimentos calcular, somar c. Palavras Reservadas if, while, ... 2. Constantes a. Numricas Inteira 573, A Real 54.32 b. Literais A Alo Mundo 3. Operadores a. Aritmticos - +, -, *, / b. Lgicos - &&, ||, ! c. Relacionais - <,<=, >,>= 4. Pontuao ;,. 5. Delimitadores {}()[]

O Analisador lxico v o programa fonte como um fluxo de caracteres e produz uma seqncia de tokens. O analisador sinttico, por outro lado, encara o programa fonte como sendo a lista de tokens anteriormente produzida.

Projeto Formal do Analisador Lxico


O Analisdor Lxico, em geral, reconhece e classifica os tokes atravs das liguagens regulares
Linguagem: Conjunto de palavras formadas por smbolos de um determinado alfabeto. Os tokens de uma linguagem de programao constituem uma linguagem regular. Linguagem Regular: aquela que pode ser descrita por uma gramtica regular.

funo da anlise lxica suprimir os espaos em branco entre os tokens e os comentrios. Gramtica Regular
Gramtica Regular: um mecanismo para gerar sentenas (ou palavras) de uma linguagem. Uma gramtica compem-se de 4 elementos e deve ser formalizada da seguinte forma: G = (N,T,P,S) N um conjunto de smbolos no-terminais, ou V Variveis T um conjunto de smbolos terminais P o conjunto de regras de produo S o smbolo inicial da gramtica. Exemplo: Representao de um identificador N = { A , B } T = { l, d } P = { A B B B

l B, l B, d B

} S= A l qualquer letra d qualquer dgito Derivaes qtd12

A q B q t B q t d B q t d 1 B q t d 1 2 B q t d 1 2

Obs.: o caractere d nesta produo um caractere curinga representando um dgito numrico qualquer, para que no seja ncessrio representar cada produo de cada dgito. Imagine no caso das letras com seria necessrio representar inmeras produes.
B d B

equivale a
B B B B B B B B B B 0 1 2 3 4 5 6 7 8 9 B, B, B, B, B, B, B, B, B, B,

A gramtica regular somente possui produo na forma:


A wB A w ou A Bw A w

A e B pertencem ao conjunto N N = { A , B } e w pertence a T* T = { l, d } significando * zero ou mais repeties

T = { 0..9, a...z, A..Z }

T* = { , 0, 1, 2 , 00, 000, 0000, 01, 11, 10, a, aa, aaa, ab, 0a, 0b . }

No regulares A AB AaA a

regular AB A abcd AaB A abcdA

No regular AB A abcd A Ba A abcdA Regular AB A abcd A Ba A Aabcd

Expresso Regular

Representa uma linguagem que pode ser definida indutivamente a partir de expresses bsicas:
1 Linguagem vazia. 2 { } Linguagem cuja nica palavra a cadeia vazia. 3 * Zero ou mais concatenaes dos elementos. 4 | Alternativa de escolher entre os elementos adjacentes.

5 + Uma ou mais concatenao dos elementos. 6 [ ] Opcional

Exemplo1: Representao de um identificador l (l | d)*

l qualquer letra d qualquer dgito

Exemplo2: Representao de um analisador lxico rudimentar ( l (l | d)* ) saldo qtd21 45 32 6465756.23 2.456798 | ( d+ [ .d+ ] )

Autmatos Finitos

Exemplo1: Representao de um identificador

Exemplo2: Representao do AFD de um analisador lxico rudimentar

SALDO 423 32.56 43.48768767686

Convertendo um AFND em um AFD


1. Fechamento- (S)

Conjunto de todos os estados atingveis a partir de um estado S, somente atravs de transies .


2. Fechamento- (T) Conjunto de estados atingveis a partir de algum estado S pertencente ao conjunto T 3. Movimento (T,a)

Conjunto de estados para o qual existe uma transio no smbolo de entrada a, a partir de algum estado S pertencente a T.
1 passo: Fechamento - e(0) onde 0 o estado inicial. 2 passo: Calcular o movimento no conjunto gerado anteriormente (em todos os smbolos). 3 passo: Realizar o fechamento dos conjuntos gerados pelo movimento. 4 passo: Repetir o 2 passo para cada novo conjunto gerado.

Exemplo de Converso
Dado o AFND que reconhece como par o valor numrico representado por uma cadeia de bits

00010 Observe como improdutivo tentar verificar o reconhecimento desta cadeia de bits, bita-bit transitando entre os estados. Toda vez que analisamos o bit 0 no estado A no temos a certeza do destino a ser atingido. 1 passo: fechamento- (A): a estado inicial {A} = Q 2 passo: movimento (Q,0) = {A,B} = fechamento-( {A,B} ) = {A,B} = R 3 passo: movimento (Q,1) = {A} = fechamento-( {A} ) = {A} = Q 4 passo: movimento (R,0) = {A,B} = fechamento- ({A,B}) = {A,B} = R 5 passo: movimento (R,1) = {A} = fechamento e ({A}) = {A} = Q AFD Resultante

00010 Observe como produtivo verificar o reconhecimento desta cadeia de bits, bit-abit transitando entre os estados. Toda vez que analisamos qualquer bit da cadeia sabemos exatamente para qual estado transitar. 00010 | Prox Q corresponde ao 1 e o estado R corresponde a 2

int AFD( char * entrada ) { int estdo = 1; prox = entrada[i]; while ( 1 ) { swhtch ( estado ) { case 1: // Q swhtch ( prox ) { case 0: estado = 2; break; case 1: estado = 1; break; case \0 : // printf (ERRO, fim de cadeia inesperado %c, prox ); return -1 ; break; default: // printf (ERRO, caractere invlido %c, prox ); return 0; }

case 2:

// R

swhtch ( prox ) { case 0: estado = 2; break; case 1: estado = 1;

break; case \0 : // printf (a cadeia de bites par ); return 2 ; break; default: // printf (ERRO, caractere invlido %c, prox ); return 0; } } i++; prox = entrada[i]; }

Exerccios
1 Faa um programa capaz de reconhecer e classificar os tokens descritos pelo autmato abaixo. Usando o esquema AFND AFD Programa. A cedeia de entrada deve ser obtida de um arquivo texto com apenas um token na primeira linha

Segue, abaixo, tres amostras de contedo do arquivo texto de entrada --------------------------------------------------------------------------------------saldo Identificador --------------------------------------------------------------------------------------6565 Constante Numrica Inteira --------------------------------------------------------------------------------------23.567 Constante Numrica Real