Documente Academic
Documente Profesional
Documente Cultură
or
FACULTAD
DE I NGENIERA
S ISTEMAS
MANUAL UNIVERSITARIO
Bor
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
Bibliografa
27
rad
or
Chapter 1
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
1.2 Uso
1.3 Instalacin
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.
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 .
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.
Luego ingrese a la opcin (botn) Variables de entorno y aparece una ventana como
Pg. 9
rad
or
Oliver A. Vilca H.
Bor
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
%%
Bor
Oliver A. Vilca H.
Pg. 11
rad
or
1
2
3
4
%{
// y numero de caracteres
%}
9
10
%%
11
12
\n
13
{ ++num_l; ++num_c; }
14
15
%%
16
17
main()
18
19
Bor
yylex();
20
21
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.
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
lxico simple para un lenguaje reducido de Pascal (sublenguaje). Identifica diferentes tipos de
T okens.
2
3
4
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
17
18
19
{DIGIT}+"."{DIGIT}* {
20
21
22
23
if|then|begin|end|procedure|function {
24
25
26
27
28
29
30
31
"{"[^}\n]*"}"
/* Elimina comentarios */
32
33
[ \t\n]+
34
35
36
37
%%
38
39
40
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
2
3
4
5
6
%%
7
8
9
10
[ ]+
/* Espacios en blanco */
11
12
13
%%
14
15
16
17
yyin = stdin;
18
19
Pg. 14
rad
or
Oliver A. Vilca H.
yylex();
}
1. Implemente una entrada para el Lex que reconozca los Tokens para un Sub lenguaje de
Bor
Java.