Sunteți pe pagina 1din 12

rad

or

UNIVERSIDAD NACIONAL DEL ALTIPLANO

FACULTAD

DE I NGENIERA

M ECNICA E LCTRICA E LECTRNICA


Departamento de Ingeniera de Sistemas

S ISTEMAS

MANUAL UNIVERSITARIO

HERRAMIENTAS PARA CONSTRUCCIN DE COMPILADORES

Autor: : Mg. Oliver Amadeo Vilca Huayta

Bor

Profesor de la Facultad de Ingeniera FIMEES.

R Todos los Derechos Reservados.


Hecho en LATEX 2

Puno - Per
Mayo 2014

rad
or

ndice

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.

5
6
6
6
6
7
9
10
11
11
12
13
14

2 El generador YACC
2.1 YACC . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Acciones Semnticas . . . . . . . . . . . . . . .
2.1.2 El Archivo de Entrada . . . . . . . . . . . . . .
2.2 Compilar el Cdigo de Entrada para el YACC Bison
2.3 Bison genera cdigo ANSI . . . . . . . . . . . . . . . .
2.4 Bison genera cdigo ANSI . . . . . . . . . . . . . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

15
16
16
16
18
19
22

Bor

1 El generador de analizadores lxicos LEX


1.1 El LEX . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Instalacin . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.1 Instalacin en Linux . . . . . . . . . . . . . . .
1.3.2 Instalacin en Microsoft Windows . . . . . . .
1.4 Formato del archivo de entrada del LEX . . . . . . . .
1.5 Compilar el Cdigo de Entrada para el FLEX . . . . .
1.6 Mi primer ejemplo en el LEX . . . . . . . . . . . . . .
1.7 Conjunto extendido de expresiones regulares del Lex
1.8 Analizador lxico para un sublenguaje de Pascal . . .
1.9 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . .
1.10 Ejercicios Propuestos . . . . . . . . . . . . . . . . . . .

Bibliografa

27

rad
or

Chapter 1

El generador de analizadores lxicos

Bor

LEX

1.1 El LEX

Pg. 6

rad
or

Oliver A. Vilca H.

En esta seccin se explicar la implementacin de un analizador lxico utilizando un generador de cdigo, especficamente un generador de analizadores lxicos conocido como LEX.
Esto a partir de la descripcin de tokens de un lenguaje de programacin, por lo general expresiones regulares.

Las versiones ms populares de LEX se conoce como FLEX (Fast Lex en ingles), es una
herramienta para generar programas que efecta reconocimiento de patrones en texto. Hay
muchas aplicaciones para el Flex, incluido la escritura de compiladores en conjunto con el GNU
Bison. Se distribuye como parte del paquete compilador GNU que produce la Free Software
Foundation, y tambin se puede obtener gratuitamente en diferentes sitios de Internet. En los
lugares de descarga de los instaladores por lo general tambin se encuentran sus manuales en
ingles.

El Flex o Lex toma como entrada un archivo de texto (por lo general con extensin y) que
contiene expresiones regulares acompaado de acciones que se ejecutan cuando se iguale cada
expresin. Como salida crea un archivo con cdigo fuente generado en lenguaje C (tambin
hay generadores para otros lenguajes de programacin). En el cdigo fuente generado se crea
una funcin denominado yylex, que es la implementacin de la tabla de un autmata finito
determinista correspondiente a las expresiones regulares del archivo de entrada. El nombre
del archivo de salida del Lex es por lo general lex.yy.c lexyy.c, este se compila junto con un

Bor

programa principal para obtener el programa.

1.2 Uso

El programa se ejecuta en la lnea de comandos, y as debera ser ejecutado desde la lnea

de comandos (ventana DOS: command.com or cmd.exe).

1.3 Instalacin

1.3.1 Instalacin en Linux

La instalacin en Linux y en particular en el Ubuntu (versin 14.4) es sencilla y general

para versiones posteriores, se ingresa al Centro de Software de Ubuntu, luego se escribe


flex inmediatamente aparece en la primera coincidencia Un generador rpido de anlisis

Pg. 7

rad
or

Oliver A. Vilca H.

lxico como se muestra en la figura 1.1, finalmente se procede a instalar (debe tener conexin
a Internet). En otras versiones de Linux la instalacin debe ser similar, en caso contrario se
puede consultar su instalacin en Internet.

Figure 1.1: Flex disponible en el Centro de Software de Ubuntu.

1.3.2 Instalacin en Microsoft Windows

Requerimientos: Todos los paquetes GnuWin requieren MS Windows 2000 / XP / 2003 /


Vista / 2008 / 7 / 8.

Descargar el instalador del Flex de la direccin web de preferencia, en seguida instalarla.


Una versin del Flex de libre distribucin se encuentra en:

http://gnuwin32.sourceforge.net/packages/flex.htm, descargue el paquete completo (Complete package, except sources), luego siga las instrucciones. Tambin estan disponibles los cdi-

Bor

gos fuente .

Figure 1.2: Instalacin de Flex en Windows.

1.3.2.1

Pg. 8

rad
or

Oliver A. Vilca H.
Agregar al path del sistema

Si se desea que Flex ( Bison) se integre al conjunto de variables del entorno (esto permite
llamar a Flex desde cualquier ubicacin en la lnea de comandos), debe configuar lo siguiente:
Ingresar a Propiedades del sistema. Seleccionar la pestaa Opciones avanzadas, la
ventana debera ser similar a la siguiente figura 1.3. Las figuras han sido capturadas en Win-

Bor

dows 8.

Figure 1.3: Formulario: Propiedades del sistema - Windows 8.

Luego ingrese a la opcin (botn) Variables de entorno y aparece una ventana como

ilustra en la siguiente figura 1.4.

Pg. 9

rad
or

Oliver A. Vilca H.

Figure 1.4: Formulario: Variables del sistema en Windows 8.

En la ventana Variables del sistema seleccione la variable path y edtelo seleccionando


la opcin Editar como se muestra en la figura 1.5, sin borrar las direcciones desplazar el
cursor al final y agregar un punto y coma ; y finalmente pegar (o escribir) la direccin de los

Bor

ejecutables (binarios) del Flex por ejemplo: C:\Program Files (x86)\GnuWin32\bin.

Figure 1.5: Formulario: Editar la variable del sistema en Windows 8.

1.4 Formato del archivo de entrada del LEX


La entrada del LEX consiste en tres partes, separados por una lnea con %%.

Pg. 10

rad
or

Oliver A. Vilca H.
DEFINICIONES.
%%

REGLAS.
Definicin de la regla 1
Definicin de la regla 2
...
Definicin de la regla n
%%

CDIGO DEL USUARIO.

Table 1.1: Archivo de entrada del LEX.

La parte de def iniciones contiene declaraciones de definiciones y declaraciones de condiciones de inicio.

1.5 Compilar el Cdigo de Entrada para el FLEX

Bor

Para compilar la entrada para el Flex, en la lnea de comandos se debe escribir:


$ flex -l ejm1.y
bien :

$ flex -l -o ejm1.c ejm1.y


Donde :

-l : Es la opcin para que no genere la directiva #line.


ejm1.y : Es el archivo de entrada para el Lex (ver la siguiente seccin).
-o ejm1.c : Es la opcin para indicar el archivo de salida, en el ejemplo es ejm1.c (nombre

del archivo de salida que sigue a la opcin -o)

En el primer ejemplo el nombre archivo de salida generado por defecto es lex.yy.c.

Oliver A. Vilca H.

Pg. 11

rad
or

1.6 Mi primer ejemplo en el LEX

Este analizador lxico cuenta el nmero de caracteres y nmero de lneas de su entrada


(retornos de carro). En la lnea siete se declara e inicializa dos variables num_l y num_c. Son
accesibles desde yylex() y main(). Hay dos reglas, una que empareja con nueva lnea (\n) e incrementa los contadores de lnea y caracteres, y otra que empareja cualquier caracter diferente
a nueva lnea (denotada por la expresin regular punto .).

Programa 1.1: Cuenta nmero de caracteres y lneas: ejm1.y

1
2

/* No se utiliza yywrap cuando lee EOF */


%option noyywrap

3
4

%{

// Variables para contar numero de lineas

// y numero de caracteres

int num_l = 0, num_c = 0;

%}

9
10

%%

11
12

\n

13

{ ++num_l; ++num_c; }

++num_c; // Si es un caracter incrementar el contador

14
15

%%

16
17

main()

18

19

Bor

yylex();

20
21

printf("\nNro de Lineas: %d, Nro de caracteres: %d\n", num_l,num_c);

Luego de haber generado el archivo de salida (codigo en C por ejemplo archivo lex.yy.c),

se prosigue con la compilacin y ejecucin, en ese momento escribir caracteres y tambin puede
presionar la tecla enter para obtener nuevas lneas, cuando se termina y desea obtener el conteo
de lneas y caracteres se debe presiona Control+D.

1.7 Conjunto extendido de expresiones regulares del Lex


En la entrada se especifica con la ayuda de un conjunto extendido de expresiones regu-

lares que utilizan los siguientes operadores entre los ms utilizados. Sean r y s expresiones
regulares.

Pg. 12

rad
or

Oliver A. Vilca H.
x
.
[xy]

[xyz]

[w-z]

[x]
[A-Z]

r*
r+
r?

r{4}
r{2,5}
r{3,}
{XX}
rs

r|s

Representa el caracter x.
Cualquier caracter (byte) excepto nueva lnea.
Clase de caracteres, en este caso, el caracter x
y (pero no ambas).
Clase de caracteres, en este caso, el caracter
x, y z (uno slo).
Clase de caracteres con rango, en este caso,
cualquier letra desde la w hasta la z (estos
son: w,x,y, y z).
Cualquier caracter excepto x.
Complemento de una clase de caracteres, es
decir, cualquier caracter excepto los de la
clase. En este caso, cualquier caracter excepto
una letra en maysculas.
Cero o ms repeticiones de r, donde r es una
expresin regular.
Una o ms repeticiones de r.
Cero o una repeticin de r, es decir, una r opcional.
Exctamente cuatro repeticiones de r.
De dos hasta cinco repeticiones r.
De tres a ms repeticiones de r.
La traduccin de XX de la seccin de deficiones.
La expresin regular r seguida de la expresin
regular s, denominado concatenacin.
Una r una s, unin.

Bor

Table 1.2: Conjunto extendido de expresiones regulares del Lex.

1.8 Analizador lxico para un sublenguaje de Pascal


Este es un ejemplo ms elaborado sirve de inicio para la construccin de un analizador

lxico simple para un lenguaje reducido de Pascal (sublenguaje). Identifica diferentes tipos de
T okens.

Programa 1.2: Analizador Lxico del Sublenguaje Pascal: ejm2.y

/* Analizador Lxico para un Sub lenguaje del Pascal */

2
3
4

/* No se utiliza yywrap cuando EOF */


%option noyywrap

5
6

%{

#include <math.h>

%}

9
10

DIGIT [0-9]

11

Pg. 13

rad
or

Oliver A. Vilca H.

ID [a-z][a-z0-9]*

12
13

%%

14
15

{DIGIT}+

16

printf( "NUMERO: %s (%d)\n", yytext,atoi( yytext ) );

17

18
19

{DIGIT}+"."{DIGIT}* {

20

printf( "FLOTANTE: %s (%g)\n", yytext,atof( yytext ) );

21

22
23

if|then|begin|end|procedure|function {

24

printf( "PALABRA_RESERVADA: %s\n", yytext );

25

26
27

{ID} printf( "IDENTIFICADOR: %s\n", yytext );

28
29

"+"|"-"|"*"|"/" printf( "OPERADOR: %s\n", yytext );

30
31

"{"[^}\n]*"}"

/* Elimina comentarios */

32
33

[ \t\n]+

/* Elimina espacios en blanco, tabs y retornos de carro */

34
35

printf( "CARACTER_DESCONOCIDO: %s\n", yytext );

36
37

%%

38
39
40

main( argc, argv )

41

42

yyin = stdin;

43

yylex();

Bor
44

1.9 Ejercicios

1. Implemente una entrada para el Lex que copie archivos, sustituyendo cada secuencia no
nula de espacios en blanco por un solo espacio en blanco.
Programa 1.3: Reduce espacios en blanco redundates

/* Reduce espacios en blanco redundates */

2
3
4

/* No se utiliza yywrap cuando EOF */


%option noyywrap

5
6

%%

7
8
9

10

[ ]+

printf( " " );

/* Espacios en blanco */

11

printf( "%s", yytext );

12
13

%%

14
15

main( argc, argv )

16

17

yyin = stdin;

18
19

Pg. 14

rad
or

Oliver A. Vilca H.

yylex();
}

1.10 Ejercicios Propuestos

1. Implemente una entrada para el Lex que reconozca los Tokens para un Sub lenguaje de

Bor

Java.

S-ar putea să vă placă și