Академический Документы
Профессиональный Документы
Культура Документы
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:
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.
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
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 { }.
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 $
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
c* O caracter c repetido zero ou mais vezes c+ O caracter c repetido uma ou mais vezes
c{#} O caractere c repete-se exatamente # vezes c{#,} O caractere c repete-se # ou mais vezes ({0,}=*, {1,}=+)
(r) Agrupamento de expresses (e.g.: para fazer com que uma repetio se aplique a mais do que um caractere)
r|s ou
Observao!
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.