Вы находитесь на странице: 1из 28

Flex Uma ferramenta de Anlise lxica

Definio

O Flex uma ferramenta para a construo de programas que gerenciam estruturas de entrada (87).

O Flex a evoluo do programa Lex (1975). Foi originalmente desenvolvido para a construo de compiladores.

Objetivo
O Flex faz a anlise lxica de um arquivo ou texto de entrada. O scanner divide o texto de entrada em pedaos significativos chamados tokens.

Ex:

alpha = beta + gama ;

Padres de Scaneamento
Um scanner procura por padres de caracteres em uma entrada. Ex:

Constante inteira = uma string de um ou mais dgitos. Varivel nome = uma letra seguida de um ou mais caracteres ou dgitos. Operadores = um ou no mximo 2 caracteres.

Expresses Regulares

A forma de implementar estes padres no Flex atravs das expresses regulares (regexp). O Flex basicamente constitudo de uma seqncia de expresses regulares; e o que fazer quando um padro encontrado (aes).

Vantagem

O Flex transforma todas as expresses regulares em um mecanismo que testa todos os padres simultaneamente.

Atravs da utilizao dos DFAs, o desempenho do scaneamento rpido tanto para o teste de 1 padro ou 100.

Mecanismo do Flex
Ao encontrar uma regra, o flex executa a ao correspondente e reinicia o processo. Redundncia nas regras? :

1. 2.

Maior numero de caracteres. A regra que vier antes (mesma quantidade)

Se nenhuma regra encontrada, repete o caractere digitado e repete o processo.

Primeiro Exemplo
%{ int chars = 0; int words = 0; int lines = 0; %} %% [a-zA-Z]+ \n . %% main(int argc, char **argv) { yylex(); printf("%8d%8d%8d\n", lines, words, chars); } { words++; chars += strlen(yytext); } { chars++; lines++; } { chars++; }

Anlise Detalhada

O smbolo %% divide o scanner em 3 sees:


1. 2. 3.

Opes e declaraes. Lista de padres (regras) e aes. Cdigo C

1 - Declaraes

O cdigo contido entre %{ e %} copiado literalmente para o comeo do cdigo C gerado pelo scanner.
%{ int chars = 0; int words = 0; int lines = 0; %}

%% ...

2 - Padres e Aes

Cada padro desta seo deve estar no comeo da linha e ser seguido do cdigo C da ao, entre chaves { }.

... %% [a-zA-Z]+ \n . %% ... { words++; chars += strlen(yytext); } { chars++; lines++; } { chars++; }

3 Cdigo C
Aqui onde fica o cdigo principal, que inicia todo o processo. A chamada yylex(), chama a rotina de scanner do Flex. Nesta parte tambm possvel definir a origem da entrada de dados.

... %% main(int argc, char **argv) { yylex(); printf("%8d%8d%8d\n", lines, words, chars); }

Compilando...
$ flex teste.l $ cc lex.yy.c -lfl $ ./a.out Contando linhas palavras e caracteres ^D 2 5 37 $

Expresses Regulares Caracteres


Cada caracter "no especial" representase a si mesmo. . (ponto) Representa qualquer caractere (s 1), exceto o fim-de-linha (EOL). [c] Conjuntos (classes de caracteres) representam 1 s caractere;

c pode conter caracteres avulso (sem separadores, e.g.: [abc]) ou gamas (ranges) (e.g.: [a-z]); se o 1 caractere de c for ^, o conjunto todos os caracteres exceto aqueles em c

Expresses Regulares Repeties

c* O caracter c repetido zero ou mais vezes c+ O caracter c repetido uma ou mais vezes

c? Opcional o caracter c zero ou uma vez

Expresses Regulares Repeties

c{#} O caractere c repete-se exatamente # vezes c{#,} O caractere c repete-se # ou mais vezes ({0,}=*, {1,}=+)

c{#1,#2} O caractere c repete-se no mnimo #1 vezes, e no mximo #2 vezes ({0,1} = ?)

Expresses Regulares Agrupamentos

(r) Agrupamento de expresses (e.g.: para fazer com que uma repetio se aplique a mais do que um caractere)
r|s ou

Observao!

Todas as expresses de repetio (*, +, ? e {}) so gananciosas* (greedy).


O ou tambm greedy: avalia as expresses da esquerda para a direita e escolhe a que consumir mais caracteres.

Exemplo

Exemplo

Expresso:

a.a

Match:

Exemplo

Expresso:

[abc]

Match:

Exemplo

Expresso:

[A-Z]

Match:

Exemplo

Expresso:

[a.*a]

Match:

* ganancioso

Exemplo

Expresso:

(a.)*

Match:

Exemplo

Expresso:

a.?

Match:

Mais Exemplos
Expresso para detectar um nmero de PIN (####): [0-9]{4} Expresso simples para detectar um dos 4 nmeros de um nmero IP: [0-9]{1,3} Expresso ingnua para detectar uma string: ["].*["] (as aspas tm de ser representadas como ["]).

Mais Exemplos
Problema: com o texto: var="a"+x+"b"; esta expresso encontra: var="a"+x+"b"; (porque o * ganancioso) Expresso melhorada para detectar uma string: ["][^"]*["] Com o texto: var="a"+x+"b"; esta expresso encontra: var="a"+x+"b"; Perceber que [ana] ana.