Lex

Páginas: 6 (1488 palabras) Publicado: 15 de mayo de 2015
Lex y yacc
compiladores

Lex y yacc


Lex y Yacc son un par de especificaciones que sirven
para generar tokenizers y parsers en C que reconozcan
gramáticas libres de contexto, como lenguajes de
programación o calculadoras entre otros. 



Lex es el encargado de leer de la entrada, típicamente
stdin y extraer de la misma los tokens reconocidos por
el basado en un lenguaje de expresionesregulares.



Yacc sirve para generar parsers, usa a lex para leer y
reconocer sus tokens y basado en reglas sencillas en
formato similar al BNF, es capaz de ir reduciendo una
expresión con bastante eficiencia. 

Lex: Conceptos básicos.


Formalmente, podemos definir a lex como una
herramienta para construir analizadores léxicos o
"lexers". Un lexer lee de un flujo de entrada
cualquiera, y la divideen unidades léxicas (la
tokeniza), para ser procesada por otro programa o
como producto final. 



Para escribir una especificación léxica en lex, es
necesario crear un conjunto de patrones
(Expresiones Regulares), mismos, que cuando el
programa este completo, van a ser reconocidos
como tokens o unidades léxicas. 

Lex: Conceptos básicos.


Lex no produce un programa compilado, lo
que hace, estraducir esa especificación a C,
incluyendo una rutina llamada yylex(), que es
la usada para iniciar en análisis de la
entrada. 



La entrada es tomada de yyin, que por
defecto su valor es stdin, es decir, la pantalla
o terminal, pero este valor puede ser
modificado por cualquier apuntador a un
archivo. 

Lex: Ejemplo


























%{
#include
int palabra=0,numero=0;
%}
Numero -?[0-9]+
Palabra [a-zA-Z]+
%%
"bye"
{bye();return 0;}
"quit"
{bye();return 0;}
"resume" {bye();return 0;}
{Palabra} {printf("Se leyo la palabra : %s", yytext);palabra++;}
{Numero} {printf("Se leyo el numero : %d", atoi(yytext));numero++;}
. printf("%s",yytext[0]);
%%
main(){
printf("ejem1.l\nEste ejemplo, distingue entre un numero entero y palabras.\nIntroduzca bye, quit o resumepara terminar.\n");
yylex();
}
bye(){
printf("Se leyeron %d entradas, de las cuales se reconocieron\n%d\tEnteros\ny\n%d\tPalabras.\n",
(palabra+numero), numero, palabra);
}

Lex: Dificiones










En este ejemplo, una de las primeras cosas a notar, son
las dos lineas "%%" que sirven como separadores para las
tres secciones de una especificacion lex, la primera, la de
definiciones, sirvepara definir cosas que se van a usar en
el programa resultante o en la misma especificacion, si
vemos al ejemplo :
%{
#include
int palabra=0, numero=0;
%}
Numero -?[0-9]+
Palabra [a-zA-Z]+

Lex: Reglas


Las reglas de lex, tienen el siguiente formato :



{Codigo en C}



En el ejemplo podemos ver que :
"bye" {bye();return 0;}
"quit" {bye();return 0;}"resume" {bye();return 0;}
{Palabra} {printf("Se leyo la palabra : %s", yytext);palabra++;}
{Numero} {printf("Se leyo el numero : %d", atoi(yytext));numero++;}
. printf("%s",yytext[0]);










son reglas tipicas de lex, donde la primera columna es la lista de expresiones regulares, "bye", "quit"
y "resume" por ejemplo, se encargan de terminar con el programa, terminando la funcion yylex()llamando a la funcion bye() y depues return, especificados en la segunda columna.



Como ya vimos en la segunda columna se escriben acciones en C a realizar cada que se acepta una
cadena con ese patron, misma que es almacenada en un array apuntado por yytext, podemos ver
que las acciones estan encerradas entre "{" y "}" lo que indica que se incluye más de un statement
de C por regla, el contraejemplo es la ultima regla, que reconoce cualquier caracter y lo imprime a
la pantalla mediante el uso de printf().

Lex: SubRutinas


La tercera y última sección es usada
para escribir codigo C, generalmente se
usa para incluir funciones o subRutinas
que se va a ocupar en el programa
resultante, ya sea que se llamen desde
una regla como es el caso de bye() en
nuestro ejemplo, o que se llamen...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Lexar
  • lexa
  • Lex
  • Lexo
  • Dura lex, sed lex
  • lex dura lex
  • dura lex, dura lex
  • lex mercatoria

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS