Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas Análisis semático c 2001 José Fortes Gálvez p.1
Análisis?... semántico? La semántica corresponde al significado asociado a las estructuras formales (sintaxis) del lenguaje. Análisis semático c 2001 José Fortes Gálvez p.2
Análisis?... semántico? La semántica corresponde al significado asociado a las estructuras formales (sintaxis) del lenguaje. Como las gramáticas (E)BNF además normalmente limitadas a LR o LL no pueden describir todos los elementos sintácticos del lenguaje, se hace preciso algún análisis adicional... Análisis semático c 2001 José Fortes Gálvez p.2
Análisis?... semántico? La semántica corresponde al significado asociado a las estructuras formales (sintaxis) del lenguaje. Como las gramáticas (E)BNF además normalmente limitadas a LR o LL no pueden describir todos los elementos sintácticos del lenguaje, se hace preciso algún análisis adicional... Así, se denomina tradicionalmente análisis semántico a todo aquello que forma parte del front end más allá de lo que la gramática utilizada nos permite: Tabla de símbolos Chequeos de tipos (y otros) Generación de representaciones internas Análisis semático c 2001 José Fortes Gálvez p.2
Ejemplo de extensión del análisis sintáctico La tabla de símbolos permite que el analizador léxico devuelva un token distinto según la categoría del identificador en ese contexto. Con esta técnica: En el fondo, estamos introduciendo dependencia del contexto sobre una gramática independiente del contexto. Por tanto, aumentamos la potencia del análisis sintáctico Podemos resolver algunos conflictos y así evitar modificar la gramática o el lenguaje Análisis semático c 2001 José Fortes Gálvez p.3
Tabla de símbolos Va conteniendo un registro por cada identificador definido por el programador (o predefinidos), añadiéndose información asociada: Ristra del identificador ( mayúsculas y minúsculas?) Categoría: variable, constante, tipo, campo, procedimiento, función, parámetro, clase, etiqueta, módulo, macro, etc. A qué ámbito pertenece (número) Cuál es su tipo (enlace) Otra información: tamaño, ubicación, valor, parámetros o campos (enlaces), refencia adelante o no, ámbito que define, etc. Análisis semático c 2001 José Fortes Gálvez p.4
Estructura de la tabla de símbolos Su estructura lógica viene determinada por: El tipo de ámbito (estático o dinámico) Los mecanismos de ámbito del lenguaje: procedimientos, bloques, herencia, módulos, espacios de nombres, registros, with,... Si se da más de una pasada. Compilación separada: ficheros con tablas Su implementación física más eficiente suele ser la de una tabla hash, asociada a pila de ámbitos activos. Truco: mover (insertar, al menos) el elemento actual a la cabeza de la lista Las ristras (identificadores, constantes) pueden ir en lista(s) aparte. Análisis semático c 2001 José Fortes Gálvez p.5
Una buena función hash Si llamamos a los códigos de los caracteres y longitud de la ristra: la Pueden usarse valores de (más rápido pero peor distribución) (preferentemente) o Análisis semático c 2001 José Fortes Gálvez p.6
Chequeos de tipos (y otros) Un compilador debe realizar una serie de chequeos estáticos, como chequeos de tipos: Consistencia: unicidad, existencia, no-ciclicidad,... Equivalencia y compatibilidad de tipos Conversión explícita [cast] o forzada [coercion] Inferencia de tipos (en valores) Sobrecarga de funciones y operadores Funciones polimórficas, u otros (p.e., consistencia de instrucciones de control). En otros casos, debe generar código para realizar chequeos dinámicos (p.e., valor dentro de rango). Análisis semático c 2001 José Fortes Gálvez p.7
Definiciones de tipos También llamadas expresiones de tipos, en las que el programador desarrolla los componentes de la estructura. Cuestiones: Puede ser conveniente construir un árbol/grafo: En caso de equivalencia estructural Para comprobación de no-ciclicidad: type a=b; b=a; (Descomponer en) subtipos anónimos Referencias adelante o declaraciones de tipos, necesarias para definiciones recursivas: entrada en tabla provisionalmente vacía para tipo base. Análisis semático c 2001 José Fortes Gálvez p.8
El árbol sintáctico abstracto (1/2) En inglés (abstract) syntax tree, AST, para distinguirlo del árbol del análisis según la gramática [parse tree]. if(a<3) if-then b=2*a; ; < := a 3 b * 2 a Análisis semático c 2001 José Fortes Gálvez p.9
El árbol sintáctico abstracto (2/2) Representación compacta correspondiente a una gramática sin limitaciones de método de análisis, caracterizada por que los nodos interiores son operadores, en sentido amplio. Útil para ser anotado o decorado con atributos en recorridos ulteriores, y a partir de ahí: Realizar chequeos Generar código (intermedio) Con frecuencia se puede simular su recorrido (sin construirlo) durante el análisis sintáctico. Análisis semático c 2001 José Fortes Gálvez p.10
Representaciones intermedias (1/2) Constituye la frontera entre front-ends y back-ends, y permite desacoplar los diseños de unos y otros. Orientadas a: 1. Su optimización (instruccines claras y simples) 2. Generar código de distintas máquinas objeto El diseño debe permitir su fácil generación por el analizador semático. Análisis semático c 2001 José Fortes Gálvez p.11
Representaciones intermedias (2/2) Podemos clasificarlas por su nivel de abstracción (distancia a la máquina objeto real): Alto: próxima al árbol abstracto, con correspondencia con las estructuras del lenguaje Medio: instrucciones de máquina virtual (a veces realmente implementada: P-code, bytecode), tales como tuplas de tres direcciones Bajo: máquina próxima al ensamblador, con un amplio número de registros Algunos compiladores pasan por varias representaciones de distintos niveles de abstracción. Análisis semático c 2001 José Fortes Gálvez p.12
!!! " # "!! ( ' & ( ' & % $ ) -, Cuádruplas Operaciones con hasta tres direcciones, que pueden ser variables del programa o temporales: Ó ó,..., + ) )* ó # ó + ) )*,..0/ Podemos entenderlas como una linealización de un cierto tipo de árbol abstracto. Análisis semático c 2001 José Fortes Gálvez p.13
Ejemplo de cuádruplas for i in a..b do... endfor;... := i a := t8 b if > goto i t8 L5 L4:... if = goto i t8 L5 := + i i 1 goto L4 L5:... Análisis semático c 2001 José Fortes Gálvez p.14
C/C++ como lenguaje objeto Generar cuádruplas en C/C++ aporta ventajas: Nos ahorramos programar (al menos inicialmente) la generación de código objeto real Permite descargar en C/C++ la mayor parte de la gestión de pila, heap, E/S,... Permite aprovechar la optimización de un buen compilador de C/C++ Independencia de la máquina objeto (o casi: tamaños de referencias, p.e.) y del s.o. con los inconvenientes de que la eficiencia de los ejecutables no será óptima y de estar sujetos a las limitaciones del compilador de C/C++. Análisis semático c 2001 José Fortes Gálvez p.15
Cuádruplas en C/C++ Sólo instrucciones elementales de hasta 3 direcciones. Posible implementación para lenguajes imperativos: Una función void C/C++ por cada rutina del lenguaje fuente Se crean localmente variables temporales conforme se necesitan (C++ más práctico); el optimizador las podrá eliminar en su caso Una union de vectores de tipos básicos contendrá las variables de cada ámbito, incluyendo las auxiliares como enlaces, parámetros,... Si áreas locales englobadas: gestionar pila de punteros usando enlaces estáticos o display Análisis semático c 2001 José Fortes Gálvez p.16
Conclusión Elementos mínimos para la práctica de análisis semántico: Implementar una tabla de símbolos (no es necesario que sea hash) Implementar al menos parte del chequeo de tipos del lenguaje Como mínimo, para la prática de generación de código, cuádruplas en C/C++. Se valorarán especialmente aportaciones adicionales. Análisis semático c 2001 José Fortes Gálvez p.17