Você está na página 1de 3

30/07/13

lex Wikipdia, a enciclopdia livre

lex
Origem: Wikipdia, a enciclopdia livre.

Em cincia da computao (linguagens de programao), lex um programa que gera analisadores lxicos. Ele geralmente usado com o yacc, um gerador de analisador sinttico. Escrito originalmente por Eric Schmidt e Mike Lesk, ele o gerador de analisador lxico padro em diversos sistemas Unix. O lex l um fluxo de entrada especificando um analisador que mapeia expresses regulares em blocos de cdigo, e retorna um cdigo fonte implementando o analisador. Apesar do gerador ser genrico e poder se adequar a diferentes linguagens de programao, atualmente, somente a gerao de cdigo C suportada. Apesar de ser software proprietrio, verses do lex baseadas no cdigo original da AT&T esto disponveis em cdigo aberto, como parte de sistemas como OpenSolaris e Plan 9. Outra verso popular e livre do lex o flex.

ndice
1 Estrutura do arquivo 2 Exemplo de um arquivo lex 3 Relacionamento com yacc 4 Referncias gerais 5 Ver tambm

Estrutura do arquivo
A estrutura de um arquivo lex intencionalmente similar ao de um arquivo yacc. Os arquivos so divididos em trs sees, separadas por linhas que contm somente dois smbolos de porcentagem, como a seguir:
d e f i n i e s % % r e g r a s % % s u b r o t i n a s

Na seo de definies so definidas as macros e so importadas as bibliotecas escritas em C. tambm possvel escrever cdigo C na mesma seo. J a seo de regras associa padres com instrues C, padres escritos na forma de expresses regulares. Quando o analisador lxico identifica algum texto da entrada casando com um padro, ele executa o cdigo C associado. A tentativa do casamento sempre gananciosa, isto , no caso de dois padres distintos casando a mesma entrada, o maior deles ser usado. O maior deles o que consome mais caracteres da entrada. Caso os padres ambguos consumam a mesma quantidade de caracteres, o padro definido antes escolhido. Por fim, a seo de subrotinas contm blocos de cdigo C que sero apenas copiados ao arquivo final. Assume-se que tal cdigo ser invocado a partir das regras da seo de regras. Em programas maiores, mais conveniente separar esse cdigo final noutro arquivo.

Exemplo de um arquivo lex


O seguinte exemplo reconhece inteiros da entrada de dados e os imprime na sada padro.
pt.wikipedia.org/wiki/Lex 1/3

30/07/13

lex Wikipdia, a enciclopdia livre

/ * * *s e od ed e f i n i o* * * / % { #i n c l u d e< s t d i o . h > % } % % / * * *s e od er e g r a s* * * / / *[ 0 9 ] +c a s au m ac a d e i ad eu mo um a i sd g i t o s* / [ 0 9 ] + { / *y y t e x tac a d e i ac o n t e n d oot e x t oc a s a d o .* / p r i n t f ( " I n t e i r o :% s \ n " ,y y t e x t ) ; } . { / *I g n o r ao u t r o sc a r a c t e r e s .* / }

% % / * * *s e od ec d i g oC* * * / i n tm a i n ( v o i d ) { / *e x e c u t aoa n a l i s a d o rl x i c o .* / y y l e x ( ) ; r e t u r n0 ; }

Com a entrada acima, ser feita a converso para um arquivo C. Para a seguinte entrada:
a b c 1 2 3 z . ! & * 2 g h j 6

O programa imprimir:
I n t e i r o :1 2 3 I n t e i r o :2 I n t e i r o :6

Relacionamento com yacc


O lex e o gerador de analisador sinttico yacc so geralmente usados em conjunto. O Yacc usa uma gramtica formal para analisar sintaticamente uma entrada, algo que o lex no consegue fazer somente com expresses regulares (o lex limitado a simples mquinas de estado finito). Entretanto, o yacc no consegue ler a partir duma simples entrada de dados, ele requer uma srie de tokens, que so geralmente fornecidos pelo lex. O lex age como um pr-processador do yacc. Segue abaixo dois diagramas do relacionamento entre lex e yacc: Diagrama 1 regras lxicas regras gramaticais main() Diagrama 2

lex

yacc

Fluxo yyparse() yylex() de entrada

pt.wikipedia.org/wiki/Lex

2/3

30/07/13

lex Wikipdia, a enciclopdia livre

entrada

yylex()

yyparse()

sada

A partir do diagrama 1, percebe-se que o lex gera a subrotina y y l e x ( )a partir de regras lxicas, e que o yacc gera a subrotina y y p a r s e ( )a partir de regras gramaticais. A partir do diagrama 2, percebe-se que um programa qualquer invoca o analisador sinttico para uma fluxo de entrada. O analisador sinttico no consegue analisar entradas, mas sim tokens. Portanto, cada vez que ele precisa dum token, ele invoca o analisador lxico. O analisador lxico processa o fluxo de entrada e retorna o primeiro token que encontrar. Esse processo de requisio contnuo e s termina quando o analisador lxico identifica o fim o fluxo de entrada ou quando o analisador sinttico identifica uma falha gramatical.

Referncias gerais
M. E. Lesk e E. Schmidt. Lex - A Lexical Analyzer Generator (http://dinosaur.compilertools.net/lex/index.html) (em ingls). The Lex & Yacc Page. Pgina visitada em 22 de julho de 2008. Ivan L. M. Ricarte (14 de fevereiro de 2003). Desenvolvimento de uma aplicao (http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node69.html). Programao de Sistemas: Uma Introduo. Universidade Estadual de Campinas. Pgina visitada em 22 de julho de 2008.

Ver tambm
flex yacc Ragel Quex Obtida de "http://pt.wikipedia.org/w/index.php?title=Lex&oldid=35162470" Categoria: Compiladores de compilador Esta pgina foi modificada pela ltima vez (s) 02h38min de 30 de maro de 2013. Este texto disponibilizado nos termos da licena Atribuio-Partilha nos Mesmos Termos 3.0 no Adaptada (CC BY-SA 3.0); pode estar sujeito a condies adicionais. Consulte as condies de uso para mais detalhes.

pt.wikipedia.org/wiki/Lex

3/3

Você também pode gostar