Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Compiladores e Intrpretes
ndice
1.1 1.2 DEFINICIN DEL ANALIZADOR LXICO GENERACIN AUTOMTICA DE ANALIZADORES LXICOS (LEX)
1.2.1 1.2.2 1.2.3 1.2.4 Expresiones Regulares (E.R.) Dependencias del contexto Generacin de un fichero y variables predefinidas Tratamiento de las ambigedades
ATRIBUTOS DE LOS TOKENS DECISIONES EN EL DISEO TABLA DE SMBOLOS (T.S.) IMPLEMENTACIN DEL ANALIZADOR LXICO CONSTRUCCIN MANUAL DEL ANALIZADOR LXICO
1.7.1 1.7.2 1.7.3 Implementacin mediante tabla de transiciones Implementacin con reglas y acciones de un fuente lex Gestin de los buffers
Compiladores e Intrpretes
Lexema secuencia de caracteres Token: conjunto asociado de lexemas (forman un lenguaje). Este lenguaje es descrito por gramticas regulares o por expresiones regulares. Especificar un token: Expresin regular que describe sus lexemas Atributos Algoritmos que calculan los atributos
Compiladores e Intrpretes
Compiladores e Intrpretes
<token, atributos> = aj(texto) El objetivo del algoritmo aj es determinar el token y sus atributos.
Compiladores e Intrpretes 5
Compiladores e Intrpretes
Compiladores e Intrpretes
Compiladores e Intrpretes
Compiladores e Intrpretes
10
Negativa: [^a1a2..an], cualquier carcter que no es a1,a2,...,an Dentro de una clase pierde el sentido de operador (por lo tanto no necesito precederlo de o \ para denotar carcter): ?.*+|()$/{}%<>
ej.: [0-9], reconoce un dgito entre 0 y 9.
Compiladores e Intrpretes 12
Ej. = ab|abc abcdef, reconoce abc. para reconocer todo: (.|\n) Clausura: * Clausura positiva: + Ej: [0-9][a-z0-9]*
Compiladores e Intrpretes
13
Macros y parntesis:
La definicin de macros debe ir encerrada entre ( ) ya que la sustitucin es literal y concatenada. Def. de macro: nombre_macro exprRegular Referencia a una macro: {nombre_macro} Ej: letra a|b|c....|z Ident {letra}+ esto es igual a a|b|c....|z+ = {a,b,c..,z,zz,zzz,...}
Compiladores e Intrpretes 14
Compiladores e Intrpretes
15
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 17
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 20 restantes al fichero de Compiladores e Intrpretes entrada
Compiladores e Intrpretes
22
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).
23
Compiladores e Intrpretes
24
Compiladores e Intrpretes
25
devolver el lexema problemtica devolver una entrada a la tabla de smbolos. manejo de la tabla.
mtodos de
Nmeros
1. 2.
3.
Devolver el lexema problemtica Valor numrico asociado al lexema (hilera de dgitos) funciones de conversin Crear una tabla de constantes y devolver la entrada a la misma.
Compiladores e Intrpretes 26
No hay atributo Agruparse todos los operadores del mismo tipo (binario, ternario, etc.) en un solo token y el atributo distingue cual es.
Hileras de caracteres
1. 2.
Compiladores e Intrpretes
27
DECISIONES EN EL 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.
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 28
DECISIONES EN EL 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.
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.
Hilera de caracteres
Definir muy bien cmo es una hilera y encontrar su expresin regular que la defina. Compiladores e Intrpretes 29
En la fase de anlisis lxico se crean las distintas entradas en la tabla El resto de las fases de compilacin introducen y completan atributos
(el sintctico y semntico: tipo de datos, generacin de cdigo: detalle sobre la memoria.)
Compiladores e Intrpretes 30
Funcionamiento:
El analizador en primer lugar buscar el lexema encontrado en la tabla y si no lo encuentra lo inserta. En caso de que lo encuentre no debe hacer nada en la tabla.
Compiladores e Intrpretes
31
Compiladores e Intrpretes
32
Compiladores e Intrpretes
35
Compiladores e Intrpretes
36
a i F
N(s)
s|t
N(t)
Compiladores e Intrpretes
37
a 2 b 4 5 3
Ejemplo: (a|b)*
0 1 6
Compiladores e Intrpretes
38
Compiladores e Intrpretes
39
Hay que tener en cuenta que al llegar a un estado final, la variable yytext debe tener el lexema y que es posible tener que devolver al fichero de entrada posibles caracteres de adelanto.
Compiladores e Intrpretes 40
2.
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. Uso de buffers: Parejas de buffers:
Compiladores e Intrpretes 41
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 que encuentro un token Devuelvo token y coloco comienzo_lexema y delantero en el primer carcter del token Cando termina una mitad, recarga la otra y continua hasta encontrar token.
Compiladores e Intrpretes 42
45