You are on page 1of 19

Análisis semántico

Tabla de símbolos, chequeo de tipos y representaciones internas

An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p.1

 

¿semántico? La semántica corresponde al significado asociado a las estructuras formales (sintaxis) del lenguaje. An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p.2   .¿Análisis? ...

.. ¿semántico? La semántica corresponde al significado asociado a las estructuras formales (sintaxis) del lenguaje..¿Análisis? . se hace preciso algún análisis adicional.2   . An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p.. Como las gramáticas (E)BNF —además normalmente limitadas a LR o LL— no pueden describir todos los elementos sintácticos del lenguaje.

.¿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.2   ... 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´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p.

3   . Con esta técnica: En el fondo. 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´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p. estamos introduciendo “dependencia del contexto” sobre una gramática independiente del contexto.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.

módulo. campo. función. A qué ámbito pertenece (número) Cuál es su tipo (enlace) Otra información: tamaño. añadiéndose información asociada: Ristra del identificador (¿mayúsculas y minúsculas?) Categoría: variable.4 An´ alisis sem´ atico c 2001 Jos´   . clase. macro. etc. parámetros o campos (enlaces). tipo. ubicación.Tabla de símbolos Va conteniendo un registro por cada identificador definido por el programador (o predefinidos). procedimiento. refencia adelante o no. constante. etiqueta. ámbito que define. valor. parámetro. etc. e Fortes G´ alvez – p.

bloques. módulos.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.   e Fortes G´ alvez – p. espacios de nombres. al menos) el elemento actual a la cabeza de la lista Las ristras (identificadores.5 An´ alisis sem´ atico c 2001 Jos´ . Truco: mover (insertar.. with. herencia. registros. . asociada a pila de ámbitos activos. Compilación separada: ficheros con tablas Su implementación física más eficiente suele ser la de una tabla hash.. Si se da más de una pasada. constantes) pueden ir en lista(s) aparte.

Una buena función hash Si llamamos a los códigos de los caracteres y longitud de la ristra: ¢ ¡ £ ¦ § ¥ ¥ ¨  © ¥ ¢ ¡ la ¢ ¨  ¢   ¥  ! ¦ £  " ©   ¨  Pueden usarse valores de (preferentemente) o (más rápido pero peor distribución) " $  ¨ & ¨ %    ©# An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p.6   ¤ .

. debe generar código para realizar chequeos dinámicos (p. 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. An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p.7   .. consistencia de instrucciones de control).e.. valor dentro de rango). En otros casos.Chequeos de tipos (y otros) Un compilador debe realizar una serie de chequeos estáticos. como chequeos de tipos: Consistencia: unicidad.e. .. no-ciclicidad. u otros (p. existencia.

Cuestiones: Puede ser conveniente construir un árbol/grafo: En caso de equivalencia estructural Para comprobación de no-ciclicidad: type a=b.Definiciones de tipos También llamadas “expresiones de tipos”. b=a. (Descomponer en) subtipos anónimos Referencias adelante o declaraciones de tipos. An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p. en las que el programador desarrolla los componentes de la estructura. necesarias para definiciones recursivas: entrada en tabla provisionalmente “vacía” para tipo base.8   .

AST. ' if(a<3) b=2*a. if-then < := a 3 b * 2 a An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p. para distinguirlo del árbol del análisis según la gramática [parse tree].9   ( . .El árbol sintáctico abstracto (1/2) En inglés (abstract) syntax tree.

10 An´ alisis sem´ atico c 2001 Jos´   . e Fortes G´ alvez – p. 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. Útil para ser “anotado” o “decorado” con atributos en recorridos ulteriores.El árbol sintáctico abstracto (2/2) Representación compacta correspondiente a una gramática sin limitaciones de método de análisis. en sentido amplio. caracterizada por que los nodos interiores son operadores.

y permite desacoplar los diseños de unos y otros. Su optimización (instruccines claras y simples) 2.11   .Representaciones intermedias (1/2) Constituye la frontera entre front-ends y back-ends. Orientadas a: 1. Generar código de distintas máquinas objeto El diseño debe permitir su fácil generación por el analizador semático. An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p.

12   . tales como tuplas de tres direcciones Bajo: máquina próxima al ensamblador. bytecode). con un amplio número de registros Algunos compiladores pasan por varias representaciones de distintos niveles de abstracción. con correspondencia con las estructuras del lenguaje Medio: instrucciones de máquina virtual (a veces realmente implementada: P-code. An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p.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.

.Cuádruplas Operaciones con hasta tres direcciones... .. C C G F H BA A BA E 2 2 A F   ! Podemos entenderlas como una linealización de un cierto tipo de árbol abstracto. An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p. que pueden ser variables del programa o temporales: 0) 2 1 Ó 0) 7 6 ¨ 3 ó 4 ) 1 5 0 @  0) 2 3 0) ¨ 4 5 ó 9 8  1 3 ¨ ¨ ó A ¨ 3 3 2 8  9 ) 1  @ .13   D ¤ .

:= := if > goto L4: ..Ejemplo de cuádruplas .. if = goto := + goto L5: ... An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p..b do .....14   . endfor. i a t8 b i t8 L5 i t8 L5 i i 1 L4 for i in a.

) y del s.   e Fortes G´ alvez – p.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.o..15 An´ alisis sem´ atico c 2001 Jos´ . Permite aprovechar la optimización de un buen compilador de C/C++ Independencia de la máquina objeto (o casi: tamaños de referencias. 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++. E/S.. p. .

. 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). parámetros. incluyendo las auxiliares como enlaces. el optimizador las podrá eliminar en su caso Una union de vectores de tipos básicos contendrá las variables de cada ámbito. Si áreas locales englobadas: gestionar pila de punteros usando enlaces estáticos o display e Fortes G´ alvez – p. .16 An´ alisis sem´ atico c 2001 Jos´   .“Cuádruplas” en C/C++ Sólo instrucciones elementales de hasta 3 “direcciones”..

An´ alisis sem´ atico c 2001 Jos´ e Fortes G´ alvez – p. para la prática de generación de código.17   .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. “cuádruplas” en C/C++. Se valorarán especialmente aportaciones adicionales.