Está en la página 1de 66

Bloque 2:Anlisis TEMA 2: ANALIZADOR TEMA LXICO 2: ANALIZADOR LXICO

Compiladores e Intrpretes

ndice
1- Definiciones previas 2- Definicin del analizador lxico
2.1- Funcionamiento 2.2- Separacin Lxico-Sintctico 2.3- Errores lxicos

3- Construccin manual del analizador lxico


3.1- Implementacin mediante diagrama de estados 3.2- Implementacin mediante tabla de transiciones 3.4- Gestin de los buffers

4- Generacin automtica de analizadores lxicos


4.1- Lex 4.2- JFlex

5- Atributos de los tokens 6- Decisiones en el diseo

Compiladores e Intrpretes

ndice
1- Definiciones previas 2- Definicin del analizador lxico
2.1- Funcionamiento 2.2- Separacin Lxico-Sintctico 2.3- Errores lxicos

3- Construccin manual del analizador lxico


3.1- Implementacin meidante diagrama de estados 3.2- Implementacin mediante tabla de transiciones 3.4- Gestin de los buffers

4- Generacin automtica de analizadores lxicos


4.1- Lex 4.2- JFlex

5- Atributos de los tokens 6- Decisiones en el diseo

Compiladores e Intrpretes

Definiciones previas
Token: componente lxico. Smbolos terminales. Lexema: secuencia caracteres. Puede haber conjunto de lexemas que se refieren al mismo token. Patrn: describen el conjunto de cadenas de entradas asociados a un token.

Compiladores e Intrpretes

Definiciones previas
Ejemplo:
Componente Lxico T_Const T_If T_Relacin T_Id Lexemas Const If <,<=,>= Pi,cuenta, d2 Patrn Const If <o> Letra seguida de letras y dgitos

Compiladores e Intrpretes

ndice
1- Definiciones previas 2- Definicin del analizador lxico
2.1- Funcionamiento 2.2- Separacin Lxico-Sintctico 2.3- Errores lxicos

3- Construccin manual del analizador lxico


3.1- Implementacin meidante diagrama de estados 3.2- Implementacin mediante tabla de transiciones 3.4- Gestin de los buffers

4- Generacin automtica de analizadores lxicos


4.1- Lex 4.2- JFlex

5- Atributos de los tokens 6- Decisiones en el diseo

Compiladores e Intrpretes

Definicin del analizador lxico


Analizador lxico (AL) primera fase de un compilador Funcin principal: producir tokens Funciones secundarias:
Eliminar comentarios y blancos Ubicar errores Control de macros

Compiladores e Intrpretes

Definicin del analizador lxico


Para crear un AL hay que:
Especificar todos los tokens del lenguaje Puede haber varios tokens que correspondan a una misma expresin regular En este caso el algoritmo asociado a la exp. regular deber diferenciar a partir del lexema el token.

Compiladores e Intrpretes

Definicin del analizador lxico


Funcionamiento:
Hay una variable (texto) que contiene el lexema encontrado al reconocer un determinado patrn. Cada vez que se llama al AL, ste va leyendo caracteres hasta encontrar un lexema que pertenece a un lenguaje descrito por una expresin regular. En ese momento en texto est el lexema completo y se ejecuta el algoritmo asociado.

Compiladores e Intrpretes

Definicin del analizador lxico


Funcionamiento:
El valor asociado que devuelve el AL vara de un token a otro.
Ejemplo: for <PR, for> ; cte <cte, valor>

Compiladores e Intrpretes

10

Separacin Lxico-Sintctico
Razones:
Diseo Eficiencia Independencia del alfabeto

Mtodos de comunicacin:
Buffer intermedio Subrutina

Compiladores e Intrpretes

11

Errores Lxicos
El AL detecta pocos errores.
Visin restringida del programa fuente Ejemplo: rof (int a=0; a<3;a++) El AL no sabe que rof for Puede darse que la cadena de entrada no concuerde con ningn patrn.

Compiladores e Intrpretes

12

Errores Lxicos
Estrategias de recuperacin
Modo pnico: la ms sencilla. Se ignora la entrada hasta que la cadena concuerde con un patrn
Problema: puede confundir al AS

Otras estrategias:
Borrar carcter que sobra Insertar carcter que falta Reemplazar carcter Intercambiar caracteres adyacentes
Compiladores e Intrpretes 13

ndice
1- Definiciones previas 2- Definicin del analizador lxico
2.1- Funcionamiento 2.2- Separacin Lxico-Sintctico 2.3- Errores lxicos

3- Construccin manual del analizador lxico


3.1- Implementacin mediante diagrama de estados 3.2- Implementacin mediante tabla de transiciones 3.4- Gestin de los buffers

4- Generacin automtica de analizadores lxicos


4.1- Lex 4.2- JFlex

5- Atributos de los tokens 6- Decisiones en el diseo

Compiladores e Intrpretes

14

Construccin del AL
Tres mtodos de construccin:
Utilizar generador Escribir el AL a mano con un lenguaje de alto nivel Escribir el AL a mano en lenguaje ensamblador

Compiladores e Intrpretes

15

Construccin manual del AL


ER AFD Un AL se implementa con un AFD + acciones semnticas. Un AFD se representa:
Diagrama transiciones Matriz de estados

Las acciones semnticas ejecutan una serie de acciones.


Compiladores e Intrpretes 16

Construccin manual del AL


Construccin de Thompson: Generar autmatas a partir de E.R.: a
N(s) i F i F

a i F

s|t

N(t)

Compiladores e Intrpretes

17

Construccin manual del AL


st s*
i i N(s) N(t) F

N(s) F

a 2 b 4 5 3

Ejemplo: (a|b)*

Compiladores e Intrpretes

18

Construccin manual del AL


Reconocer tokens:
Problema: cmo delimitarlos? Surge concepto delimitador. Carcter del alfabeto que ayuda a detectar el ltimo carcter del token.

Compiladores e Intrpretes

19

Construccin manual del AL


Cuestiones de implementacin:
Palabras reservadas
Detectarlas por su lexema Uso de tabla de palabras reservadas

El AL debe traducir los lexemas a tokens. Para ello utiliza acciones semnticas. Las ms comunes son:

Compiladores e Intrpretes

20

10

Construccin manual del AL


Cuestiones de implementacin:
Leer siguiente carcter (L) Concatenar caracteres que forman el lexema (C) Calcular el valor numrico (N) Entregar token al AS (A) Diferenciar PR de identificador Retroceder un carcter en el BE (R).

Compiladores e Intrpretes

21

Construccin manual del AL


Cuestiones de implementacin:
Las acciones semnticas se pueden ejecutar
Al salir de un estado Al llegar al estado

Compiladores e Intrpretes

22

11

Construccin manual del AL


Gestin de los buffers:
El AL es posible que consuma mucho tiempo. Los buffers se introducen para mejorar el rendimiento del anlisis lxico.

Compiladores e Intrpretes

23

Gestin de los Buffers


Opciones:
1.

Si se lee carcter a carcter


Va muy lento (el A.L. es lo ms fcil y lento del compilador). No tengo preanlisis: devolver carcter muy lento.

2.

Uso de buffers:
Parejas de buffers:

Compiladores e Intrpretes

24

12

Construccin manual del AL


Pareja de Buffers:
Se divide en dos mitades de tamao N (N= un bloque del disco (1024 o 4096) Dos punteros: comienzo_lexema y delantero. Al principio los dos igual y avanzo delantero hasta encontrar concordancia con patrn (un token). Delantero se coloca en su carcter derecho. Comienzo_lexema y delantero delimitan lexema. Procesa lexema (devuelvo token) y coloco comienzo_lexema en delantero (primer carcter del siguiente) Cando termina una mitad, recarga la otra y continua hasta encontrar token.
Compiladores e Intrpretes 25

Construccin manual del AL


Pareja de buffers:

Compiladores e Intrpretes

26

13

Construccin manual del AL


Algoritmo para avanzar delantero:
if delantero est al final de la primera mitad then
begin recargar la segunda mitad; delantero: = delantero + 1 end else if delantero est al final de la segunda mitad then begin recargar la primera mitad; pasar delantero al principio de la primera mitad end else delantero := delantero + 1;

Compiladores e Intrpretes

27

Construccin manual del AL


Algoritmo para recargar los buffers
Problema 1: limito tamao de preanlisis al tamao del buffer. Problema 2: el algoritmo en la mayora de los movientos de punteros (cuando no hay que cargar ninguna mitad) comprueba dos veces.

Compiladores e Intrpretes

28

14

Construccin manual del AL


Solucin: Pareja centinelas: de buffers con

Un carcter centinela (suele ser eof): no existe en le fichero fuente Se pone al final de las mitades en cada movimiento pregunto por l y solo compruebo final de la correspondiente mitad si estoy en un eof. La mayora de las veces solo hago una comprobacin para mover el puntero.
Compiladores e Intrpretes 29

Construccin manual del AL


Algoritmo de recarga de Pareja de buffers con centinelas:

Compiladores e Intrpretes

30

15

Construccin manual del AL


delantero: = delantero + 1: if delantero = eof then begin if delantero est al final de la primera mitad then begin recargar la segunda mitad; delantero: = delantero + 1 end else if delantero est al final de la segunda mitad then begin recargar la primera mitad; pasar delantero al principio de la primera mitad end else /* eof dentro de un buffer significa el final de la entrada */ terminar el anlisis lxico end

Compiladores e Intrpretes

31

Construccin manual del AL

Compiladores e Intrpretes

32

16

Construccin manual del AL

Compiladores e Intrpretes

33

Construccin manual del AL

Compiladores e Intrpretes

34

17

Construccin manual del AL

Compiladores e Intrpretes

35

Construccin manual del AL

Compiladores e Intrpretes

36

18

Construccin manual del AL

Compiladores e Intrpretes

37

Construccin manual del AL

Compiladores e Intrpretes

38

19

Construccin manual del AL

Compiladores e Intrpretes

39

Construccin manual del AL

Compiladores e Intrpretes

40

20

Construccin manual del AL

Compiladores e Intrpretes

41

Construccin manual del AL

Compiladores e Intrpretes

42

21

Construccin manual del AL

Compiladores e Intrpretes

43

Construccin manual del AL

Compiladores e Intrpretes

44

22

Construccin manual del AL

Compiladores e Intrpretes

45

Construccin manual del AL

Compiladores e Intrpretes

46

23

Construccin manual del AL

Compiladores e Intrpretes

47

Construccin manual del AL

Compiladores e Intrpretes

48

24

Construccin manual del AL

Compiladores e Intrpretes

49

Construccin manual del AL

Compiladores e Intrpretes

50

25

Construccin manual del AL

Compiladores e Intrpretes

51

Construccin manual del AL

Compiladores e Intrpretes

52

26

Construccin manual del AL

Compiladores e Intrpretes

53

Construccin manual del AL

Compiladores e Intrpretes

54

27

Construccin manual del AL

Compiladores e Intrpretes

55

Construccin manual del AL

Compiladores e Intrpretes

56

28

Construccin manual del AL

Compiladores e Intrpretes

57

Construccin manual del AL

Compiladores e Intrpretes

58

29

Construccin manual del AL

Compiladores e Intrpretes

59

Construccin manual del AL

Compiladores e Intrpretes

60

30

Construccin manual del AL

Compiladores e Intrpretes

61

Construccin manual del AL

Compiladores e Intrpretes

62

31

Construccin manual del AL

Compiladores e Intrpretes

63

Construccin manual del AL

Compiladores e Intrpretes

64

32

ndice
1- Definiciones previas 2- Definicin del analizador lxico
2.1- Funcionamiento 2.2- Separacin Lxico-Sintctico 2.3- Errores lxicos

3- Construccin manual del analizador lxico


3.1- Implementacin meidante diagrama de estados 3.2- Implementacin mediante tabla de transiciones 3.4- Gestin de los buffers

4- Generacin automtica de analizadores lxicos


4.1- Lex 4.2- JFlex

5- Atributos de los tokens 6- Decisiones en el diseo

Compiladores e Intrpretes

65

Generacin automtica de AL
Existen muchas herramientas para la generacin automtica de AL. Las ms conocidas:
Lex Flex Coco

Compiladores e Intrpretes

66

33

Generacin automtica de AL: LEX


Generador de analizadores lxicos a partir de expresiones regulares que definen el comportamiento del analizador. Genera cdigo C. Esquema de funcionamiento de LEX:

Compiladores e Intrpretes

67

Generacin automtica de AL: LEX


Algunas consideraciones:
Reglas: equivalen a las expresiones regulares Las ER definen el AFD Yylexx: implementa el AFD Cada regla tiene asociada un conjunto de acciones que se ejecutan cuando yylex encuentra una cadena que coincide con la regla.
Compiladores e Intrpretes 68

34

Generacin automtica de AL: LEX


Algunas consideraciones:
Eficiencia: el nmero de reglas no influye en la eficiencia, slo en el tamao. El tiempo de reconocimiento depende de la cadena de entrada.

Compiladores e Intrpretes

69

Generacin automtica de AL: LEX


Esquema de un fichero LEX:
(zona de declaraciones) [cdigo C o macros] %% (zona de reglas y acciones) %% (zona de rutinas de usuario)

Compiladores e Intrpretes

70

35

Generacin automtica de AL: LEX


Esquema de un fichero LEX:
Zona de declaraciones:
Declaraciones necesarias. Ej: inclusin de ficheros, declaracin de variables, funciones, etc. Cualquier cosa entre %{ %} se copia a la salida

Compiladores e Intrpretes

71

Generacin automtica de AL: LEX


Ej. Zona de declaraciones:
%{ #include <stdio.h> int y; %} digito (0|1|2|3|4|5|6|7|8|9) letraAB (a|b)

Compiladores e Intrpretes

72

36

Generacin automtica de AL: LEX


Esquema de un fichero LEX:
Zona de reglas y acciones: las reglas van en dos columnas
Columna izquierda: ER. Definicin de los patrones a buscar. Columna derecha: acciones. Partes de programa que se ejecutarn si se encuentra una cadena que cumpla el patrn de la izquierda.

Compiladores e Intrpretes

73

Generacin automtica de AL: LEX


Ej. De una especificacin:
%{ #include <stdio.h> int cuenta=0; %} digito (0|1|2|3|4|5|6|7|8|9) %% {digito} {++cuenta} %%

Compiladores e Intrpretes

74

37

Generacin automtica de AL: LEX


Esquema de un fichero LEX:
Zona de rutinas de usuario: aqu se incluyen las rutinas que va a utilizar el usuario.

Compiladores e Intrpretes

75

Generacin automtica de AL: LEX


Definicin de expresiones:
Cada ER contiene:
Caracteres de texto Caracteres operadores

No hay ER para reconocer la palabra vaca.

Compiladores e Intrpretes

76

38

Generacin automtica de AL: LEX


Definicin de expresiones:
Secuencias de escape:
\n: reconoce el retorno de carro \t: reconoce la tabulacin horizontal \v: reconoce la tabulacin vertical \b reconoce un retroceso de un carcter hacia atrs .

Compiladores e Intrpretes

77

Generacin automtica de AL: LEX


Definicin de expresiones:
Operadores: \,?, ., *, +, |, {}, %,<>
\: conversin de caracteres a texto []: clases de caracteres. ^: primera lnea o complementario
Ej. [a-z0-9] (todos los caracteres en minsculas y los dgitos de 0-9. El complementario [^a-z0-9]. Cualquier carcter que no est en la clase

Compiladores e Intrpretes

78

39

Generacin automtica de AL: LEX


Definicin de expresiones:
Operadores:
?: opcional.
Ej: [0-9]+(\.[0-9]+)? Nmero con parte decimal opcional

.: comodn, cualquier carcter menos el salto de lnea *: repeticin de 0 a infinito. (Cierre) +: repeticin de 1 a infinito. (Clausura positiva)

Compiladores e Intrpretes

79

Generacin automtica de AL: LEX


Definicin de expresiones:
Operadores:
|: disyuncin entre dos expresiones regulares Ej. = ab|abc abcdef, reconoce abc.
Reconoce el patrn ms largo

(): agrupamiento $: ltimo de la lnea /: condicional sufijo {}: definiciones {x,y}: repeticin acotada de x a y veces. Es muy costoso : se trata como un carcter de texto

Compiladores e Intrpretes

80

40

Generacin automtica de AL: LEX


Definicin de expresiones:
Operadores:
Dentro de una clase algunos operadores pierden el sentido: ? . * + | ( ) $ / { } % < >

Compiladores e Intrpretes

81

Generacin automtica de AL: LEX


Definicin de expresiones:
Macros y parntesis:
Definicin de macros encerrada entre parntesis Sustitucin literal y concatenada Para definir macros:
nombreMacro (expresin regular) Ej. letra (a|b|c) ident {letra}+

Compiladores e Intrpretes

82

41

Generacin automtica de AL: LEX


Dependencias del contexto:
Dependencias simples: tienen en cuenta el contexto slo en una lnea.
^: reconoce si est al principio de la lnea $: reconoce si est al final de la lnea (no incluye retorno de carro) ^$: reconoce si en la lnea solo hay (no incluye retorno de carro) ^$: reconoce si la lnea no tiene nada (s incluye retorno de carro)
Compiladores e Intrpretes 83

Generacin automtica de AL: LEX


Dependencias del contexto:
Dependencias simples:
/: contiene pero solo si va seguida de (muy costoso)
Ej. =ab/cd entrada= abcd en la entrada. Reconoce ab y deja cd

Compiladores e Intrpretes

84

42

Generacin automtica de AL: LEX


Dependencias del contexto Ejemplo: Un fuente en LEX que elimine todas las lneas completamente en blanco, todos los blancos al principio de una lnea, lneas con solo blancos, todos los blancos al final de la lnea y entre dos palabras consecutivas solo haya un espacio en blanco
^$ ^ +\n ^ + +$ + .|\n return; return; return; return; putchar( ); /*NOTA: funcin de C que inserta un char en el fuente*/ echo;

Compiladores e Intrpretes

85

Generacin automtica de AL: LEX


Dependencias del contexto:
Dependencias complejas: reconoce cualquier expresin dependiendo del contexto en que se encuentre.
Hay que definir los contextos en la zona de declaraciones Reconoce una expresin y ejecuta las acciones asociadas slo si se est en el contexto. Entrar en un contexto: BEGIN(ci). Por defecto se est en el contexto INITIAL, tambin denominado 0 (referirse a 0 por compatibilidad) Las reglas de INITIAL se reconocen en cualquier contexto. el orden de las reglas es importante.

Compiladores e Intrpretes

86

43

Generacin automtica de AL: LEX


Dependencias del contexto:
Dependencias complejas Ej: eliminar los comentarios C de un fichero
%x COM COD %% BEGIN(COD) <COD>/* BEGIN(COM); <COD>.|\n ECHO; <COM>*/ BEGIN(COD); <COM>.|\n ; %%
Compiladores e Intrpretes 87

Generacin automtica de AL: LEX


Generacin del analizador:
Fichero fuente de texto con extensin .l Ejecutar lex. Genera un fichero con extensin .c Compilar con una rutina que llame a yylex()

Compiladores e Intrpretes

88

44

Generacin automtica de AL: LEX


Estructura de los ficheros:
Ansic.h: contiene la definicin de los tokens y sus atributos
typedef union { int i; float r; char *s; }YYSTYPE; extern YYSTYPE yylval; #define C_CARACTER 258 #define C_FLOAT 259 #define C_ENTERA 260 #define STRING 261 #define ID 262
Compiladores e Intrpretes 89

Generacin automtica de AL: LEX


Lex.l: fuente lex Reservadas.c: tabla de palabras reservadas, implementacin y procedimiento de bsqueda.
static const struct { char *nombre; int token; } palabras_clave [] = { {auto, Auto}, {break, Break}, . } int busca_palabra (void){ .... }

Compiladores e Intrpretes

90

45

Generacin automtica de AL: LEX


Acciones.c: la implementacin de las funciones y procedimientos que forman las acciones de las ER.

Compiladores e Intrpretes

91

Generacin automtica de AL: LEX


Estructura de los ficheros:
Global.h: contiene la definicin de todas las variables que son globales a todas las partes del compilador.
Ej. Yyin, yyfuente, token, yylineno, yycolumno, yycaracter, yytext, yyval

Compiladores e Intrpretes

92

46

Generacin automtica de AL: LEX


El fichero con acciones.c:
Prototipos (todas las funciones de lex) Cdigo global (zona de declaraciones) int yylex(void){
Cdigo local (cdigo inicial en seccin reglas no asociado a E.R.) Simulacin autmata

} rutinas usuarios (zona de rutinas de usuario) tablas de transicin del autmata AFD
Compiladores e Intrpretes

93

Generacin automtica de AL: LEX


Variables predefinidas:
Char *yytext: cadena de caracteres (prefijo) validada por la ltima regla Int yyleng: la longitud del ltimo prefijo FILE *yyin: puntero al fichero de entrada (teclado) FILE *yyout: puntero la fichero de salida (pantalla)

Compiladores e Intrpretes

94

47

Generacin automtica de AL: LEX


Acciones predefinidas:
ECHO: muestra el ltimo prefijo por pantalla #define ECHO fprintf(yyout, %s, yytext) BEGIN (C): cambia de contexto output(c): manda el carcter c al fichero yyout input(c): lee un carcter del fichero yyin unput(c): devuelve el carcter al fichero yyin yyless(n): deja los n primeros caracteres en yytext y devuelve los restantes al fichero de entrada

Compiladores e Intrpretes

95

Generacin automtica de AL: LEX


Acciones predefinidas:
Ej:=-[a-zA-Z]+{
fprintf (yyout, devolvemos el identificador); yyless(2);

Compiladores e Intrpretes

96

48

Generacin automtica de AL: LEX


Acciones predefinidas:
yymore(): mantiene el prefijo anterior
Ej. ab12 yytext=ab ; yytext=12; Con yymore: yytext=ab ; yymore(); yytext=ab12;

Compiladores e Intrpretes

97

Generacin automtica de AL: LEX


Acciones predefinidas:
Ej. Un reconocedor de cadenas en C (caracteres entre comillas dobles y dentro puede aparecer comillas dobles precedida de \)
%{ #include <stdio.h> %} \[^\]*\ { if(yytext[yyleng-2]=`\`){ yyless(yyleng-1); yymore(); }else ECHO; } .|\n ;

Compiladores e Intrpretes

98

49

Generacin automtica de AL: LEX


Ante la entrada:
esto es una prueba: la salida es esto es una prueba. Se cumple el primer patrn, la parte del else. esto es una prueba: no se muestra nada ya que se cumple la segunda regla. esto es una prueba: se ejecuta el primer patrn, luego como hay un espacio se ejecuta el segundo y luego de nuevo el primero. Ambas veces el caso del else
Compiladores e Intrpretes 99

Generacin automtica de AL: LEX


Ante la entrada:
esto es una prueba: se ejecuta en el primer caso el primer patrn (se imprime esto es, luego se ejecuta el segundo esto es \una \ prueba: la salida es esto es \una \prueba

Compiladores e Intrpretes

100

50

Generacin automtica de AL: LEX


Acciones predefinidas: REJECT: desactiva una regla temporalmente hasta que se reconozca un prefijo. No es compatible con BEGIN. Desactiva las reglas que tiene a la derecha.
1 {a1; REJECT;} 2 a2; 3 a3; 1 no se valida hasta que se reconozca un prefijo

int yywrap(void): programa acciones ante el fin de fichero. Lex verifica el final de fichero de la siguiente forma:
Utilidad: definir acciones finales y cambiar de fichero fuente (preprocesador). if (c=input()) = = EOF && yywrap() ) return 0; else { ..continua..... }

Compiladores e Intrpretes

101

Generacin automtica de AL: LEX


Observaciones:
Los caracteres que se leen y no hacen coincidencia con ninguna E.R. van por defecto a yyout. Para evitar esto, se puede aceptar y no hacer ninguna accin ( . {;}) La llamada a yylex termina cuando encuentra eof (and yywarp()) o cuando ejecuta un return Da igual en E.R. texto entre comillas o no, (texto = texto)

Compiladores e Intrpretes

102

51

Generacin automtica de AL: LEX


Tratamiento de ambigedades:
Ej.: identificar palabras reservadas e identificadores %{ #define PAL_RES 1 #define IDEN 2 %} ident ([a-zA-Z]([a-zA-Z0-9])* %% if| Then |else return PAL_RES; {ident} return IDEN; %%
Compiladores e Intrpretes 103

Generacin automtica de AL: LEX


Tratamiento de ambigedades:
En la entrada: then
Si coinciden con dos E.R. se ejecuta el aj de la primera desde arriba hacia abajo (devuelve PAL_RES)

Entrada: ifthenelse
Si coinciden con varias E.R. se toma la que reconoce entrada de mayor longitud. (devuelve IDEN)

Compiladores e Intrpretes

104

52

Generacin automtica de AL: LEX


Ejemplo bsico de definicin Lex:
Ejemplo numPal.l: Enunciado:
Listar por pantalla los nmeros y palabras que se encuentra anteponindoles el prefijo palabra: y numero: respectivamente

Compiladores e Intrpretes

105

Generacin automtica de AL: LEX


Ejemplo bsico de definicin Lex
Entrada: 123 hola palabra 2345 otra palabraMixta23

Salida:

Compiladores e Intrpretes

106

53

Generacin automtica de AL: LEX


%{ #include <stdio.h> #include <string.h> #include <stdlib.h> %} numero [0-9]+ palabra [a-zA-Z]+ %% {numero} {fprintf(yyout,"%s","numero: "); ECHO; fprintf(yyout,"%c",'\n');} {palabra} {fprintf(yyout,"%s","palabra: "); ECHO; fprintf(yyout,"%c",'\n');} .|\n ECHO; %% FILE *abre_f(const char *nombre, const char *modo){ return fopen(nombre,modo); } void main (int argc, char *argv[]){ if (argc == 1)printf("No se ha especificado entrada"); if (argc >= 2)yyin = abre_f(argv[1], "r"); if (argc == 3)yyout = abre_f(argv[2], "w"); if (yyin != NULL) yylex(); if (argc >= 2)yyin = fclose(yyin); if (argc == 3)yyout = fclose(yyout); exit(0); }

Solucin

Compiladores e Intrpretes

107

Generacin automtica de AL: JFLEX


Motivacin:
Sintaxis muy parecida a la de Lex Interfaz grfica para generar el analizador Genera cdigo Java

Compiladores e Intrpretes

108

54

Generacin automtica de AL: JFLEX


A partir de la especificacin JFLEX se crea un fichero .java que contiene el scanner. En la clase que se crea hay un mtodo llamado yylex que ejecuta el analizador.

Compiladores e Intrpretes

109

Generacin automtica de AL: JFLEX


La especificacin de JFLEX se divide en tres partes igual que LEX:
Cdigo de usuario Opciones y declaraciones Reglas lxicas

Compiladores e Intrpretes

110

55

Generacin automtica de AL: JFLEX


Cdigo de usuario: el texto que se introduce aqu se copia directamente en la parte de arriba del analizador generado.
Se introducen los imports necesarios.

Compiladores e Intrpretes

111

Generacin automtica de AL: JFLEX


Opciones y declaraciones: se componen de:
Conjunto de opciones Cdigo que se introducen dentro de la clase del analizador Ambientes Declaraciones de macros

Cada una de las opciones se pone con %


Compiladores e Intrpretes 112

56

Generacin automtica de AL: JFLEX


Algunas variables son:
%class Lexer: comunica a Jflex que la clase debe llamarse lexer. %cup: establece la compatibilidad de Jflex con CUP. %line: permite que se puedan contar las lneas. %column: permite que se puedan contar las columnas.
Compiladores e Intrpretes 113

Generacin automtica de AL: JFLEX


Algunas variables son:
Char: permite contar los caracteres

El cdigo que se encuentra entre %{%} se copia directamente en la clase generada.

Compiladores e Intrpretes

114

57

Generacin automtica de AL: JFLEX


Opciones y declaraciones:
Declaracin de macros
Se usan para hacer las especificaciones lxicas ms entendibles. Consisten en un identificador seguido de = y luego una expresin regular

Declaracin de ambientes
%state listaAmbientes

Compiladores e Intrpretes

115

Generacin automtica de AL: JFLEX


Reglas lxicas: esta seccin contiene:
Expresiones regulares y acciones El analizador va leyendo la cadena de entrada y activa la expresin que tiene mayor longitud. Se pueden utilizar los ambientes lxicos funcionan como una condicin.
YYINITIAL es el ambiente predefinido Begin: activa un ambiente.
Compiladores e Intrpretes 116

58

Generacin automtica de AL: JFLEX


Operadores:
a|b : opcin a b a b: concatenacin a*: cierre a+: iteracin desde 1 a?: 0 1 vez !a: negacin ~a: hasta a a{n}: repetir n veces la concatenacin de a
Compiladores e Intrpretes 117

Generacin automtica de AL: JFLEX


Operadores:
a{n,m}: repeticin de n a m veces (a): coincide con la entrada de a

Compiladores e Intrpretes

118

59

Generacin automtica de AL: JFLEX


Algunos mtodos:
String yytext(): devuelve lo que se ha ledo Int yylength(): devuelve la longitud de la cadena de entrada. Int yyline(): devuelve la lnea de la entrada actual pero empezando en 0. Yychar: el carcter actual pero empezando en 0 Int column(): devuelve la columna

Compiladores e Intrpretes

119

Generacin automtica de AL: JFLEX


Ejecucin de JFLEX:
Arrancar el archivo JFlex.jar Se visualiza la interfaz grfica:

Compiladores e Intrpretes

120

60

Generacin automtica de AL: JFLEX


Cargar la especificacin lxica haciendo clic en lo sealado

Compiladores e Intrpretes

121

Generacin automtica de AL: JFLEX


Finalmente se hace clic en Generate y se crear el analizador lxico. Si hay algn error se indica en la pantalla de Messages.

Compiladores e Intrpretes

122

61

ndice
1- Definiciones previas 2- Definicin del analizador lxico
2.1- Funcionamiento 2.2- Separacin Lxico-Sintctico 2.3- Errores lxicos

3- Construccin manual del analizador lxico


3.1- Implementacin meidante diagrama de estados 3.2- Implementacin mediante tabla de transiciones 3.4- Gestin de los buffers

4- Generacin automtica de analizadores lxicos


4.1- Lex 4.2- JFlex

5- Atributos de los tokens 6- Decisiones en el diseo

Compiladores e Intrpretes

123

Atributos de los Tokens


Debe haber un compromiso entre el lxico y el sintctico. (forma de comunicarse) El lxico debe informar al sintctico de los tokens que ha reconocido, pero qu ms debe proporcionarle?

Compiladores e Intrpretes

124

62

Atributos de los Tokens


Principales tokens:
Identificadores
1. 2.

Devolver el lexema + el token en cuestin Devolver una entrada a la tabla de smbolos. de manejo de la tabla.

mtodos

Nmeros
1. 2.

3.

Devolver el lexema problemtica Valor numrico asociado al lexema (hilera de dgitos)+ token funciones de conversin Crear una tabla de constantes y devolver la entrada a la misma.

Compiladores e Intrpretes

125

Atributos de los Tokens


Principales tokens:
Operadores
1. 2.

No hay atributo Agruparse todos los operadores del mismo tipo (binario, ternario, etc.) en un solo token y el atributo distingue cual es. No tiene atributo Crear un buffer de hileras y se devuelve el puntero a su inicio.

Hileras de caracteres
1. 2.

Compiladores e Intrpretes

126

63

ndice
1- Definiciones previas 2- Definicin del analizador lxico
2.1- Funcionamiento 2.2- Separacin Lxico-Sintctico 2.3- Errores lxicos

3- Construccin manual del analizador lxico


3.1- Implementacin meidante diagrama de estados 3.2- Implementacin mediante tabla de transiciones 3.4- Gestin de los buffers

4- Generacin automtica de analizadores lxicos


4.1- Lex 4.2- JFlex

5- Atributos de los tokens 6- Decisiones en el diseo

Compiladores e Intrpretes

127

Decisiones de Diseo
Palabras reservadas
Las palabras reservadas pueden o no ser identificadores. Lo ms sencillo es que las palabras reservadas no sean identificadores, en este caso ocurre que el mismo patrn suele definir a ambos. Soluciones:
Expresin regular para cada lexema que define la palabra reservada Tabla de palabras reservadas con sus tokens. El lexema se busca y si no existe es un identificador.

Compiladores e Intrpretes

128

64

Decisiones de Diseo
Maysculas y minsculas
Una funcin que transforma de minsculas a maysculas.
Si se quiere que el lenguajes no distinga invocar siempre a dicha funcin. Si se quiere que se distinga no se hace nada.

Compiladores e Intrpretes

129

Decisiones de Diseo
Longitud de los identificadores
Un buffer que permita toda la longitud que se quiera.
Si el lenguaje quiere limitar una funcin que trunca el lexema a un mximo y este es con el que se trabaja.

Compiladores e Intrpretes

130

65

Decisiones de Diseo
Nmeros
Si hay varios tipos (entero, real, doble, etc.), un token para cada uno de ellos. Determinar la notacin de los mismos. Utilizar funciones para determinar el valor a partir del lexema.

Comentarios
El problema es detectar los fines de lneas dentro de ellos para mantener informacin de la lnea actual.
Crear un entorno para gestionarlo.

Compiladores e Intrpretes

131

Decisiones de Diseo
Hilera de caracteres
Definir muy bien cmo es una hilera y encontrar su expresin regular que la defina.

Compiladores e Intrpretes

132

66