Análisis semántico
Tabla de símbolos, chequeo de tipos y
     representaciones internas




                            An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.1
                              a          a                     e         a
¿Análisis? ... ¿semántico?
 La semántica corresponde al significado asociado a las
 estructuras formales (sintaxis) del lenguaje.




                                       An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.2
                                         a          a                     e         a
¿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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.2
                                          a          a                     e         a
¿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 frontal [front-end]
 más allá de lo que la gramática utilizada nos permite:




                                        An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.2
                                          a          a                     e         a
¿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 frontal [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 representación interna
                                        An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.2
                                          a          a                     e         a
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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.3
                                         a          a                     e         a
Tabla(s) de símbolos
 Va conteniendo un registro por cada identificador
 definido/declarado por el programador, 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 (profundidad)
      Otra información según categoría: tamaño;
      ubicación; valor; enlaces a tipo, parámetros o
      campos (enlaces); si parcialmente definido; etc.

                                       An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.4
                                         a          a                     e         a
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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.5
                                               a          a                     e         a
Una buena función hash
 Si llamamos ci a los códigos de los caracteres y n la
 longitud de la ristra:
                h0 = 0
                hi = khi−1 + ci
                H = (hn mod 230 ) mod 1008

 Pueden usarse valores de k = 613 (preferentemente) o
 k = 4 (más rápido pero peor distribución)




                                         An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.6
                                           a          a                     e         a
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 che-
 queos dinámicos (p.e., valor dentro de rango).
                                         An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.7
                                           a          a                     e         a
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) tipos anónimos
 Las definiciones incompletas (declaraciones) son necesa-
 rias para definiciones recursivas: entrada en tabla provi-
 sionalmente “vacía” para tipo base.
                                        An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.8
                                          a          a                     e         a
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) {b=2*a;};
                              if-then



                          <             :=


                        a 3         b        *


                                        2 a
                                                  An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.9
                                                    a          a                     e         a
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 cons-
 truirlo) durante el análisis sintáctico.

                                        An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.10
                                          a          a                     e         a
Representaciones internas (1/2)
 Intermedias entre frontal [front-end] y dorsal [back-end],
 permiten desacoplar los diseños de unos y otros.
 Orientadas a:
      Su optimización (instrucciones claras y simples)
      Generar código de distintas máquinas objeto
 El diseño debe permitir su fácil generación por el analiza-
 dor semático.




                                         An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.11
                                           a          a                     e         a
Representaciones internas (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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.12
                                         a          a                     e         a
Cuádruplas
Operaciones con hasta tres direcciones, que pueden ser
variables del programa o temporales:
     x := y op z
    Ó x := op z ó x := z
    x := y[z] ó x[y] := z
    if x op y goto L ó goto L
    param x1 , ..., param xn , call p(n)
Podemos entenderlas como una linealización de un cierto
tipo de árbol abstracto.

                                           An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.13
                                             a          a                     e         a
Ejemplo de cuádruplas
                            ...
                            :=         i a
                            :=        t8 b
 for i in a..b do        if >goto      i t8 L5
 ...                L4:     ...
 endfor;                if = goto      i t8 L5
                           := +        i i 1
                           goto       L4
                    L5:     ...




                                    An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.14
                                      a          a                     e         a
C/C++ como lenguaje objeto
 Generar C/C++ en lugar de bajo nivel 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 ejecu-
 tables no será óptima y de estar sujetos a las limitaciones
 del compilador de C/C++.                An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.15
                                           a          a                     e         a
Generación de C/C++
 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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.16
                                         a          a                     e         a
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




                                      An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.17
                                        a          a                     e         a

Tr asem-ver

  • 1.
    Análisis semántico Tabla desímbolos, chequeo de tipos y representaciones internas An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.1 a a e a
  • 2.
    ¿Análisis? ... ¿semántico? La semántica corresponde al significado asociado a las estructuras formales (sintaxis) del lenguaje. An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.2 a a e a
  • 3.
    ¿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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.2 a a e a
  • 4.
    ¿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 frontal [front-end] más allá de lo que la gramática utilizada nos permite: An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.2 a a e a
  • 5.
    ¿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 frontal [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 representación interna An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.2 a a e a
  • 6.
    Ejemplo de extensión delaná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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.3 a a e a
  • 7.
    Tabla(s) de símbolos Va conteniendo un registro por cada identificador definido/declarado por el programador, 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 (profundidad) Otra información según categoría: tamaño; ubicación; valor; enlaces a tipo, parámetros o campos (enlaces); si parcialmente definido; etc. An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.4 a a e a
  • 8.
    Estructura de latabla 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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.5 a a e a
  • 9.
    Una buena funciónhash Si llamamos ci a los códigos de los caracteres y n la longitud de la ristra: h0 = 0 hi = khi−1 + ci H = (hn mod 230 ) mod 1008 Pueden usarse valores de k = 613 (preferentemente) o k = 4 (más rápido pero peor distribución) An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.6 a a e a
  • 10.
    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 che- queos dinámicos (p.e., valor dentro de rango). An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.7 a a e a
  • 11.
    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) tipos anónimos Las definiciones incompletas (declaraciones) son necesa- rias para definiciones recursivas: entrada en tabla provi- sionalmente “vacía” para tipo base. An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.8 a a e a
  • 12.
    El árbol sintácticoabstracto (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) {b=2*a;}; if-then < := a 3 b * 2 a An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.9 a a e a
  • 13.
    El árbol sintácticoabstracto (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 cons- truirlo) durante el análisis sintáctico. An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.10 a a e a
  • 14.
    Representaciones internas (1/2) Intermedias entre frontal [front-end] y dorsal [back-end], permiten desacoplar los diseños de unos y otros. Orientadas a: Su optimización (instrucciones claras y simples) Generar código de distintas máquinas objeto El diseño debe permitir su fácil generación por el analiza- dor semático. An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.11 a a e a
  • 15.
    Representaciones internas (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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.12 a a e a
  • 16.
    Cuádruplas Operaciones con hastatres direcciones, que pueden ser variables del programa o temporales: x := y op z Ó x := op z ó x := z x := y[z] ó x[y] := z if x op y goto L ó goto L param x1 , ..., param xn , call p(n) Podemos entenderlas como una linealización de un cierto tipo de árbol abstracto. An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.13 a a e a
  • 17.
    Ejemplo de cuádruplas ... := i a := t8 b for i in a..b do if >goto i t8 L5 ... L4: ... endfor; if = goto i t8 L5 := + i i 1 goto L4 L5: ... An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.14 a a e a
  • 18.
    C/C++ como lenguajeobjeto Generar C/C++ en lugar de bajo nivel 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 ejecu- tables no será óptima y de estar sujetos a las limitaciones del compilador de C/C++. An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.15 a a e a
  • 19.
    Generación de C/C++ 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 v1.1 c 2005 Jos´ Fortes G´ lvez– p.16 a a e a
  • 20.
    Conclusión Elementos mínimospara 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 An´ lisis sem´ tico v1.1 c 2005 Jos´ Fortes G´ lvez– p.17 a a e a