Você está na página 1de 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 emum 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.
q Tal conjunto de cadeias descrito por uma regra
denominada padro, associada a tais tokens.
q 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
q 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.
Anlise Lxica
n Reconhece e classifica as palavras (tokens)
n Texto de entrada
if (x >= y) then
y = 42;
n Cadeia de Tokens reconhecida:
n Elimina Tabulaes, comentrios, etc.
IF LPAREN ID(x) GEQ ID(y)
RPAREN ID(y) ASSIGN INT(42) SCOLON THEN
Anlise Lxica
q A declarao C seguinte;
int k = 123;
q Possui vrias subcadeias:
q int o lexema para um token tipo palavra-
reservada.
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.
Anlise Lxica
Quais os tokens que podem ser reconhecidos em
uma linguagem de programao como C ?
palavras reservadas if else while do
identificadores
operadores relacionais < > <= >= == !=
operadores aritmticos + * / -
operadores lgicos && || & | !
operador de atribuio =
delimitadores ; ,
caracteres especiais ( ) [ ] { }
Anlise Lxica
Quais os tokens que podem ser reconhecidos em
uma linguagem de marcao como HTML ?
Tags <html> <body> <table>...
Comentrios <!-- ... -->
Contedos Pgina de teste
Especiais &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.
qA buferizao facilita os procedimentos de
devoluo de caracteres.
Erros lxicos
qPoucos 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)?
Erros lxicos
qAinda assim o analisador lxico pode no
conseguir prosseguir dado que a cadeia
encontrada no se enquadra em nenhum dos
padres conhecidos.
qPara permitir que o trabalho desta fase
prossiga mesmo com a ocorrncia de erros
deve ser implementada uma estratgia de
recuperao de erros.
Recuperao de erros lxicos
qAes 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
qTais estratgias poderiam ser aplicadas
dentro de um escopo limitado(denominado
erros de distncia mnima).
While (a<100) {fi(a==b) break else a++;} ...
q 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 podemser 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 podemser alterados
ao longo da anlise de um programa.
int a;
a= 10;
Projeto de Analisador Lxico
1. Definir o alfabeto
2. Listar os tokensnecessrios
3. Especificar os tokenspor 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
qExistem 3 enfoques bsicos para construo
de um analisador lxico:
lUtilizar 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.
Enfoques de Implementao
qAs alternativas de enfoque esto listadas em
ordem crescente de complexidade e
(infelizmente).
qA construo via geradores praticamente
adequada quando o problema no esbarra em
questes de eficincia e flexibilidade,
qA construo manual uma alternativa
atraente quando a linguagem a ser tratada no
for por demais complexa.
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. Listagemdos 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 tokensespeciais e
cuidar para que cada tokenseja uma unidade
significativa para o problema
3. Especificao dos tokenscom 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 tokensindividuais,
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
1 0 2
letra
letra
dgito
- letra - digito
Reconhece ID
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;

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

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

}
}
1
letra
dgito
- letra - digito
ESTILO DE IMPLEMENTAO DO LXICO
Estado de aceitao:
reconhecimento de um identificador

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

Você também pode gostar