Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso 2018/2018
Contacto: adan_0203@hotmail.com,agarnica@dep.fie.umich.mx
1 Introducción
Contenido sintético
Bibliografía
Metodología
Diagnóstico
3 Analizador Léxico
Lexemas y lenguajes regulares
Autómatas de estado Finito y reconocimiento de lexemas
Conversión de expresiones regulares a autómatas finitos
Generador de analizadores léxicos
LEX
Objetivo
Tema Horas
1. Introducción a los compiladores 3
2. Análisis léxico 7
Proyecto 1. Implementación de un analizador léxico
Examen Parcial 1 2
3. Tabla de símbolos 7
4. Análisis sintáctico 9
Proyecto 2. Implementación de un analizador sintáctico
Examen Parcial 2 2
5. Análisis semántico 7
6. Generación de código intermedio 9
Examen Parcial 3 2
Proyecto 3. A definir por el profesor
Total 48
Bibliografía básica
Alfred Aho, Ravi Sethi y Jeffrey Ullman. Compiladores: Principios,
Técnicas y Herramientas. Pearson Education, Segunda Edición,
2008.
Metodología de enseñanza-aprendizaje
Revisión de conceptos, análisis y solución de problemas en clase X
Lectura de material fuera de clase X
Ejercicios fuera de clase (tareas) X
Investigación documental
Elaboración de reportes técnicos o proyectos X
Prácticas de laboratorio en una materia asociada
Visitas a la industria
Metodología de evaluación:
Asistencia:
Tareas: 10 %
Elaboración de reportes técnicos o proyectos: 30 %
Exámenes de Academia o Departamentales 60 %
Términos importantes
Compilador
Términos importantes
Términos importantes
Algoritmo: Conjunto ordenado de pasos que permiten llegar a la
solución de un problema.
Programa: es una secuencia de instrucciones, escritas para
realizar una tarea específica en una computadora.
Lenguaje de programación: Está formado por un conjunto de
símbolos y reglas sintácticas y semánticas que definen su
estructura y el significado de sus elementos y expresiones. Al
proceso por el cual se escribe, se prueba, se depura, se compila
(de ser necesario) y se mantiene el código fuente de un programa
informático se le llama programación.
Código Fuente: es un conjunto de líneas de texto con los pasos
que debe seguir la computadora para realizar alguna tarea
específica. El código fuente de un programa está escrito en algún
lenguaje de programación, pero no es directamente ejecutable
por la computadora, sino que debe ser traducido a otro lenguaje o
código binario.
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 10 / 50
Introducción Diagnóstico
Términos importantes
Lenguaje Compilado: Un lenguaje compilado es aquel cuyo
código fuente, escrito en un lenguaje de alto nivel, es traducido
por un compilador a un archivo ejecutable entendible para la
máquina en determinada plataforma. Con ese archivo se puede
ejecutar el programa cuantas veces sea necesario sin tener que
repetir el proceso por lo que el tiempo de espera entre ejecución y
ejecución es ínfimo.
Lenguaje interpretado: se encargan de realizar la traducción
instrucción a instrucción a la vez que se ejecuta el programa. Son
más lentos, pero mejores cuando el proceso de
traducción/ejecución se realiza en repetidas ocasiones, por lo que
son más adecuados para principiantes.
Código objeto: En programación, se llama código objeto al
código que resulta de la compilación del código fuente.? Puede
ser en lenguaje máquina o bytecode, y puede distribuirse en
varios archivos que corresponden a cada código fuente
compilado.
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 11 / 50
Introducción Diagnóstico
Términos importantes
Función de un compilador
Fases de un compilador
Fases de un compilador
Fases de un compilador
Fases de un compilador
Análisis de código fuente:
Analizador léxico
Analizador léxico: A la primera fase de un compilador se le llama
análisis de léxico o escaneo. El analizador de léxico lee el flujo de
caracteres que componen el programa fuente y los agrupa en
secuencias significativas, conocidas como lexemas. Para cada
lexema, el analizador léxico produce como salida un token.
token: es una secuencia de caracteres que forman una unidad
significativa.
<nombre-token, valor-atributo> que pasa a la fase siguiente, el
análisis de la sintaxis. En el token, el primer componente
nombre-token es un símbolo abstracto que se utiliza durante el
análisis sintáctico, y el segundo componente valor-atributo apunta
a una entrada en la tabla de símbolos para este token.
Fases de un compilador
Fases de un compilador
Fases de un compilador
definición de términos
Definición de términos
Lenguajes regulares
Lenguaje de programación
Un lenguaje de programación se puede definir como:
Notación formal para describir algoritmos o funciones que serán
ejecutadas por una computadora.
Lenguaje para comunicar instrucciones a la computadora.
Convención para escribir descripciones que pueden ser
evaluadas.
Dentro de los atributos de un buen lenguaje están:
Claridad y sencillez
Naturalidad para la aplicación
Apoyo para la abstracción
Facilidad para verificar programas
Entorno de programación
Portabilidad de programas
Costo de uso
Costo de ejecución
Costo de traducción
Costo
M.c. Adan Garnicade creación
Carrillo (FIE) y pruebaCompiladores Compiladores, 2018 28 / 50
Analizador Léxico Autómatas de estado Finito y reconocimiento de lexemas
Reconocimiento de lexemas
Expresiones regulares
Expresiones regulares básicas
Los caracteres del propio alfabeto los cuales se corresponden a sí
mismos.
La cadena vacía, es decir la cadena que no contiene ningún
carácter.
Operaciones de expresiones regulares
Concatenación
Repetición o cerradura (Si Se indica mediante el carácter *
asterisco)
Sea r una expresión regular, entonces r* denota cualquier
concatenación finita de cadenas cada una de las cuales
corresponde a r incluyendo la cadena vacía.
La cerradura positiva se indica mediante el metasímbolo +; no
incluye la cadena vacía.
LEX
LEX
LEX
LEX
Expresiones Regulares
Expresiones regulares
r* cero o más apariciones de r
r+ una o más r’s
r? cero o una r’s (una r opcional)
r{2,5} entre 2 y 5 repeticiones de r’s
r{2,} dos o más r’s
r{4} exactamente 4 r’s
{exp} Expande una definición de expresión regular llamada exp
\0 un carácter nulo 0 en el código ASCII
\123 El carácter con el valor octal 123
\x2a El carácter con el valor hexadecimal 2a
(r) Coincide con una r los paréntesis sirven para agrupar
rs La expresión regular r seguida de la expresión regular s
r|s rós
^r Se acepta una expresión r sólo si está al inicio de la linea.
r$ Se acepta una expresión r sólo si aparece al final de la linea.
Acciones e LEX
Especificaciones ambiguas.
LEX tiene la capacidad de manejar especificaciones ambiguas de las
siguiente forma:
Se toma la coincidencia más larga
Si se coincide exactamente con dos especificaciones se toma la
que se haya definido primero (ojo con esto).
Si se requiere validar todas las alternativas se utiliza la acción
REJECT, lo cual reajusta adecuadamente el puntero de la entrada
para validar la siguiente alternativa.
Ejemplo (primera aparición)
a[cd]+ ECHO; printf("Primera especificación \n");
a[bc]+ ECHO; printf("Segunda especificación \n");
Existen tres formas de tratar este problema. En cada caso, hay órdenes
que reconocen y reflejan la necesidad de cambiar el entorno en el cual
se analiza el texto de entrada.
Uso de flags(banderas)
Se utilizan en el código de la acción léxica.
Prácticamente se libera a LEX del problema. Uso de condiciones
start con órdenes
Es LEX el que se encarga de tratar con la sensibilidad izquierda a
través de condiciones start.
Uso de varios analizadores léxicos funcionando juntos
A veces se da una mayor claridad si se utilizan diferentes
analizadores léxicos y cambiar de uno a otro según se requiera.
Ejemplo
Utilizando flags
%{
int flag ="\0";
%}
%%
^a {flag = ”a”; ECHO;}
^b {flag = ”b”; ECHO;}
^c {flag = ”c”; ECHO;}
\n {flag = ”\0”; ECHO;}
hola {switch(flag){
case ’a’:
printf("primero"); flag ="\0"; break;
case ’b’:
printf("segundo"); flag ="\0"; break;
case ’c’:
printf("tercero"); flag ="\0"; break;
default: ECHO; break;
}}
M.c. Adan Garnica Carrillo (FIE) Compiladores Compiladores, 2018 48 / 50
Analizador Léxico LEX