flex – uma ferramenta de análise léxica
TRANSCRIPT
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.
ObjetivoO 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 ScaneamentoUm 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 FlexAo 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 CAqui 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 CaracteresCada 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 ExemplosExpresso 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 ExemplosProblema: 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.