You are on page 1of 32

Generacin de analizador lxico

Lex (ex, . . . )

Generacion de analizador lexico p.1

Expresiones regulares tipo grep

Expresiones simples (un slo carcter):


carcter

carcter
.
cualquier carcter (excepto separador de lnea)
[ - ]
cualquier carcter del conjunto
[ - ] cualquier carcter fuera del conjunto

Generacion de analizador lexico p.2

Expresiones regulares tipo grep

Operadores para expresiones compuestas:


?

*
cero o ms ocurrencias de
+
una o ms ocurrencias de
concatenada con
|

( )
(necesario para agrupar)
Nota: ?*+ tienen precedencia sobre la concatenacin, y sta sobre
|

Generacion de analizador lexico p.3

Gramticas EBNF tipo lex


Partes derechas son expresiones regulares tipo grep
Sin recursividad (ni indirecta ni directa)
Por tanto, genera slo lenguajes regulares
Podemos desarrollar las partes derechas (de tokens):
Sustituimos no-terminales por sus partes derechas
Si es necesario, insertamos parntesis para los
operadores *+?

Generacion de analizador lexico p.4

Ejemplo
[a-zA-Z]

[0-9]

letra | digito

TOKEN_IDENT

letdig

subr

digito

letra

letra letdig* (subr letdig+)*

TOKEN_IDENT

Desarrollamos la parte derecha:


[a-zA-Z] ([a-zA-Z] | [0-9])*
(_ ([a-zA-Z] | [0-9])+)*

Generacion de analizador lexico p.5

Items



Usaremos items con la forma




Una vez desarrolladas partes derechas de los tokens:

 

 

) pasamos de



Al leer (




El punto indica hasta dnde se ha ledo (de la entrada)

Podemos ver los items como estados de un autmata


nito no-determinista con transiciones (AFN )

Generacion de analizador lexico p.6

"
"

7
4

46
53

1
20
&

&

&

)
%"

"

&

&

&

( )
"

"
"

+
'
8"


&

&

&

+ ,
$ "

"

* ,

"

#
#
#
#

&

'
("

 "
 "

&

) "


&

&

&

&

 "

 "

&

&

&

$
%"

)
?

"

( )
"

"

"

Transiciones (cierre)

Al nal, los items con delante de ()?*+| pueden


eliminarse

Generacion de analizador lexico p.7

Ejemplo de transiciones
Partimos de:
a (a|0)*( (a|0)+)*


Generacion de analizador lexico p.8

Ejemplo de transiciones
Obtenemos:


a(a|0)* ( (a|0)+)*


a (a|0)*( (a|0)+)*
a( a|0)*( (a|0)+)*

T
T

Generacion de analizador lexico p.8

Ejemplo de transiciones
Obtenemos:

a (a|0)*(
a( a|0)*(
a(a| 0)*(
a(a|0)* (


T
T
T
T

(a|0)+)*
(a|0)+)*
(a|0)+)*
(a|0)+)*

Generacion de analizador lexico p.8

Ejemplo de transiciones
Cierre completado:

a (a|0)*( (a|0)+)*
a( a|0)*( (a|0)+)*
a(a| 0)*( (a|0)+)*
a(a|0)* ( (a|0)+)*
a(a|0)*( (a|0)+)*
a(a|0)*( (a|0)+)*


T
T
T
T
T
T

Generacion de analizador lexico p.8

Ejemplo de transiciones
Eliminamos items intiles:

a (a|0)*( (a|0)+)*
a( a|0)*( (a|0)+)*
a(a| 0)*( (a|0)+)*
a(a|0)* ( (a|0)+)*
a(a|0)*( (a|0)+)*
a(a|0)*( (a|0)+)*


T
T
T
T
T
T

Generacion de analizador lexico p.8

Ejemplo de transiciones
Eliminamos items intiles:

a (a|0)*( (a|0)+)*
a( a|0)*( (a|0)+)*
a(a| 0)*( (a|0)+)*
a(a|0)* ( (a|0)+)*
a(a|0)*( (a|0)+)*
a(a|0)*( (a|0)+)*


T
T
T
T
T
T

Una transicin con a nos dara T a(a |0)*(_(a|0)+)*

Generacion de analizador lexico p.8

Ejemplo de transiciones
Eliminamos items intiles:

a (a|0)*( (a|0)+)*
a( a|0)*( (a|0)+)*
a(a| 0)*( (a|0)+)*
a(a|0)* ( (a|0)+)*
a(a|0)*( (a|0)+)*
a(a|0)*( (a|0)+)*


T
T
T
T
T
T

Una transicin con a nos dara T a(a |0)*(_(a|0)+)* Tras


cierre y eliminacin, se obtiene el mismo conjunto

Generacion de analizador lexico p.8

Construccin de AFD
Estado inicial = cierre de items con el punto al principio
Conjuntos de items simultneamente vlidos para los
distintos tokens
Asociamos a cada conjunto un estado del autmata
nito determinista (AFD)
Las transiciones del autmata corresponden a las de
los items
Los estados nales vienen indicados por el punto al
nal del tem
Se reconoce el token correspondiente a dicho tem

Generacion de analizador lexico p.9

$ 9

B
A9

Ejemplo de AFD




D
@
A9

(D)*"."( D)+

"."

(D)*"."( D)+
(D)*"."(D)+


otro

F
F

C
A9

otro

"."

( D)+
(D)+
( D)*"."(D)+
(D)* "."(D)+

I
I
F
F

( D)+
( D)*"."(D)+
(D)* "."(D)+

I
F
F

Generacion de analizador lexico p.10

Tabla del AFD


C D

C D

$ D
$ D

Cdigo smbolo:
0=D
1=otro
2=.

@ D
@ D

B D
C D
@ D

$ D

Generacion de analizador lexico p.11

Tabla del AFD


2
C D

Cdigo smbolo:
0=D
1=otro
2=.

@ D

C D

$ D
$ D

@ D

B D
C D
@ D

$ D

Linearizacin por desplazamiento de las, p.e.:


estado+smbolo

vericacin

@ D

C D

$ D

B D

transic/decisin

Correspondencia estado-ndice:

Generacion de analizador lexico p.11

Tabla del AFD


2
C D

Cdigo smbolo:
0=D
1=otro
2=.

@ D

C D

$ D
$ D

@ D

B D
C D
@ D

$ D

Linearizacin por desplazamiento de las, p.e.:


4

@ D

C D

$ D

transic/decisin

B D

vericacin

B D

C D

B D

$ D

estado+smbolo

Correspondencia estado-ndice:
0

Generacion de analizador lexico p.11

Tabla del AFD


2
C D

Cdigo smbolo:
0=D
1=otro
2=.

@ D

C D

$ D
$ D

@ D

B D
C D
@ D

$ D

Linearizacin por desplazamiento de las, p.e.:


7

@ D

$ D

C D

C D

I
$ D

transic/decisin

B D

vericacin

$ D

$ D

$ D

B D

C D

B D

$ D

estado+smbolo

Correspondencia estado-ndice:

Generacion de analizador lexico p.11

Tabla del AFD


2
C D

Cdigo smbolo:
0=D
1=otro
2=.

@ D

C D

$ D
$ D

@ D

B D
C D
@ D

$ D

Linearizacin por desplazamiento de las, p.e.:


7

@ D

$ D

C D
C D

$ D

I
$ D

$ D

transic/decisin

B D

vericacin

$ D

B D

C D

C D

@ D

B D

$ D

estado+smbolo

Correspondencia estado-ndice:

Generacion de analizador lexico p.11

Tabla del AFD


2
C D

Cdigo smbolo:
0=D
1=otro
2=.

@ D

C D

$ D
$ D

@ D

B D
C D
@ D

$ D

Linearizacin por desplazamiento de las, p.e.:

@ D

@ D

@ D

@ D

@ D

$ D

C D

I
$ D

transic/decisin

B D

vericacin

C D

$ D

$ D

$ D

B D

C D

C D

@ D

B D

$ D

estado+smbolo

Correspondencia estado-ndice:

Generacion de analizador lexico p.11

Tabla del AFD


2
C D

Cdigo smbolo:
0=D
1=otro
2=.

@ D

C D

$ D
$ D

@ D

B D
C D
@ D

$ D

Linearizacin por desplazamiento de las, p.e.:


3

vericacin

transic/decisin

@ D

C D

$ D

B D

estado+smbolo

Correspondencia estado-ndice:

Generacion de analizador lexico p.11

Formato de un chero flex


Declaraciones en C entre %{ y %}
Declaraciones especiales comenzadas por %
Reglas de no-terminales auxiliares
%%

Secuencia de
Expresiones regulares (patrones) de smbolos a
reconocer
Entre llaves, acciones en C asociadas, normalmente
terminadas en return cdigo-del-smbolo
%%

Rutinas auxiliares y/o main si programa independiente

Generacion de analizador lexico p.12

Generacin
milex.l

flex

lex.yy.c

gcc

milex

1. Editamos un chero de especicacin milex.l


2. Procesamos con flex milex.l
3. Normalmente lo compilaremos junto con un analizador
sintctico producido por bison
4. Si introducimos main() que llame a yylex(), podremos
tener un analizador lxico independiente: gcc -o
milex lex.yy.c -lfl

(usar cheros e/s estndar)

Generacion de analizador lexico p.13

Contenido de lex.yy.c
1. Declaraciones iniciales copiadas
2. Funcin yylex() con bucle de reconocimiento de
patrones:
Cada vez que reconoce uno, almacena el texto en
yytext y ejecuta el cdigo asociado
Si ms de uno, da preferencia al texto de mayor
longitud
Si igual longitud, da preferencia al patrn indicado
en primer lugar

(el texto de

C "

C "

reconoce

$
%"

C "

$
%"

El patrn especial

3. Rutinas auxiliares copiadas


slo si va seguido de

se volver a leer)

Generacion de analizador lexico p.14

Algunas acciones especiales


BEGIN estado: pasan a considerarse las expresiones
regulares comenzadas por <estado>
ECHO: visualiza yytext
yymore(): el texto actual se aadir al del prximo

token
yyless(n): se conservan los primeros n caracteres en
yytext y el resto se volvern a procesar

Si no hay accin, ignora el texto y reanuda la lectura


para un nuevo patrn
Si no se encuentra patrn alguno (error), se deja atrs
(y visualiza) el primer carcter y vuelve a intentarlo

Generacion de analizador lexico p.15

Tratamiento de errores en flex


Nada especialmente previsto, pero podemos (y debemos):
Detectar caracteres no permitidos usando .
Detectar patrones no permitidos, en su caso
Para patrones errneos frecuentes, reparar el
texto/smbolo, p.e.: comillas o comentario sin cerrar
Visualizar los correspondientes mensajes explicativos

Generacion de analizador lexico p.16

Ejemplo flex (1/3)


%{
#define ENTERO 257
#define IDENTIF 258
int numlin = 1;
void error(char*);
%}
letra
digito
letdig

[a-zA-Z]
[0-9]
{letra}|{digito}

Generacion de analizador lexico p.17

Ejemplo flex (2/3)


%%
("+"|-)?{digito}+
{letra}{letdig}*
[-+*/]
\n
[ \t] |
#.*
.
<<EOF>>

{return ENTERO;}
{return IDENTIF;}
{return yytext[0];}
{numlin++; /* contina leyendo */}
u
{/* ignora */}
{error("caracter raro");}
{return 0; /* por defecto */}

Generacion de analizador lexico p.18

Ejemplo flex (3/3)


%%
int main(int argc, char** argv) {
int s;
if(argc>1) yyin=fopen(argv[1],"r"); /* else yyin=stdin */
do printf("%i ",s=yylex()); while(s != 0);
return 0;
}
void error(char* mens) {
printf("Error lexico en linea %i: %s\n",numlin,mens);
}

Generacion de analizador lexico p.19

Conclusin
Un generador automtico nos permite concentrarnos
en el diseo lxico y acciones asociadas
Desventajas: dependencia de la herramienta, coste de
aprendizaje
flex puede usarse como ltro potente de texto

Ms informacin en pgina man flex y en libro lex &


yacc, de Levine et al. (681.3.06)

Generacion de analizador lexico p.20