Compilación: Proceso de traducir un programa en un lenguaje de alto nivel a otro de bajo nivel.
Fases del Compilador
Análisis Sintático: Scanning Parsing AST
Análisis Contextual: Identificación Verificación de tipos Generación del DAST
Identificación Es la primera tarea del contextual analyzer.
* Asocia applied ocurrence con la declaración correspondiente.
println (c);
a= a + 3
* Debe verificar en que parte del programa se puede utilizar una variable de acuerdo a las reglas de alcance o reglas de tipo.
Ver todo el resumen >>>
Reglas de alcance
* Cada declaración tiene un alcance que indica el área donde un identificador puede ser usado.
* Un bloque es cualquier área de un programa que delimita el alcance de una declaración. (llaves, paréntesis, corchetes, etc.).
Estructura de bloques
Indican si los bloques pueden ser:
* Monolíticos todas las declaraciones son globales.
* Plano no pueden haber bloques dentro de otros.
* Anidados pueden haber bloques dentro de otros.
* Ningún identificador puede ser declarado más de una vez en el mismo bloque. Puede ser declarado en diferentes bloques.
* Se utiliza el scope o el nivel de mayor.
* Nivel 0, Nivel 1 y Nivel 2
Tabla de identificación:
Estructura de datos (en memoria) que contiene los identificadores del programa con su respectivo número de alcance.
* Operaciones básicas:
* Crea tabla vacía
* Agrega un identificador nuevo
* Asocia cada identificador con el número de alcance.
* Es parte del AST decorado.
* Método enter agrega nuevo identificador
* Método retrieve la declaración de un identificar.
* Método openScope inicializa el bloque.
* Método closeScope finaliza un bloque
Implementación
Key = índice >Tiene un índice
Value = valor >Comienza en el nivel 0
La llave es el nombre del identificador
Verificación de tipos (Hash – vector)
o Type checking: verifica que no hayan errores de tipo.
o Statically typed: propiedad básica de un lenguaje, detecta errores de tipo sin ejecutar el programa (estática).
o Sólo aplica a expresiones y operaciones que involucran expresiones.
Clase type
o Se utiliza para representar los tipos de una expresión.
o Implementa el método para determinar si dos instancias son equivalentes (boolean o int).
Algoritmo
o Id entifica mediante una liga o puntero en cada applied ocurrence y hace la declaración de las variables.
o Verifica el tipo que representa un objeto de la clase type.
o Modifica el AST Decorado.
Generación del AST Decorado
o Genera la tabla de identificadores.
o Verifica los tipos de expresiones.
o Valida las expresiones y subexpresiones
Análisis Contextual
Implementación * La clase Checker será el encargada de realizar el análisis contextual
* Debe recibir el árbol AST generado por el parser.
* El árbol debe ser recorrido para validar identificadores.
* Interactúan el scanner y parser.
Cambios requeridos en los nodos del árbol
* Los nodos representan expresiones.
* El nodo VNames contiene el tipo de la variable y indicador para saber si es variable o constante.
* El nodo del AST que representa identificadores (puntero).
Recorrido del árbol para decorarlo
1. El checker (visitante) pasa primero por el nodo Program.
2. El nodo Program llama un método y se pasa a si mismo como parámetro.
3. Dentro el método visitProgram, el visitante puede realizar operaciones.
4. La Operación que realiza el método visitProgram es pasar el visitante a sus nodos hijos.
5. LetCommand llama el método y se pasa a si mismo como parámetro.
6. Dentro el método VisitLetCommand, el visitante puede realizar operaciones.
7. La Operación que realiza el método VisitLetCommand, es pasar el visitante a sus nodos hijos.
Patrón es un diseño utilizado para separar los algoritmos de la estructura que se utiliza.