Você está na página 1de 43

Analisador Lxico

Analisador Lxico
Fabiano Rodrigues
Farley J. R. Oliveira 051.649-1
Michel Sato
Vitor Lins Vieira 052.696-7

Analisador Lxico
A anlise lxica a primeira fase do
compilador. A funo do analisador lxico,
tambm denominado scanner, ler o cdigo
fonte, caracter a caracter, buscando a
separao e identificao dos elementos
componentes do programa fonte,
denominados smbolos lxicos ou tokens.
Analisador Lxico
tambm de responsabilidade desta fase a
eliminao de elementos "decorativos" do
programa, tais como espaos em branco,
marcas de formatao de texto e comentrios.
Tokens
A criao dos smbolos (tokens) importante,
pois torna a prxima etapa de um compilador
(anlise sinttica, ou parsing) mais simples.
Etapas
Na anlise lxica podemos destacar trs
etapas:
Extrao e classificao dos tokens
Eliminao de delimitadores e comentrios
Recuperao de erros
Tokens
O objetivo principal da anlise lxica
identificar sequncias de caracteres que
constituem unidades lxicas ("tokens"). O
analisador lxico l, caractere a caractere, o
texto fonte, verificando se os caracteres lidos
pertencem ao alfabeto da linguagem,
identificando tokens, e desprezando
comentrios e brancos desnecessrios.
Tokens
Tokens so smbolos tais como palavras
reservadas, delimitadores, identificadores, etc.
Os tokens (smbolos lxicos) so unidades
bsicas de texto do programa. Eles so
representados internamente por trs
informaes: classe do token, valor do token e
posio do token.
Recuperao de Erros
Aes possveis:
Remoo de sucessivos caracteres at o
reconhecimento de um token vlido
(modalidade Pnico).
Insero de um caractere ausente.
Substituio de um caractere incorreto por
outro correto.
Transposio de caracteres adjacentes.
Exemplo
Exemplo: sum=3+2; token type
sum IDENT
= ASSIGN_OP
3 NUMBER
+ ADD_OP
2 NUMBER
; SEMICOLON
Exemplo de comando
Comando em Java:
if (i== j)
z = 0; /* No work needed */
else
z= 1;
Como o analisador lxico v os comandos:
\tif(i== j)\n\t\tz = 0; /* No work needed */\n\telse\n\t\tz= 1;
Formao de Tokens & Expresses
Regulares
Analisador efetua sucessivas verificaes de caracteres at
encontrar um caracter de estado morto, como espao,
parnteses, ponto-e-vrgula
Retorna ultima anlise vlida para extrair um lexeme
Um lexeme classificado se torna um token
O reconhecimento de um token feito atravs de expresses
regulares
Scanner
Aps a definio dos tokens, o scanner, uma funo do
analisador lxico, converte isto:

\tif(i== j)\n\t\tz = 0; /* No work needed */\n\telse\n\t\tz= 1;

Nisto:
IF, LPAR, ID("i"), EQUALS, ID("j"), RPAR, ID("z"), ASSIGN,
INTLIT(""), SEMI, ELSE, ID("z"), ASSIGN, INTLIT(""), SEMI

que a expresso a ser enviada ao analisador sinttico
Classe de Scanner
Exemplo de classe para um scanner em Java

class Token {
enum SyntacticCategory {
IF, LPAR, ID, EQUALS, RPAR, ASSIGN, ...
};
SyntacticCategory syntax;
Object value;
Location sourcePosition;
...
}
Classe de Scanner
Exemplo de classe para um scanner em Java

class Token {
enum SyntacticCategory {
IF, LPAR, ID, EQUALS, RPAR, ASSIGN, ...
};
SyntacticCategory syntax;
Object value;
Location sourcePosition;
...
}
Geradores de Analisadores Lxicos
FLEX
OOLEX
LEX / FLEX
LEX uma ferramenta para a gerao
automtica de analisadores lxicos
Verso Free: FLEX (Fast LEX)
Desenvolvido em 1975 em conjunto com o
YACC (Yet another compiler-compiler), por
Mike Lesk & Eric Schmidt. No Bell Laboratories
LEX / FLEX
Free Software Foundation GNU FLEX:
Implementao mais rpida do FLEX (e
gratuita!!)
O gcc (GNU C Compiler) foi desenvolvido com
LEX & YACC.
LEX: dividir as entradas em unidades
coerentes (tokens)
YACC: descobrir o relacionamento entre os
tokens. (anlise sinttica)
LEX / FLEX
Objetivos: desenvolvida para programadores
de compiladores e interpretadores; porm
podem ser usadas tambm em deteco de
padres em arquivos de dados, linguagem de
comandos, etc..
Vantagem: Rpido desenvolvimento de
prottipos e manuteno simples do software.
LEX / FLEX
Papel do LEX: toma um conjunto de descries
de possveis tokens e produz uma rotina em C
que ir identificar estes tokens
Papel do Yacc: toma uma descrio concisa de
uma gramtica e produz uma rotina em C que
ir executar a anlise sinttica ou parsing.
NOTA: um analisador lxico desenvolvido
usando Lex quase sempre mais rpido do
que um analisador lxico escrito diretamente
em C.
LEX / FLEX
LEX / FLEX
Encontra-se em qualquer sistema Unix e pode
ser chamada usando os comandos lex ou flex;
Transforma um arquivo contendo expresses
regulares em um programa C que reconhece
os padres descritos no arquivo
O Flex l os arquivos de entrada (arquivo de
definio), obtendo assim a descrio do
scanner a ser gerado. Esse arquivo definido
usando a linguagem lex
LEX / FLEX
LEX / FLEX
Um arquivo de descrio Flex dividido em trs sees
separadas por %% :
DEFINICOES
%%: Contm declaraes de variveis, constantes e definies
regulares;
REGRAS
%%: Contm definies de rotinas em C que so chamadas
quando uma expresso reconhecida
CODIGO
Contm o main (incio de procedure em C) e descreve como o
analisador lxico deve ser utilizado
LEX / FLEX
SEO DE DEFINIES:

opcional (pode ser vazia)

Contm definies lxicas, e a declarao e inicializao de variveis
globais

Uma definio lxica possui a forma NOME DEFINIO

As definies so expresses regulares que reconhecem tokens do texto
fonte.

Seu contedo ser copiado no incio do arquivo C gerado na sada.
LEX / FLEX
SEO DE DEFINIES:
LEX define por padro as variaveis globais:
yytext (lexema corrente) e yyleng (tamanho do lexema)
Definies de macros:
digito [01]+ /* substituir {digito} por [01]+ ao processar as regras */
frac .[0-9]+ /* substituir {frac} por .[0-9]+ ao processar as reg
nl \n /* substituir {nl} por \n ao processar as regras */ras */

A incluso das linhas de comando em C devem ser delimitadas por <%{> e
<%}>, como:
%{
#include <y.tab.h>
extern int yylval;
%}
LEX / FLEX
SEO DE REGRAS:

Define a funcionalidade do analisador lxico. Cada regra compreende uma
seqncia valida de caracteres (literais/expresses regulares) .

Definido da seguinte forma:
token {AO}

A ao pode ser nula { } ou conter um ou mais comandos em linguagem
C.
LEX / FLEX
SEO DE REGRAS:

Ao chamar a funo yylex(), passando o token e seu tamanho, o
analisador executar a AO associada quela token;

Retornar o prprio token caso seja reconhecido pelo analisador lxico;
Retornar brancos caso nenhuma ao seja tomada, ou caso seja
encontrados espaos em branco;

{ printf( isso ai\n);} a ao que consiste em imprimir uma
mensagem na tela.
LEX / FLEX
SEO DE CODIGOS / PROCEDIMENTOS ADICIONAIS:

Opcional (pode ser vazia)

Possui o cdigo C definido pelo programador (funo main() , que deve
chamar a funo yylex()

Qualquer cdigo C nessa seo ser copiado diretamente no arquivo
produzido pelo Lex.

Pode definir cdigo para as aes complexas usadas na seo anterior.
LEX / FLEX
UTILIZAO DO COMPONENTE GERADO

O LEX acoplado ao YACC, que efetua a analise sinttica. uma
ferramenta similar e complementar ao LEX.

O LEX gera a funo yylex() , que retorna o identificador de um item lxico
reconhecido.

O YACC funciona de forma a chamar o yylex() do LEX;

O YACC gera a funo yyparse() , que analisa os itens lxicos e decide se
ele formam ou no uma sentena vlida.
Analisador Lxico


OOLEX
OOLEX
OOLEX (object-oriented lexer) estritamente
baseada no paradigma de orientao a
objetos.

Tese de doutorado de Bernd Khl and Axel-
Tobias Schreiner em Cincias da Computao
na Universidade de Osnabrck, Alemanha
OOLEX
OOLEX pode ser estendido sem acesso para o
cdigo fonte: smbolo recognizer pode ser
obtido por herana e um scanner de execuo
pode ser reconfigurado para diferentes
contextos.

OOLEX no precisa ser baseado em um
autmato finito e, portanto, ele pode
reconhecer smbolos que sistemas como o flex
no reconhece diretamente.
OOLEX
OOLEX usado para prototipagem rpida: a
maioria dos identificadores existentes podem
ser representados como expresses regulares
para o JLex baseados em Java.

OOLEX oferece muitas vantagens sobre
Scanners de Expresses Regulares scanners

OOLEX tem um desempenho pior justificado
pela flexibilidade, um ciclo de
desenvolvimento mais curtos e mais
funcionalidades.
OOLEX
OOLEX pode compilar uma expresso regular
em uma rvore de objetos recognizers

OOLEX muito mais fcil de usar, porque j
existe uma biblioteca de recognizers para os
smbolos mais comuns

OOLEX em sua prpria classe quando se trata
de anlise lxica

LOLO
Analisador Lxico
LOLO
LOLO (language-oriented lexer objects)
estritamente baseada no paradigma de
orientao a objetos.

Continuao da tese de doutorado de Bernd
Khl and Axel-Tobias Schreiner em Cincias da
Computao na Universidade de Osnabrck,
Alemanha
LOLO
No necessita de autmato finito
Modelagem de estados, transies e aes

Reconhece diretamente smbolos que
sistemas como FLEX no
LOLO
No necessita de autmato finito
Modelagem de estados, transies e aes

Reconhece smbolos que sistemas como flex
no conseguiriam diretamente
LOLO
Baseia-se na competio de objetos

Que buscam reconhecer um nico smbolo
LOLO
Um input entra numa "sala" repleta de
objetos
Caractere a caractere verificado por cada
objeto, que caso no reconhea retirado da
sala
O ltimo objeto a sair o ganhador
Reconheceu a maior sequncia de caracteres
LOLO
Principal desvantagem a performance

Cerca de 3 vezes mais lento em comparao
ao Flex
Analisador Lxico


FIM

Você também pode gostar