Diseño de compiladores

Diseño de compiladores

Este libro es una introducción a las técnicas de construcción de compiladores, aunque gran parte de sus contenidos pueden también aplicarse al diseño de otros programas de traducción entre lenguajes informáticos. El libro aúna los principios teóricos y los aspectos prácticos de la materia, haciendo especial énfasis en el diseño de traductores de lenguajes procedimentales. Al final de cada capítulo se propone una serie de problemas, cuya solución puede encontrarse en uno de los apéndices. Asimismo, se incluyen algunos proyectos de programación que permiten asentar los conocimientos adquiridos. Los contenidos del texto son suficientes para organizar en torno a ellos un curso de "Procesadores de lenguaje", materia troncal en las titulaciones de Ingeniería en Informática.

  • Índice General
  • Prólogo
  • 1 Introducción
    • 1.1 ¿Qué es un compilador? Tipos de compiladores
      • 1.1.1 Tipos de compiladores
    • 1.2 Historia de los primeros compiladores
      • 1.2.1 El primer lenguaje y su compilador: FORTRAN
      • 1.2.2 El lenguaje algorítmico ALGOL
      • 1.2.3 Las primeras técnicas para desarrollar compiladores
      • 1.2.4 Técnicas actuales para el desarrollo de compiladores
    • 1.3 Estructura de un compilador
      • 1.3.1 Las fases de un compilador
      • 1.3.2 Implementación del compilador a partir de las fases
    • 1.4 ¿Cómo se especifica un compilador?
    • 1.5 Aplicaciones de estas técnicas
    • 1.6 Referencias bibliográficas
  • 2 Análisis léxico
    • 2.1 El papel del analizador léxico
    • 2.2 Errores léxicos
    • 2.3 Funcionamiento del analizador léxico
    • 2.4 Especificación de un analizador léxico
      • 2.4.1 Definiciones de términos comunes en esta fase
      • 2.4.2 Identificación de palabras reservadas
    • 2.5 Implementación de analizadores léxicos
      • 2.5.1 Prioridad de tokens
    • 2.6 Referencias bibliográficas
    • 2.7 Ejercicios
  • 3 Análisis sintáctico
    • 3.1 La función del analizador sintáctico
    • 3.2 Diseño de gramáticas
      • 3.2.1 Recursividad
      • 3.2.2 Ambigüedad
      • 3.2.3 Asociatividad y precedencia de los operadores
    • 3.3 Tipos de análisis sintáctico
    • 3.4 Referencias bibliográficas
    • 3.5 Ejercicios
  • 4 Análisis sintáctico descendente
    • 4.1 Introducción
      • 4.1.1 Análisis con retroceso
      • 4.1.2 Analizadores sintácticos predictivos
      • 4.1.3 Conjuntos de predicción
    • 4.2 Cálculo de los conjuntos de predicción
      • 4.2.1 Cálculo del conjunto de primeros
      • 4.2.2 Cálculo del conjunto de siguientes
      • 4.2.3 Cálculo del conjunto predicción
    • 4.3 La condición LL(1)
    • 4.4 Modificación de gramáticas no LL(1)
      • 4.4.1 Eliminación de la ambigüedad
      • 4.4.2 Factorización por la izquierda
      • 4.4.3 Eliminación de la recursividad por la izquierda
    • 4.5 Analizador descendente recursivo
    • 4.6 ASDP dirigidos por tabla
    • 4.7 Manipulación de errores
    • 4.8 Referencias bibliográficas
    • 4.9 Ejercicios
  • 5 Análisis sintáctico ascendente
    • 5.1 Introducción
    • 5.2 Análisis sintáctico por desplazamiento y reducción
    • 5.3 Método SLR de construcción de tablas de análisis
      • 5.3.1 Construcción de la colección canónica de conjuntos de elementos
      • 5.3.2 Construcción de autómatas reconocedores de prefijos viables
      • 5.3.3 Construcción de tablas SLR
      • 5.3.4 Construcción de tablas SLR a partir del autómata reconocedor de prefijos viables
    • 5.4 Conflictos en las tablas SLR
    • 5.5 Mensajes de error en un analizador SLR
    • 5.6 Clasificación de gramáticas
    • 5.7 Referencias bibliográficas
    • 5.8 Ejercicios
  • 6 Traducción dirigida por la sintaxis
    • 6.1 Introducción
    • 6.2 Gramáticas de atributos
    • 6.3 Tipos de atributos
    • 6.4 Grafos de dependencias
    • 6.5 Especificación de un traductor
      • 6.5.1 Definiciones dirigidas por sintaxis
      • 6.5.2 Esquemas de traducción
    • 6.6 Referencias bibliográficas
    • 6.7 Ejercicios
  • 7 Implementación de traductores
    • 7.1 Introducción
    • 7.2 Traductores descendentes recursivos
      • 7.2.1 Eliminación de la recursividad izquierda
      • 7.2.2 Factorización izquierda
      • 7.2.3 Implementación de un traductor descendente recursivo
    • 7.3 Traductores ascendentes
      • 7.3.1 Equivalencia entre estados y símbolos
      • 7.3.2 Implementación de ETDS sencillos
      • 7.3.3 Implementación de ETDS más complejos
      • 7.3.4 Notación de YACC
      • 7.3.5 ETDS con atributos heredados
      • 7.3.6 Principales usos de los marcadores
    • 7.4 Referencias bibliográficas
    • 7.5 Ejercicios
  • 8 Tipos y generación de código
    • 8.1 Introducción
    • 8.2 Gestión de la tabla de símbolos
    • 8.3 Representaciones intermedias
    • 8.4 Comprobaciones y conversiones de tipos
    • 8.5 Código intermedio para expresiones
    • 8.6 Código intermedio para instrucciones
    • 8.7 Tipos compuestos
      • 8.7.1 Tabla de tipos
      • 8.7.2 Ámbitos y tabla de tipos
      • 8.7.3 Equivalencia de tipos
    • 8.8 Código intermedio para arrays
    • 8.9 Código intermedio para registros
    • 8.10 Referencias bibliográficas
    • 8.11 Ejercicios
  • 9 Compilación de subprograms
    • 9.1 Introducción
      • 9.1.1 El entorno de ejecución
      • 9.1.2 Registro de activación
      • 9.1.3 Secuencias de llamada y retorno
      • 9.1.4 Comprobaciones semánticas
      • 9.1.5 Implementación con m2r
      • 9.1.6 Valor devuelto
      • 9.1.7 Gestión de la tabla de tipos
      • 9.1.8 Parámetros y argumentos
    • 9.2 Funciones sin recursividad
      • 9.2.1 Compilación del cuerpo de la función
      • 9.2.2 Compilación de la llamada a la función
    • 9.3 Funciones con recursividad
      • 9.3.1 Compilación del cuerpo de la función
      • 9.3.2 Compilación de instrucciones
      • 9.3.3 Compilación de la llamada
      • 9.3.4 Traducción a m2r de la función factorial
    • 9.4 Funciones locales
      • 9.4.1 Encadenamiento de accesos
      • 9.4.2 Display
    • 9.5 Paso de parámetros
    • 9.6 Referencias bibliográficas
    • 9.7 Ejercicios
  • A: Soluciones a los ejercicios
    • A.1 Soluciones a los ejercicios del capítulo 2
    • A.2 Soluciones a los ejercicios del capítulo 3
    • A.3 Soluciones a los ejercicios del capítulo 4
    • A.4 Soluciones a los ejercicios del capítulo 5
    • A.5 Soluciones a los ejercicios del capítulo 6
    • A.6 Soluciones a los ejercicios del capítulo 7
    • A.7 Soluciones a los ejercicios del capítulo 8
    • A.8 Soluciones a los ejercicios del capítulo 9
  • B: Ejercicios prácticos propuestos
    • B.1 Analizador léxico
    • B.2 Analizador sintáctico descendente recursivo
    • B.3 Analizador SLR
    • B.4 Traductor descendente recursivo
    • B.5 Traductor ascendente
    • B.6 Compilador para un lenguaje sencillo
      • B.6.1 Especificación semántica
    • B.7 Compilador con tipos complejos
      • B.7.1 Especificación semántica
    • B.8 Compilador con funciones
      • B.8.1 Especificación semántica
      • B.8.2 Ampliación opcional: funciones locales
  • C: El lenguaje intermedio m2r
  • Bibliografía

SUBSCRIBE TO OUR NEWSLETTER

By subscribing, you accept our Privacy Policy