Vous êtes sur la page 1sur 28

INTRODUCCIÓN

A LEX

Javier Reyes Alonso alu3065@etsii.ull.es

David Ramos Lehnhoff alu3242@etsii.ull.es


RESUMEN DEL CONTENIDO
1. CONCEPTOS BÁSICOS DE LEX
2. ARCHIVOS NECESARIOS
3. ESQUEMA DE FUNCIONAMIENTO
4. FORMATO DEL FICHERO FUENTE
5. PATRONES
6. OPERADORES
1. OPERADOR [], ?, “.” , *, +, | , { } , ( )
7. DEFINICIONES
8. VARIABLES GLOBALES
9. EJEMPLOS DEL FICHERO DE ENTRADA
1. COMPILACIÓN Y EJECUCIÓN
2. FICHERO DE SALIDA DE FLEX
10. OPCIONES DE COMPILACIÓN DE FLEX
11. UTILIZAR LEX CON YACC
12. CONCLUSIONES
13. BIBLIOGRAFÍA
14. PREGUNTAS
1. CONCEPTOS BÁSICOS DE LEX

Ø LEX es una herramienta para la construcción de


analizadores léxicos.
Ø Para escribir un programa en LEX, es necesario crear
una serie de patrones (expresiones regulares).
Ø LEX devuelve un programa en código C, llamado
yylex().
Ø yylex() genera autómatas finitos que reconocen
cadenas de caracteres.
2. ARCHIVOS NECESARIOS

Ø Nombre_archivo.l
Contiene las especificaciones lexicográfica del
lenguaje L (escrita en Lex y no tiene una extensión
determinada)
Ø lex.yy.c
Analizador lexicográfico de L generado por Lex
Ø libl
Librería asociada a Lex que contiene estructuras de
datos y funciones a las que se puede hacer referencia
desde el código generado
3. ESQUEMA DE FUNCIONAMIENTO
4. FORMATO DEL FICHERO FUENTE

DEFINICIONES
%%
PATRÓN ACCIÓN
%%
SUBRUTINAS DEL USUARIO

• NOTA: Las definiciones y las subrutinas del


usuario se pueden omitir . Obligatorio es el
primer %% para marcar el inicio de las
órdenes.
5. PATRONES

Ø Un patrón es una expresión regular


constituida por un alfabeto S,
relacionados mediante operadores.

Ø A cada patrón se le puede asociar


una acción, que es un bloque de
código escrito en C.
5.1 OPERADORES

* El elemento precedente debe aparecer 0 o más veces

+ El elemento precedente debe aparecer 1 o más veces

? El elemento precedente aparece 1 vez o e

\, “” Escape, es decir, representar el valor del carácter sin ningún significado


especial
| Alternativa entre dos opciones (O uno u otro)

• Concatenación de cadenas (generalmente se suprime)

- Rango de cadenas ya sea numérico o cadenas

^ Conjunto de caracteres no admitidos, va dentro de corchetes [^....]

{} Repeticiones: {n} n veces, {n,m} i veces (n≤ i ≤ m), y {n,} i veces (n ≤ i)

[] Delimitan listas de caracteres individuales


5.1 OPERADORES
Ø Operador []: Representa todos aquellos caracteres que estén entre
corchetes.
Ejemplo: [abc] coincide con cualquier carácter que sea a, b ó c.

Ø Caracteres especiales:
→ Guión (-): nos indica rangos.
Ejemplo: [a-z] representa todos los caracteres minúscula.
→ Signo de intercalación (^): se sitúa seguido del primer [ y
representa cualquier carácter que no esté entre los [ ] .
Ejemplo: [^abc] representa todos los caracteres excepto a,b y c.
→ \ para incluirlos individualmente y “” para incluirlos en
grupo
5.1 OPERADORES

Ø Operador ?: indica un elemento opcional de una expresión.


Ejemplo: ab?c coincide o con ac ó abc.

Ø El operador “.”: representa a todos los caracteres, excepto el


retorno de carro.
Ejemplo: .+ Acepta cualquier cadena no vacía
5.1 OPERADORES

Ø Operador *: representa cadenas formadas por cero o más


apariciones del elemento que lo antecede.

Ejemplo: [a-z]* Este patrón coincide con ninguno o más


literales en minúscula, como: e , a, ab, aabgds……
5.1 OPERADORES

Ø Operador +: representa cadenas formadas por una o más


apariciones del elemento que lo antecede.

Ejemplo: [0-9]+ Este patrón coincide con uno o más


números, como: 3 , 45, 986, 653487……
5.1 OPERADORES

Ø Operador |: se utiliza para la alternación, haciendo


coincidir con el elemento que lo precede o lo antecede y
se puede utilizar consecutivamente.

Ejemplo: ab|cd Este patrón coincide con ab o con cd


5.1 OPERADORES

Ø El operador “{ }”: representa un rango de repetición, cuando


contiene dos números separados por una coma (,) y también una
repetición fija, si sólo contiene un número.
Ejemplos:
a{3,6} Acepta cadenas con longitud 3,4,5 o 6 formada por
el carácter “a”
a{4} Acepta cadenas que tengan 4 aes consecutivas.

Ø “(“ , “)”: Se utilizan para agrupar subexpresiones.


Ejemplo:
(ab|cd+)?(ef)* Reconoce cadenas como abefef, efefef, cdef, cddd…
6. DEFINICIONES

Hay dos tipos de declaraciones:

Ø Declaraciones C.- Se colocan entre dos líneas %{ y %}, las cuales le indican a
LEX que tienen que ser copiadas sin modificar al archivo generado C.

Ø Declaraciones de LEX.- Están formadas por un nombre o identificador y su


correspondiente expresión regular. Esto nos permite colocar en la parte de
órdenes en vez de la expresión, su nombre. También nos permite formar nuevas
expresiones regulares.

nombre expresión regular

letra [a-z]

separación
8. VARIABLES GLOBALES

Ø yytext: Contiene la secuencia de caracteres

Ø yyleng: Contiene la longitud de la secuencia

Ø yyin: es el fichero por el que flex lee.

Ø yyout: es el fichero sobre el que se escribe.


9. EJEMPLOS DEL FICHERO DE ENTRADA

Ejemplo 1:
%% // Mínimo de un programa

Ejemplo 2:
%%
integer printf(“ palabra reservada INT ”) ;

Ejemplo 3:
%{
int count = 0;
%}
%%
username { ++count;
printf("%s", getlogin());
}
Ejemplo 4: Nombre del fichero: analizador1.l
%{
int Num_palabras = 0, Num_numeros = 0;
%}
letra [a-z]
cifra [0-9]

%%
{letra}+ { Num_palabrass++; }
{cifra}+ { Num_numeros++; }
\$ { return 0; }
\n {;}
. {;}

%%
main () {
yylex ();
printf ("Palabras: %d\n", Numpalabras);
printf ("Numerous : %d\n", Num_numeros); }
Ejemplo 5: Nombre del fichero: analizador2.l
%{ /* Necesario para la llamada a atoi() */
#include <math.h>
%}
DIGIT [0-9]
ID [a-z][a-z0-9]*

%%
{DIGIT}+ printf(“Un entero: %s %d\n", yytext,atoi(yytext));
if|then|begin|end printf(“Una palabra reservada: %s\n", yytext);
{ID} printf(“Un identificador: %s\n", yytext);
"+”|"-”|"*”|"=" printf(“Un operador: %s\n", yytext);

%%
main(int argc, char *argv[]) {
++argv; --argc; /*Evita el nombre del programa */
if (argc > 0)
yyin = fopen(argv[0], "r");
else
yyin = stdin;
yylex(); }
9.1 COMPILACIÓN Y EJECUCIÓN
Ø Sin paso de parámetros:
$ flex analizador1.l
$ cc lex.yy.c -o analizador1 –lfl
$ ./analizador1
if salir then
begin
x + 2345
end$
Palabras: 6
Números: 1
9.1 COMPILACIÓN Y EJECUCIÓN

Ø Con paso de parámetros:


$ flex analizador2.l
$ cc lex.yy.c -o analizador2 –lfl
$ ./analizador2 fich_fuente.pas
Una palabra reservada: if
Un identificador: salir fich_fuente.pas
Una palabra reservada: then
Una palabra reservada: begin if salir then
Un identificador: x begin
x + 2345
Un operador: +
end
Un entero: 2345 2345
Una palabra reservada: end
9.2 FICHERO DE SALIDA DE FLEX
Ø Analizador2.c:
#line 2 "analizador2.c"
/* A lexical scanner generated by flex */
/* Scanner skeleton version:
* $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
*/
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#include <stdio.h>
#include <unistd.h>
/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
#ifdef c_plusplus
#ifndef __cplusplus
#define __cplusplus
#endif
#endif
9.2 FICHERO DE SALIDA DE FLEX

#if YY_MAIN
int main()
{
yylex();
return 0;
}
#endif
#line 10 "analizador2.l"

main(int argc, char *argv[]) {


++argv; --argc; /*Evita el nombre del programa */
if (argc > 0)
yyin = fopen(argv[0], "r");
else
yyin = stdin;
yylex(); }

Número de líneas: 1528 Tamaño: 36.925 bytes


10. OPCIONES DE COMPILACIÓN DE FLEX

Ø flex [-bcdfhilnpstvwBFILTV78+? -C[aefFmr] -osalida -Pprefijo


-Sesqueleto] [--help --version] [nombrefichero ...]

`-d' analizador generado se ejecuta en modo de depuración.


`-f' analizador rápido. El resultado es grande pero rápido.
`-h' genera un sumario de "ayuda“.
`-w‘ suprime los mensajes de aviso.
`-+' genera un analizador como una clase de C++.
`-osalida' crea el analizador en el fichero `salida' en lugar de
crearlo en lex.yy.c
11. UTILIZAR LEX CON YACC

Ø LEX escribe un programa llamado yylex( ).


Ø YACC requiere esta función para su analizador.
Ø Cada orden lex deberá terminar con return (token);
Ø Añadir la línea #include “lex.yy.c” en la última sección del input
del yacc.
Ø Ejemplo:
Gramática “gram.y” y órdenes léxicas “analiza.l”

yacc gram.y
lex analiza.l
cc y.tab.c –ly –ll

Ø La librería yacc (-ly) se deberá cargar antes de la librería lex.


12. CONCLUSIONES

Ø LEX nos proporciona una potente y


eficaz herramienta para generar
analizadores léxicos.
Ø Mediante expresiones cortas y sencillas
podemos obtener rápidamente un
analizador léxico eficiente.

Ø Se puede utilizar con YACC .


13. BIBLIOGRAFÍA

Ø Compiladores: Principios, técnicas y herramientas.


Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman
Addison-Wesley Iberoamericana
Ø Manual Unix de FLEX (man flex)
Ø http://es.tldp.org/Manuales-LuCAS/FLEX/flex-es-2.5.html
Ø http://mailweb.udlap.mx/~is111936/oto02/documentos/tutoriales/le
x&yacc/core/lex.html
Ø http://www.lania.mx/~jalba/Comp/Lex.ppt
Ø http://lsi.ugr.es/~pl/teoria/Tema3.pdf
Ø Enlaces para descargar FLEX
Ø http://rpm.pbone.net/

Ø http://sourceforge.net/projects/lex/
14. PREGUNTAS

Vous aimerez peut-être aussi