Você está na página 1de 17

Anlise Lxica

Prof. Salvador Ramos


sramosbs@gmail.com

Gerador de analisador lxico


Auxilia na construo de analisadores Lxicos.
Utiliza expresses regulares para descrever tokens.
Permite a combinao da identificao de padres com
execuo de aes.
Um dos mais conhecidos:
Lex, verso para CC (Unix)
Flex, verso atualizada do Lex

Origem
O YACC foi um dos primeiros analisadores
sintticos, escrito entre 1975 e 1978.
Esse nome vem de yet another compiler
compiler, sugerindo que outras pessoas estavam
escrevendo parsers na mesma poca.
Na dcada de 1980 o yacc sofreu atualizaes,
foram implementadas diversas caractersticas
adicionais que resultou na verso corrente do
BISON, distribudo sob a Licena Pblica GNU.

Origem
Em 1975 surgiu o Lex, um gerador de analisador lxico.
Lex tornou-se rapidamente popular, a despeito de ser
relativamente lento e apresentar bugs.
O Lex foi feito, originalmente, em ratfor, uma extenso do
FORTRAN, popular na poca.
Em 1987 foi reescrito em C e chamado de Flex, de Fast
Lexical Analizer Generator.
Atualmente um projeto da SouceForge, ainda sob licena da
Berkeley.

Passos para a gerao do analisador:


Um programa escrito em Lex submetido ao
compilador.
O compilador Lex gera o arquivo lex.yy.c
Esse arquivo de sada pode ser utilizado como
entrada para o gerador de parser, ou compilado e
usado como reconhecedor

Introduo ao FLEX

Um programa lex constitudo de 3 partes:


%{ declaraes
Contm declaraes de variveis , includes e constantes
Cdigo nesta seo diretamente copiado para cdigo na linguagem alvo

}%
/* Definies regulares */
Expresses regulares que definem os padres a serem reconhecidos

%% regras de traduo
Formato
p1 {ao}
... ....
pn {ao}
onde, pi uma expresso regular e cada ao um fragmento de
programa descrevendo a ao a ser tomada quando o padro for
reconhecido

%%
Procedimentos auxiliares
Contm procedimentos que sejam necessrios para execuo das aes.
Cdigo nesta seo diretamente copiado para cdigo na linguagem alvo

Declaraes C
Nessa seo podem constar declaraes de
funes, declaraes de variveis, #includes, etc.
Exemplos:
#include <string.h>
char *arquivo de saida
int linha = 0;
struct {int a;
float b;}

Definies regulares
A definio de um scanner FLEX usa uma rica
linguagem de expresses regulares.
Caracteres com significado especial em expresses
regulares:
. Casa com um caractere simples, exceto nova linha (\n).
Ex: . {caractere++;}
[ ] uma classe de caracteres que casa com qualquer
caractere entre colchetes.
Exemplo: letra [a-z] o hfen indica intervalo, ou
seja, qualquer letra no intervalo entre a e z.

Definies regulares (cont)


[^ex] uma cadeia exceto a cadeia ex.
[a-z]{-}[jv] omite a cadeia jv.
^

Casa o incio de uma linha com o primeiro caractere de


uma expresso regular.

Casa o fim da linha como o ltimo caractere de uma


ER.

{ } dois nmeros entre chaves indica o nmero mnimo e


mximo de vezes que o padro anterior casa.
Ex. A{1-3} casa de uma a trs ocorrncias de A
0{5} CASA COM 00000
{NOME} refere-se a um padro nomeado por NOME

Definies regulares (cont)


\
escape metacaracteres.
\n nova linha
\* - o literal asterisco
*
Zero ou mais ocorrncias da expresso
precedente.
+
Uma ou mais ocorrncia da expresso
precedente.
|
Operador de alternativa

Exemplos de definies regulares

letra [A-Za-z]
digito [0-9]
id
{letra}({letra}|{digito})*

Regra de traduo
Diz o que fazer quando encontra um padro
especificado nas definies regulares.
Exemplo:
leia
{numero}

{printf("< %s, %s>\n",RES,yytext);}


{printf("< %s, %s>\n",NUM,yytext);}

Exemplo

Construir um analisador lxico para reconhecer


identificadores, nmeros e as palavras reservadas if, then,
else.
Primeira parte do arquivo:
%{
#define ID
"Ientificador "
#define NUM "Numero"
#define RES "Reservada
%}
/*definies regulares*/
ws
[" "\t\n]
letra
[A-Za-z]
digito
[0-9]
id
{letra}({letra}|{digito})*
numero {digito}+(\.{digito}+)?(E[+\-]?{digito}+)?

Regras de traduo

%%
{ws}
if
then
else
{id}
{numero}
%%

{}
{printf("< %s, %s>\n",RES,yytext);}
{printf("< %s, %s>\n",RES,yytext);}
{printf("< %s, %s>\n",RES,yytext);}
{printf("< %s, %s>\n",ID,yytext);}
{printf("< %s, %s>\n",NUM,yytext);}

Procedimentos auxiliares
int main( )
{
yylex();

Exerccio
a) escolher 3 comandos da linguagem criada por voc;
b) Fazer um programa FLEX para receber uma entrada
pelo teclado, uma linha de programa na sua linguagem
com qualquer um dos comandos escolhidos e retornar
os tokens dessa entrada:
operador lgico: op log + operador encontrado
operador matemtico: op mat + operador
Palavra reservada: Reservada + token (as palavras
correspondentes aos comandos escolhidos).
Nmero: numero + token.
identificador

Entregar: arquivo flex. Programa lex.yy.exe - ok = 1,0


ponto
Data de entrega: 05/04. Entrega posterior no ser
pontuada.

Você também pode gostar